protecție inteligentă de la sql-injecție - overflow stivă în limba rusă

Am fost mult timp chinuit de întrebarea: Cum de a proteja site-ul dvs. SQL-injectare. Pe vremuri am folosit string_escape mysql_real pentru screening-ul citate. Dar a luat ceva timp, și am aflat despre DOP. Se spune, spun ei, acest subiect este bun ajutor în protejarea site-ului. Să presupunem că nu sunt un hacker mare, și aceasta nu poate verifica, eu știu că atunci când mysql_real string_escape toate citatele si chestii ecranate - și Voila, ești în casă.

Sunt lucrează în prezent la proiectul meu și a decis să verificați site-ul pentru a proteja penetrarea. Ca urmare a ceea ce am făcut:

Tocmai am luat-o și au introdus date cu ghilimele, de exemplu, Infor`mat'ion. Așa cum am spus, eu nu sunt un hacker mare, dar eu știu că toate prostiile astea ar trebui să fie verificate, dar a intrat într-o bază de date pe care mi-a dat ideea că nu am nici o protecție, de fapt, nr. Și am înregistrat datele în acest fel:

Această metodă am citit Habré în „De ce ar trebui să folosim DOP pentru a lucra cu baza de date.“ Conexiunea este același ca cel menționat în articol.

Cum se poate proteja-te de aceste injecții?

set 22 ianuarie '15 la 18:57

Concluzia ați făcut greșit, și va judeca toate problemele. dar eu știu că toate prostiile astea ar trebui să fie verificate, dar a intrat într-o bază de date. Chestia asta ekranilovalas că sa înscris în baza de date în modul în care nu există nici un efect asupra executării cererii, inclusiv, fără a schimba comportamentul, astfel protisoyav injecție SQL. Ie screening-ul facut treaba, exact ce a intrat utilizatorul în baza de date a luat. Acum, în cazul în care cererea Vashj rupt, ar fi foarte rău pentru a permite introducerea textului de o bucată de SQL, executa. - Vitalts 21 decembrie '15 la 07:44

Dacă utilizați declarații pregătite (declaratie) parametrii de origine externă sunt trimise la server separat de cererea sau automat protejate de către biblioteca de client.

Creați un tabel drop_table. mai departe

Tabelul drop_table șters cu succes. )

Acum, aceeași interogare, dar numai printr-o declarație pregătită:

În tabelul de test, adăugați un rău înregistrare „); DROP drop_table TABLE; -

Astfel, trebuie să vă protejați de injecție SQL. dar nici o protecție împotriva XSS.

În acest ultim caz, este necesar:

Dacă, din anumite motive pe care doriți să stocați în HTML bază de date dintr-o sursă care nu este credibil, este posibil să se utilizeze HTML purificator.

Asta-i drept: în tabel, și ar trebui să fie adăugat la linia de «Infor`mat'ion». Screening-ul ar trebui să aibă loc exact la momentul interogării, mai degrabă decât stocate în această formă. Și DOP bine face cu ea. Și mysql_real_escape_string (și mysqli_real_escape_string) - de asemenea. Și chiar str_replace - aceasta este, de asemenea, o modalitate de a se proteja (A se vedea UPD.) Deci, noi, care ne dă DOP, așa că urmărește tipurile de date transmise și distincția dintre acțiune și date .. eroare populare care a dus la rezultate slabe a fost faptul că unii oameni uita sa verifice tipul non-string:

Sau doar procesa întotdeauna datele de intrare ca urmare a citat, de posibilitatea de a prezenta un număr de reprezentări bool -data. Sau pur și simplu a pus învelișul finit, de exemplu, DOP. )

mysqli_real_escape_string (probabil), mysql_real_escape_string. și chiar mai mult str_replace - nesigure (\ xbf \ X27 și alte probleme), folosind MySQL interogări numai în modul antrenat-prezent! DOP trebuie să fie utilizate în mod corespunzător (mulțumiri @romeo pentru link-ul).

@romeo, vă mulțumesc pentru lectură, am venit recent peste o eroare, care a fost rezultatul emulație, și nu a putut înțelege ce se întâmplă: $ STMT = $ pdo-> pregăti ( „SELECT user_id de la utilizatori LIMIT: limită“); $ Stmt-> bindValue ( 'limită', 10); $ Stmt-> execute (); / *. verificați manualul care corespunde versiunii serverului MySQL pentru sintaxa dreptul de a utiliza în apropierea „“ 10 „“ * / am ghicit despre tipul (ceea ce face ORM, astfel încât sistemul meu este permis): $ stmt-> bindValue ( „limită“ 10, PDO :: PARAM_INT); Dar acum știu cauza principală a problemei, vă mulțumesc. - Baruri 24 '15 ianuarie, la 15:18