Cum se validează datele primite

Filtrarea pe partea utilizatorului estesecuritatea cea mai importantă componentă a oricărei aplicații web. Astăzi aș dori să vă spun care sunt componentele principale, după părerea mea, care ar trebui să includăprocesarea corectă a datelor primite. Prima și cea mai importantă regulă este că tot ceea ce vine de la utilizator sau poate fi schimbat în orice fel de către acesta trebuie să fie supus verificării obligatorii pe parteaserver. Cu toate acestea, metoda preferată de aplicare a addslashes() la toate elementele matricelorGET,POST șiCookie nu este complet sigură. Un exemplu de astfel de cod:

Faptul este că, dacă există o variabilă în orice interogare pe care o putem modifica și este luată fără ghilimele, atunci nici măcar scăparea de ghilimele nu va ajuta:

În ciuda magic_quotes_gpc inclus, o astfel de interogare este supusă injecției SQL, deoarece nu trebuie să închidem nicio ghilimele suplimentare, iar atunci când implementăm injecția, nu avem nevoie de ghilimele deloc. Astfel, toate valorile care participă la condițiile de după UNDE trebuie incluse între ghilimele.

Este o bună practică să codificați în siguranță prin pre-inițializarea variabilelor care vor fi umplute cu date provenite de la utilizator. Unii dezvoltatori folosesc funcțiile extract() și import_request_variables() fără să se gândească să împingă elementele și valorile lor din $_GET, $_POST și $_COOKIE în matricea superglobală $GLOBALS, ceea ce duce la inițializarea și suprascrierea arbitrară a variabilelor inițializate anterior. Uitați de $GLOBALS și de opțiunea register_globals! În PHP6, acest lucru nu va mai fi și nu vom mai vedea variabile „fără resursă”, deoarece acestea sunt rămășițe ale celei de-a treia ere PHP. Fiecare script trebuie să știela ce exact variabilele primiteprimește șide unde vin.

Toate funcționalitățile responsabile cu importarea variabilelor din matrice GPC și procesarea valorilor acestora trebuie să fie implementate într-o funcție specifică. Să-l numim import_var() de exemplu. Primul argument al acestei funcții este numele variabilei (una sau mai multe). Trebuie să fie o matrice, deoarece dezvoltatorul trebuie să poată inițializa mai multe variabile de același tip simultan. Al doilea argument este numele matricei din care va fi importată această variabilă. Puteți folosi primele litere - G, P și C. A treia este tipul acestei variabile. În funcție de domeniul de aplicare al variabilelor, pot exista mai multe tipuri:

Pentru fiecare tip de variabilă trebuie furnizată o metodă de filtrare separată. De exemplu, pentru NUM - aceasta este o verificare folosind funcția is_numeric, pentru INT - is_numeric și is_float, pentru MAIL - o verificare care utilizează o expresie regulată etc.

Al patrulea argument este lungimea maximă a valorii. Este necesar un argument separat în acest scop, deoarece valorile șirurilor pot avea lungimi diferite. Deci prototipul nostru de funcție va arăta astfel:

import_var((matrice)$nume,(șir)$sursă,(șir)$tip,(int)maxlen=0)

Am dat peste un exemplu de astfel de funcție în Seditio CMS, totuși, înainte de versiunea 121, aceasta nu era implementată în cel mai bun mod, deoarece procesa incorect matrice, ceea ce m-a determinat să descopăr o vulnerabilitate în acest motor.