Salutare,
Numele meu este Bogdan , ma ocup de administrarea unui magazin online, site-ul este scris de la zero in php/sql/html/javascript, nu uitilizeaza o platforma cms cunoscuta.
Intampin o mare problema intrucat exista un user care reuseste sa lanseze o comanda fara sa fie inregistrat, in tabela in care sunt salvate comenzile exista o coloana cu userul care a creat comanda, aceasta valoare este preluata automat din tabela in care sunt salvati userii. problema este ca valoarea pentru userul respectiv este 0 , el practic nu este intregistrat pe site (coloana id din tabela useri este auto increment si nu exista user cu valoarea 0 inregistrat).
Am verificat toate fisierele php ce sunt apelate in momentul lansarii unei comenzi si nici un fisiere nu poate fi executat fara sa fie inregistrat.
Va rog sa ma ajutati cu cateva indicii sau verificari pe care le-as putea face pe site in vederea remedierii acestei erori.
Va multumesc!
Trimitere comanda fara inregistrare.
Moderatori: Zamolxe, Moderatori
-
toxicristi
- PHPRomania Supporter
- Mesaje: 26
- Membru din: Vin Apr 26, 2013 6:10 pm
Re: Trimitere comanda fara inregistrare.
Cel mai simplu ar fi ca in phpMyAdmin sau alt soft de administrare mysql sa setezi un constraint foreign key pe coloana 'UserID' din tabelul de comenzi cu referinta la coloana 'ID' din tabelul useri.
Asta va limita ID-urile din coloana UserID la un id de user existent, iar cand cineva incearca sa creeze o comanda fara sa fie autentificat va primi o eroare.
Dar sigur scriptul nu functioneaza corect, din moment ce cineva reuseste sa creeze o comanda nefiind autentificat.
Asta va limita ID-urile din coloana UserID la un id de user existent, iar cand cineva incearca sa creeze o comanda fara sa fie autentificat va primi o eroare.
Cod: Selectaţi tot
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (UserID)
REFERENCES users (UserID) ;Dar sigur scriptul nu functioneaza corect, din moment ce cineva reuseste sa creeze o comanda nefiind autentificat.
Ultima oară modificat Lun Mai 13, 2013 3:48 pm de către toxicristi, modificat de 2 ori în total.
- Birkoff
- Senior Member
- Mesaje: 6380
- Membru din: Joi Mar 18, 2004 2:34 pm
- Localitate: Bucuresti
- Contact:
Re: Trimitere comanda fara inregistrare.
testeaza daca poti in felul urmator:
- pagina care salveaza comanda in bd primeste datele dintr-un formular
- copiezi formularul (doar codul html -> view source din browser) intr-o pagina noua sa zicem comanda.html
- modifici la acest formular form action="calea catre scriptul care salveaza comanda de la tine de pe server"
- salvezi comanda.html pe un alt server (de exemplu pe pc-ul local unde faci teste)
- deschizi comanda.html in browser si dai send -> datele ar trebui sa se duca pe server si acolo daca nu sunt verificarile bine facute ar trebui sa vezi comanda in baza de date cu user 0
in functie de erorile sau mesajele care iti apar cand dai send iti pot zice daca de acolo e buba sau din alta parte...
(ideea e ca formularul de comanda sa fie separat de restul site-ului si sa incerci sa trimiti date la site-ul tau din exterior sa vezi ce se intampla)
- pagina care salveaza comanda in bd primeste datele dintr-un formular
- copiezi formularul (doar codul html -> view source din browser) intr-o pagina noua sa zicem comanda.html
- modifici la acest formular form action="calea catre scriptul care salveaza comanda de la tine de pe server"
- salvezi comanda.html pe un alt server (de exemplu pe pc-ul local unde faci teste)
- deschizi comanda.html in browser si dai send -> datele ar trebui sa se duca pe server si acolo daca nu sunt verificarile bine facute ar trebui sa vezi comanda in baza de date cu user 0
in functie de erorile sau mesajele care iti apar cand dai send iti pot zice daca de acolo e buba sau din alta parte...
(ideea e ca formularul de comanda sa fie separat de restul site-ului si sa incerci sa trimiti date la site-ul tau din exterior sa vezi ce se intampla)
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.
-
toxicristi
- PHPRomania Supporter
- Mesaje: 26
- Membru din: Vin Apr 26, 2013 6:10 pm
Re: Trimitere comanda fara inregistrare.
Inainte de a urma pasii scrisi de birkoff, nu uita sa dai logout. Altfel comanda se va executa cu userul autentificat in browserul tau, chiar daca formularul e pe alt server.
Re: Trimitere comanda fara inregistrare.
Eu cred ca problema pleaca de la modul in care testezi daca userul este logat
Scenariu:
initializezi sesiunea userului pentru a disparea eventualele atentionari
iar verificarea o faci cu is_numeric care la '' nu returneaza FALSE
iar 0 apare ca "bla bla bla" coloanele int au nevoie de val numerica
Scenariu:
initializezi sesiunea userului pentru a disparea eventualele atentionari
iar verificarea o faci cu is_numeric care la '' nu returneaza FALSE
iar 0 apare ca "bla bla bla" coloanele int au nevoie de val numerica
Nu mai fi chel http://www.caderea-parului.ro
-
Pirahna
- Senior Member
- Mesaje: 5985
- Membru din: Dum Aug 22, 2004 2:04 am
- Localitate: la birou
- Contact:
Re: Trimitere comanda fara inregistrare.
Pune-i un if la campul respectiv, verifica folosind is_numeric(), vezi daca valoarea > 0 si poate ii aplici si un (int) inainte sa te asiguri ca nu introduci ceva cu virgula.
Sau aplici metoda cu constraint, mult mai eleganta, propusa de toxicristi.
Sau aplici metoda cu constraint, mult mai eleganta, propusa de toxicristi.
Re: Trimitere comanda fara inregistrare.
Vin si eu cu o intrebare, pe langa celelalte sugestii date mai sus. Trimiti cumva user_id-ul prin formular? sau il ai in $_SESSION sau alta variabila server-side?
Si inca ceva ... vezi sa nu ai o vulnerabilitate la SQL-Injection ca ar putea fi mult mai rau decat ca iti face cineva comanda aiurea.
Si inca ceva ... vezi sa nu ai o vulnerabilitate la SQL-Injection ca ar putea fi mult mai rau decat ca iti face cineva comanda aiurea.
Re: Trimitere comanda fara inregistrare.
Va multumesc foarte mult pentru ajutorul oferit , este pentru prima data cand postez pe acest forum si am fost placut surprins de numarul de raspunsuri pe care l-am primit.
Problema am rezolvat-o, am efectuat testul pe care mi l-a recomandat Birkoff si de acolo era problema. Exista un form in pagina ce afiseaza produsele adaugate in cosul de cumparatiri si prin acest form sunt transmise datele catre pagina de confirmare a comanzii unde erau inserate in tebele. Am pus un " if ( mysql_num_rows($q) >= 1 ) " in aceasta pagina pentu a verifica daca userul este inregistrat , exista doar un ""if ( isset($_POST['trimite']) ) " si in aceste conditii userul putea transmite date printr-un form direct catre aceea pagina fara sa fie inregistrat.
@ViezuREX - user_id nu este trnsmis printr-un form , este intregistrat in tabela cu useri de unde era si preluat pentru a fi introdus in tabela de comenzi, datele transmise prin form sunt securizate cu "strip_tags(mysql_real_escape_string(trim($_POST['continut'])))".
Problema am rezolvat-o, am efectuat testul pe care mi l-a recomandat Birkoff si de acolo era problema. Exista un form in pagina ce afiseaza produsele adaugate in cosul de cumparatiri si prin acest form sunt transmise datele catre pagina de confirmare a comanzii unde erau inserate in tebele. Am pus un " if ( mysql_num_rows($q) >= 1 ) " in aceasta pagina pentu a verifica daca userul este inregistrat , exista doar un ""if ( isset($_POST['trimite']) ) " si in aceste conditii userul putea transmite date printr-un form direct catre aceea pagina fara sa fie inregistrat.
@ViezuREX - user_id nu este trnsmis printr-un form , este intregistrat in tabela cu useri de unde era si preluat pentru a fi introdus in tabela de comenzi, datele transmise prin form sunt securizate cu "strip_tags(mysql_real_escape_string(trim($_POST['continut'])))".
Cine este conectat
Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 4 vizitatori