Noțiuni de bază cu PHP

Securitatea datelor este importantă și deseori subevaluată de designeri, dezvoltatori și clienți. De la PHP 5.2.0, sanitizarea datelor și validarea au fost făcute mult mai ușor prin introducerea de filtrare a datelor. Astăzi, vom examina mai îndeaproape aceste filtre, cum să le folosim și vom construi câteva funcții personalizate.

Detalii tutoriale

  • Program: PHP
  • Versiune: 5.2.0+
  • Dificultate: Începător
  • Durata estimată de finalizare: 20 de minute

Introducere

Mereu am simțit că este ușor să scriu cod în PHP și chiar mai ușor să scriu codul rău în PHP. Proliferarea PHP-ului pe web a fost într-adevăr ajutată de utilizarea sa în pachete de software populare de tip open-source cum ar fi WordPress, Drupal și Magento, precum și aplicații web majore precum Facebook; PHP fiind folosit în atâtea exemple variate (site-uri dinamice, aplicații web în profunzime, platforme de blogging, sisteme de gestionare a conținutului și e-commerce fiind doar un subset din multe aplicații ale PHP) oportunitățile murdar datele și sistemele nesigure sunt numeroase. Acest tutorial va explica câteva metode de Curățenie cu PHP: Sanitizarea și validarea datelor prin focalizarea pe mai multe forme diferite de intrări de date și despre modul de utilizare a filtrelor PHP și a funcțiilor personalizate.

De ce sanitizați și validați?

În acest tutorial, ne concentrăm cu adevărat asupra datelor introduse de utilizatori sau surse externe. Aceasta înseamnă că nu controlăm datele pe care le primim. Tot ce putem face este să controleze ceea ce se face cu el după ce îl primim. Există tot felul de amenințări legate de securitatea datelor din intrările utilizatorilor și din datele terților.

niste ONU-amenințări populare privind securitatea datelor:

  • Cross-Site Scripting (XSS): O formă de injectare a codului în care un script este injectat pe un site de pe un site complet diferit. Aceasta este de departe cea mai comună vulnerabilitate de securitate online. Două exemple recente, foarte proeminente ale acestei tehnici sunt Stalk Daily și Mikeyy Twitter Worms de la începutul acestui an care au folosit inputuri prost dezinfectate pentru a lansa Javascript printr-o interfață web "infectată" Twitter.
  • Injecție SQL: A doua vulnerabilitate de securitate cea mai frecventă pe Internet, aceasta este o altă formă de injectare a codului în care un script este folosit pentru a participa la unul dintre numeroasele comportamente exploatatoare, inclusiv (dar fără a se limita la) expunerea și / sau obținerea accesului neautorizat la date, a unei baze de date sau pur și simplu de injectare a codului care urmează să fie redat sau executat în cadrul unui site web, prin urmare, ruperea sau modificarea site-ului web.
  • Solicitarea falsă a site-ului (CSRF / XSRF): Un exploatare mai puțin frecventă, care se bazează mai mult pe surse de date, cum ar fi cookie-urile de browser și de sesiune, decât datele de intrare a datelor dezavantajate și validate, CSRF (pronunțat "Sea-surf") poate fi folosit pentru a executa comenzi pe un site fără permisiunea utilizatorului. O metodă populară a CSRF utilizează un URI de date imagine sau o valoare src pentru a executa un script în loc să afișeze o imagine.
  • Date necorespunzătoare: Nu este într-adevăr o "vulnerabilitate de securitate" în sine, datele necorespunzătoare pot cauza gazde de probleme pentru un proprietar de site sau pentru administratorul bazei de date. Adesea, datele necorespunzătoare pot duce la ruperea site-urilor slab codificate sau la provocarea unor accidente automate. Un exemplu în acest sens a fost capacitatea de a modifica paginile întregului profil MySpace prin postarea folosind tot felul de hackery HTML / CSS (Notă: acest lucru poate funcționa, nu am folosit MySpace mult timp).
Sursa imaginii: XKCD

Pentru scopurile noastre, ne vom concentra doar pe metodele serverului de îmbunătățire a securității datelor cu PHP, așa că să vedem cum sunt definiți termenii "sanitizare" și "validare" în relație cu PHP. Conform manualului PHP:

Validarea este utilizată pentru a valida sau verifica dacă datele îndeplinesc anumite calificări. De exemplu, trecerea în FILTER_VALIDATE_EMAIL va determina dacă datele sunt o adresă de e-mail validă, dar nu vor schimba datele în sine.

Sanitizarea va dezinfecta datele, deci ar putea să le modifice eliminând caracterele nedorite. De exemplu, trecerea în FILTER_SANITIZE_EMAIL va elimina caracterele nepotrivite pentru a conține o adresă de e-mail. Acestea fiind spuse, nu validează datele.

În esență, dacă site-ul dvs. este clubul de noapte la care toată lumea dorește să intre, validarea verifică lista clienților și ID-urile de la ușă, în timp ce dezinfecția acționează ca un bouncer care aruncă orice nedorite care se întâmplă să curețe trecutul. Având în vedere acest lucru, să aruncăm o privire la PHP Filters Extension.

Ce filtre am eu?

Toate instalările PHP nu sunt create egale. În timp ce PHP 5.2.0 a fost introducerea de filtre, nu toate instalațiile au același set de filtre în filtrul Extensie. Majoritatea instalărilor vor avea toate filtrele pe care le vom trece, dar pentru a vă învăța puțin despre Extensia filtrelor, vom afla exact ce aveți pe serverul dvs. În descărcarea sursei, am inclus un fișier numit getfilters.php că, odată instalat și rulat pe serverul dvs., va afișa toate filtrele dvs. (ambele filtre de date disponibile prin filter_var funcții și fluxuri disponibile prin intermediul stream_filter_append).

 ecou "

Filtre de date

\ n\ n\ n "; echo"\ n "; echo"\ n"foreach (filter_list () ca $ id => $ filtru) echo"\ n "; echo"
ID-ul filtruluiNumele filtru
filtru $".Filter_id (filtru de $)."
\ N ";

În primul rând, obținem matricea care conține lista tuturor filtrelor disponibile filter_list, apoi buclele prin matrice și ecou afară numele filtrului, aflați ID-ul atribuit filtrului și ecou și acest ID.

Cum utilizez un filtru?

Filtrele PHP pentru validare și dezinfectare sunt activate prin trecerea a cel puțin două valori la funcția Extensie filtre PHP filter_var. De exemplu, să folosim filtrul de dezinfectare pentru un număr întreg, cum ar fi:

 Valoare $ = '123abc456def'; echo filter_var (valoarea $, FILTER_SANITIZE_NUMBER_INT);

În exemplu, avem o variabilă valoarea $ care este trecut prin funcția Extensie filtre filter_var folosind FILTER_SANITIZE_NUMBER_INT filtru. Rezultă astfel:

 123456

Filtrul Sanitize pentru un număr întreg elimină toate caracterele non-integer de la ieșire și produce un număr întreg curat. În cadrul codului sursă de descărcare, puteți încerca diverse intrări și va aplica un număr de filtre comune valorii de intrare. Am inclus o serie de șiruri diferite de exemplu pe care le puteți testa și voi.

Ce fac filtrele diferite?

Lista de mai jos nu este completă, dar conține majoritatea filtrelor care vin standard cu instalații de 5.2.0 sau mai multe. Filtrele personalizate și cele adăugate din extensiile personalizate nu sunt incluse aici.

FILTER_VALIDATE_BOOLEAN: Verifică dacă datele trimise către filtru sunt sau nu valori booleene ADEVĂRAT sau FALS. Dacă valoarea este o valoare non-booleană, ea va reveni FALS. Scriptul de mai jos ar echivala cu "TRUE" pentru datele de exemplu $ value01 dar ar econa "FALSE" pentru datele de exemplu $ value02:

 $ value01 = TRUE; dacă (filter_var ($ value01, FILTER_VALIDATE_BOOLEAN)) echo 'TRUE';  altceva echo 'FALSE';  echo '

'$ valoare02 = TRUE; dacă (filter_var ($ value02, FILTER_VALIDATE_BOOLEAN)) echo 'TRUE'; altceva echo 'FALSE';

FILTER_VALIDATE_EMAIL: Verifică dacă datele transmise către filtru sunt sau nu o adresă de e-mail potențial valabilă. Nu verifică dacă adresa de e-mail există, ci doar formatul adresei de e-mail este valabil. Scriptul de mai jos va econa "TRUE" pentru datele de exemplu $ value01 dar ar econa "FALSE" pentru datele de exemplu $ value02 (deoarece cel de-al doilea nu are partea @ domain.tld necesară din adresa de e-mail):

 $ valoare01 = '[email protected]'; dacă (filter_var ($ value01, FILTER_VALIDATE_EMAIL)) echo 'TRUE';  altceva echo 'FALSE';  echo '

'$ valoare02 =' nettuts '; dacă (filter_var ($ value02, FILTER_VALIDATE_EMAIL)) echo 'TRUE'; altceva echo 'FALSE';

FILTER_VALIDATE_FLOAT: Verifică dacă datele transmise filtrului sunt sau nu o valoare valabilă a flotorului. Scriptul de mai jos va econa "TRUE" pentru datele de exemplu $ value01 dar ar econa "FALSE" pentru datele de exemplu $ value02 (deoarece separatoarele de virgulă nu sunt permise în valori flotante):

 $ valoare01 = '1,234'; dacă (filter_var ($ value01, FILTER_VALIDATE_FLOAT)) echo 'TRUE';  altceva echo 'FALSE';  echo '

'$ valoare02 =' 1,234 '; dacă (filter_var ($ value02, FILTER_VALIDATE_FLOAT)) echo 'TRUE'; altceva echo 'FALSE';

FILTER_VALIDATE_INT: Verifică dacă datele transmise filtrului sunt sau nu valori întregi valide. Scriptul de mai jos va econa "TRUE" pentru datele de exemplu $ value01 dar ar econa "FALSE" pentru datele de exemplu $ value02 (deoarece fracțiile / numerele zecimale nu sunt numere întregi):

 $ valoare01 = '123456'; dacă (filter_var ($ value01, FILTER_VALIDATE_INT)) echo 'TRUE';  altceva echo 'FALSE';  echo '

'$ value02 =' 123.456 '; dacă (filter_var ($ value02, FILTER_VALIDATE_INT)) echo 'TRUE'; altceva echo 'FALSE';

FILTER_VALIDATE_IP: Verifică dacă datele transmise către filtru sunt sau nu o adresă IP potențial valabilă. Nu verifică dacă adresa IP s-ar rezolva, doar că se potrivește cu structura de date necesară pentru adresele IP. Scriptul de mai jos va econa "TRUE" pentru datele de exemplu $ value01 dar ar econa "FALSE" pentru datele de exemplu $ value02:

 $ valoare01 = '192.168.0.1'; dacă (filter_var ($ value01, FILTER_VALIDATE_IP)) echo 'TRUE';  altceva echo 'FALSE';  echo '

'$ value02 =' 1.2.3.4.5.6.7.8.9 '; dacă (filter_var ($ value02, FILTER_VALIDATE_IP)) echo 'TRUE'; altceva echo 'FALSE';

FILTER_VALIDATE_URL: Verifică dacă datele transmise către filtru sunt sau nu o adresă URL potențial validă. Nu verifică dacă adresa URL s-ar rezolva, doar că se potrivește cu structura de date necesară pentru adresele URL. Scriptul de mai jos va econa "TRUE" pentru datele de exemplu $ value01 dar ar econa "FALSE" pentru datele de exemplu $ value02:

 $ valoare01 = 'http://net.tutsplus.com'; dacă (filter_var ($ value01, FILTER_VALIDATE_URL)) echo 'TRUE';  altceva echo 'FALSE';  echo '

'$ valoare02 =' nettuts '; dacă (filter_var ($ value02, FILTER_VALIDATE_URL)) echo 'TRUE'; altceva echo 'FALSE';

FILTER_SANITIZE_STRING: În mod implicit, acest filtru elimină orice date dintr-un șir care este nevalid sau nu este permis în acel șir. De exemplu, aceasta va elimina orice etichete HTML, cum ar fi „; echo filter_var (valoarea $, FILTER_SANITIZE_STRING);

Acest script va elimina etichetele și va returna următoarele:

 alertă ("TROUBLE ARE");

FILTER_SANITIZE_ENCODED: Mulți programatori folosesc PHP-urile urlencode () pentru a gestiona codarea URL-urilor acestora. Acest filtru face în mod esențial același lucru. De exemplu, aceasta va codifica orice spații și / sau caractere speciale dintr-un șir de intrări:

 $ value = '„; echo filter_var (valoarea $, FILTER_SANITIZE_ENCODED);

Acest script va codifica punctuația, spațiile și parantezele, apoi returnează următoarele:

 % 3Cscript% 3Ealert% 28% 27TROUBLE% 20HERE% 27% 29% 3B% 3C% 2Fscript% 3E

FILTER_SANITIZE_SPECIAL_CHARS: Acest filtru implicit va codifica caractere speciale precum citate, ampersand și paranteze (în plus față de caracterele cu valoare ASCII mai mică de 32). În timp ce pagina de demo nu o face extrem de clară fără vizualizarea sursei (deoarece caracterele speciale codate HTML vor fi interpretate și redate), dacă aruncați o privire la codul sursă veți vedea codificarea la serviciu:

 $ value = '„; echo filter_var (valoarea $, FILTER_SANITIZE_SPECIAL_CHARS);

Convertește caracterele speciale în sine codificate în HTML:

 

FILTER_SANITIZE_EMAIL: Acest filtru are exact ceea ce s-ar crede. Elimină orice caractere care sunt nevalide în adresele de e-mail (cum ar fi paranteze, paranteze, coloane, etc.). De exemplu, să presupunem că ați adăugat în mod accidental paranteze în jurul unei litere a adresei dvs. de e-mail (nu întrebați cum, utilizați-vă imaginația):

 $ value = 't (e) [email protected]'; echo filter_var (valoarea $, FILTER_SANITIZE_EMAIL);

Elimină parantezele și primești adresa ta frumoasă de e-mail:

 [email protected]

Acesta este un filtru excelent pentru a fi utilizat pe formularele de poștă electronică în colaborare cu FILTER_VALIDATE_EMAIL pentru a reduce erorile utilizatorilor sau pentru a preveni atacurile legate de XSS (deoarece unele atacuri XSS din trecut au implicat returnarea datelor originale furnizate într-un câmp de e-mail nesantificat direct la browser).

FILTER_SANITIZE_URL: Similar cu filtrul de dezinfectare a adresei de e-mail, acest filtru face exact ceea ce ar gândi și el. Elimină orice caractere care sunt nevalide într-o adresă URL (cum ar fi anumite caractere UTF-8 etc.). De exemplu, să presupunem că ați adăugat în mod accidental un "®" în adresa URL a site-ului dvs. web (din nou, nu întrebați cum, pretindeți că un velociraptor a făcut-o):

 $ valoare = 'http: //net.tuts®plus.com'; echo filter_var (valoarea $, FILTER_SANITIZE_URL);

Îndepărtează "®" nedorită și obțineți URL-ul dvs. frumos înapoi:

 http://net.tutsplus.com

FILTER_SANITIZE_NUMBER_INT: Acest filtru este similar cu cel din FILTER_VALIDATE_INT, dar în loc să verifice pur și simplu dacă este un întreg sau nu, elimină de fapt tot ce este non-integer din valoare! La îndemână, într-adevăr, pentru spamboturi și tricksters plictisitoare în unele forme de intrare:

 $ valoare01 = '123abc456def'; echo filter_var ($ valoare01, FILTER_SANITIZE_NUMBER_INT); echo "
„; $ value02 = '1.2.3.4.5.6.7.8.9'; echo filter_var ($ valoare02, FILTER_SANITIZE_NUMBER_INT);

Aceste scrisori proaste și zecimale sunt aruncate imediat:

 123456 123456789

FILTER_SANITIZE_NUMBER_FLOAT: Acest filtru este similar cu cel din FILTER_VALIDATE_INT, dar în loc să verifice pur și simplu dacă este un întreg sau nu, elimină de fapt tot ce este non-integer din valoare! La îndemână, într-adevăr, pentru spamboturi și tricksters plictisitoare în unele forme de intrare:

 $ valoare01 = '123abc456def'; echo filter_var ($ valoare01, FILTER_SANITIZE_NUMBER_FLOAT); echo "
„; $ value02 = '1.2.3.4.5.6.7.8.9'; echo filter_var ($ valoare02, FILTER_SANITIZE_NUMBER_FLOAT);

Din nou, toate acele scrisori proaste și zecimale sunt aruncate imediat:

 123456 123456789

Dar dacă doriți să păstrați o zecimală ca în exemplul următor:

 $ value = '1,23'; echo filter_var (valoarea $, FILTER_SANITIZE_NUMBER_FLOAT);

Încă o va îndepărta și se va întoarce:

 123

Unul dintre principalele motive pentru care FILTER_SANITIZE_NUMBER_FLOAT și FILTER_SANITIZE_INT sunt filtre separate este de a permite acest lucru printr-un simbol special "FILTER_FLAG_ALLOW_FRACTION" care este adăugat ca a treia valoare care a fost transmisă filter_var:

 $ value = '1,23'; echo filter_var (valoarea $, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

Acesta ar păstra zecimală și retur:

 1.23

Opțiuni, Steaguri și Comenzi pentru Array, OH MY!

Steagul din acest ultim exemplu este doar una dintre mai multe opțiuni, steaguri și controale de array care vă permit să aveți un control mai granular asupra tipurilor de date care sunt dezinfectate, definițiile delimitatorilor, modul în care sunt procesate filtrele de către filtre și multe altele. Puteți afla mai multe despre aceste steaguri și despre alte funcții legate de filtru în secțiunea Extensii pentru filtre din manualul PHP.

Alte metode de santizare a datelor cu PHP

Acum, vom trece peste câteva metode suplimentare de salvare a datelor cu ajutorul PHP pentru a împiedica "daunele date" de a vă distruge sistemele. Acestea sunt utile în special pentru aplicațiile care rulează încă PHP 4, deoarece toate acestea erau disponibile atunci când au fost lansate.

htmlspecialchars: Această funcție PHP convertește 5 caractere speciale în entitățile HTML corespunzătoare acestora:

  • '&' (ampersand) devine '&'
  • '' '(quote dublă) devine' '' când ENT_NOQUOTES nu este setat.
  • "(citat unic) devine '' 'numai când este setat ENT_QUOTES.
  • '<' (less than) becomes '<'
  • '>' (mai mare decât) devine '>'

Este folosit ca orice altă funcție de șir PHP:

 echo htmlspecialchars ('$ string');

htmlentities: Ca și htmlspecialchars, această funcție PHP convertește caracterele în entitățile HTML corespunzătoare. Marea diferență este aceea TOATE caracterele care pot fi convertite vor fi convertite. Aceasta este o metodă utilă de obfuscare a adreselor de e-mail de la unii bots care colectează adrese de e-mail, deoarece nu sunt programate să citească htmlentities.

Este folosit ca orice altă funcție de șir PHP:

 echo htmlentities ('$ string');

mysql_real_escape_string: Această funcție MySQL ajută la protejarea împotriva atacurilor de tip SQL. Se consideră o practică optimă (sau chiar o practică obligatorie) de a transmite toate datele trimise unei interogări MySQL prin această funcție. Ea scapă de orice personaje speciale care ar putea fi problematice și ar provoca mici Bobby Tables să distruge încă o altă bază de date pentru elevi.

 $ query = 'SELECT * FROM tabel WHERE value =' mysql_real_escape_string ("$ string"). LIMIT 1,1 '; $ runQuery = mysql_query ($ interogare);

Funcții personalizate

Pentru mulți, aceste filtre și funcții încorporate nu sunt suficient de bune. Validarea datelor pentru anumite date, cum ar fi numere de telefon, coduri poștale sau chiar e-mailuri, necesită deseori validarea și mascarea mai stricte. Pentru a face acest lucru, mulți oameni creează funcții personalizate pentru validare și datele lor sunt reale. Un exemplu de acest lucru poate fi la fel de simplu ca folosirea unei interogări MySQL pentru a căuta datele într-o bază de date cu valori cunoscute, cum ar fi:

 funcția checkZipCode ($ value) $ zipcheck = 'SELECT COUNT (*) din' baza de date '. $ count = mysql_query ($ zipcheck); dacă ($ count == 1) return TRUE;  altceva return FALSE; 

Pot fi făcute alte funcții personalizate care nu se bazează pe baze de date cu valori cunoscute și pot fi create prin verificarea citatelor de magie, a tălpilor de stripare și a scăpării pentru a fi inserate într-o bază de date:

 funcția cleanString ($ string) $ detagged = strip_tags ($ string); dacă (get_magic_quotes_gpc ()) $ stripped = stripslashes ($ detagged); $ escaped = mysql_real_escape_string ($ dezbrăcat);  altfel $ escaped = mysql_real_escape_string ($ detagged);  returnare $ escaped; 

Posibilitățile sunt nesfârșite, mai ales dacă integrați expresii regulate, dar, pentru cele mai multe ori, extensia filtrelor PHP ar trebui să facă trucul.

  • Urmăriți-ne pe Twitter sau abonați-vă la RSS Nettuts + pentru mai multe tutori și articole de coaching zilnic.


Cod