Erori ale începătorilor php-dezvoltatori cum să scrie cod securizat

Erori ale începătorilor php-dezvoltatori cum să scrie cod securizat

Pentru cei care au atins cel puțin o temă a securității, ei știu că protecția informațiilor este un proces nesfârșit. Ar trebui să furnizeze informații:







  • accesibilitate;
  • integritate;
  • confidențialitate.

Am fost cioplit în cap de către universitate în toți cei cinci ani de pregătire =)

Acest proces poate oferi un anumit nivel de protecție, dar este imposibil să se obțină o securitate de 100%. Dar sarcina noastră de programatori este să asigurăm aplicația cât mai mult posibil din diferite tipuri de amenințări.

Erori în curs de dezvoltare

Amenințările există complet diferite și, din păcate, nu toate pot fi prevăzute. Cu toate acestea, există cele mai frecvente erori care duc la vulnerabilități în aplicații. În acest articol, vom examina cele mai populare tipuri de erori, precum și modalitățile de a le rezolva. Deci, hai să mergem.

Lucrul cu bazele de date - SQL injection

De ce este primul element? Da, pentru că acesta este cel mai important lucru. Baza de date stochează toate datele despre utilizatorii dvs., acesta este exact ceea ce vă interesează mai întâi concurenții dvs. și alți infractori.

Să examinăm un exemplu de cod vulnerabil.

Cererea noastră către baza de date va avea următoarea formă:

UNION vă permite să combinați mai multe solicitări într-una. În parametru, am trecut numărul înregistrării inexistente: -1, iar prima parte a interogării nu ne-a returnat nimic. Apoi, în a doua parte a interogării, am apelat la tabelul de utilizatori și am scos câmpurile de e-mail și parolă. cerându-le să le numească în eșantion ca nume și text. Această solicitare a fost executată și am primit ca rezultat emailul utilizatorului și parola acestuia pe pagina de știri.

Soluție - DOP

DOP vă permite să protejați împotriva injecțiilor SQL. permițându-vă să înlocuiți datele corecte în locurile potrivite. Acest lucru se datorează legării datelor transmise - specificăm anumite substituții în interogare și apoi le transmitem valorile. Codul va arăta astfel:

Aici am denumit substituția: id și apoi în metoda de executare a trecut valoarea pentru aceasta. Utilizați întotdeauna valorile PDO și obligatorii, acest lucru nu vă va permite să aruncați ceva periculos în interogarea dvs. SQL.

Injecție PHP

Aceasta este o tehnică care permite unui atacator să execute un cod arbitrar pe site. Un exemplu simplu: articolele de pe site sunt fișiere cu text. Pentru a le deschide, se utilizează constructul de includere. care acceptă parametrii primiți.

File de injecție la distanță

Pentru a vizualiza articolul stocat în fișierul principal. se folosește următoarea adresă URL:

Și codul va fi descărcat de pe site, deoarece funcția include vă permite să executați codul de la serverele la distanță.

Să examinăm, de asemenea, codul care adaugă o extensie la numele fișierului din parametri.

Astfel, în PHP fișierul va fi executat:

După cum puteți vedea, extensia a devenit un parametru de interogare și va fi pur și simplu ignorată.

Injecție fișier local

Desigur, acest cod poate fi folosit și pentru accesarea fișierelor confidențiale de pe serverul propriu-zis. De exemplu, specificați pur și simplu calea din parametru.

Fișierul va fi afișat în browser-ul atacatorului.

Dacă există o cale la începutul fișierului de conectat, se poate utiliza doar injecția locală.

Numai căile relative pot fi folosite.

Ele pot alege și găsi calea către scriptul curent atunci când apare o eroare (dacă serverul include raportarea erorilor, ceea ce reprezintă o mare greșeală). De exemplu, trecerea-get parametru de non-existente unele Abracadabra, atacatorul va primi o eroare, informațiile vor fi afișate pentru fișierul în care a apărut eroarea. Adică calea lui. Folosind-o, puteți deja presupune despre localizarea aproximativă a diferitelor fișiere.

Protecția împotriva injecțiilor cu PHP

Puteți veni cu o grămadă de filtre diferite. Dar aș sfătui să respect regulă - să nu permit datele de la utilizator să intre, să includă, să solicite, eval.







Ieșire - utilizați funcția htmlentities ()

Convertește caracterele precum deschiderea parantezelor în caractere speciale pe care browserul le afișează ca aceleași paranteze și nu le tratează ca etichete.

Adică, în browser vizitatorul va vedea doar textul:

Ce altceva ar trebui să știu despre dezvoltarea sigură?

În plus față de cele mai frecvente vulnerabilități, există câteva practici mai bune care fac codul mai sigur. Să le analizăm.

Validarea și salubritatea datelor

Toate datele de la utilizatori procesate de codul dvs. sunt potențial periculoase. În plus, de cele mai multe ori trebuie să ne asigurăm că datele apar la noi și sunt stocate într-un anumit format. Deci, putem vorbi despre o previzibilitate a muncii în privința lor. Acest lucru ne va ajuta să validăm și să dezinfectăm datele.

Ce ne oferă PHP în acest sens?

În primul rând, aceasta este o reducere a tipurilor. Toate id-urile, pe care utilizatorul le transmite, ar trebui să fie aduse la întreg (și nu numai, trebuie să aduceți toate tipurile necesare).

În al doilea rând - expresii regulate. În PHP, există multe funcții pentru a lucra cu expresii regulate. Ei lucrează foarte repede, deoarece bibliotecile pentru a lucra cu ei sunt scrise în C și lucrul cu persoanele obișnuite este foarte scăzut.

În al treilea rând, există o funcție built-in filter_var (). care permite atât validarea, cât și salubritatea. De exemplu, pentru a goli un e-mail, este suficient să scrieți:

Cu toate acestea, în loc de asta, de multe ori în cod puteți vedea obișnuiți pentru sute de caractere. Nu fi asa, totul este deja facut pentru tine.

criptare

În primul rând, vreau să spun că criptarea este un subiect foarte complex și trebuie să înțelegeți că, cel mai probabil, o înțelegeți foarte superficial. Cu toate acestea, există persoane special instruite care sunt implicate în acest subiect și oferă cele mai bune practici care ar trebui respectate. În acest articol, vom vorbi despre hash. Această procedură implică o criptare unidirecțională, după care din valoarea rezultată este imposibil să restabiliți versiunea originală.

Această tehnică este adesea folosită pentru stocarea parolelor. Aceasta se face pentru a nu stoca parolele inițiale ale utilizatorului. Întrucât mulți utilizatori folosesc aceleași parole pe diferite site-uri, iar dacă baza de date de pe un site este furat și să vedeți parolele în formă clară, atunci cel mai probabil același login și parolă vor fi potrivite pentru alte site-uri. Deci, cum se realizează acest lucru. Pentru a verifica parola, pur și simplu criptați parola introdusă în formularul de autentificare prin același algoritm și comparați valorile. Dacă se potrivesc, parola este corectă.

Pentru o lungă perioadă de timp, pentru acest lucru a fost folosit algoritmul MD5. Pentru a crea un astfel de hash în php, există o funcție încorporată md5 (). Iată un exemplu de utilizare a acestuia.

Ca urmare a hashing-ului, acest algoritm produce un cod hexazecimal de 16 octeți. După cum înțelegeți, numărul tuturor sumelor posibile este finit. Prin urmare, ca urmare a hashing-ului a două valori diferite, puteți obține același hash. Aceasta se numește o coliziune. Acest lucru afectează toate funcțiile hash. Din păcate, lumea este imperfectă. Deci, înapoi la algoritmul MD5 - acum pentru el există așa-numitele tabele curcubeu, care vă permit să obțineți o valoare (nu neapărat sursa), care după hash va fi aceeași cu valoarea de valoarea inițială zachehirovannogo. Astfel, cunoscând hash-ul, puteți obține rapid o parolă care vă va permite să intrați pe site.

Apoi au venit cu sare. Sau, așa cum spun ei, "sare hashes". Linia de jos este că un text este adăugat la parola originală. Rezultatul este un alt tip de hash.

Atunci când utilizatorul introduce parola, adăugăm de asemenea această linie la parola lui, determină valoarea rezultată și apoi compară valoarea rezultată cu valoarea din baza de date.

Astfel, este asigurată protecția de la Rainbow Tables, deoarece probabilitatea de coliziune este redusă datorită faptului că în sarea textului ruginit trebuie să coincidă.

Nimeni nu va face mese irizate pentru valorile sărate, cu toate acestea MD5 chiar și cu sare este selectat destul de repede, mai ales dacă este foarte necesar pentru cineva.

Deci, folosirea MD5 este o greșeală. Acesta este un algoritm învechit și nesigur. Cu toate acestea, mulți continuă să folosească.

Cum rămâne cu stocarea parolelor?

Acum, în PHP există funcții speciale pentru hashing, care utilizează algoritmi moderni de criptare. Acestea sunt funcțiile _passwordhash () și _passwordverify (). Prima funcție creează un hash pentru valoare.

A doua este parola și hash-ul primit de prima funcție. Aceasta se întoarce falsă sau adevărată. în funcție de faptul dacă parola este corectă.

Aceste funcții funcționează deja cu sare și se adaugă automat la hash atunci când este creată și este de asemenea extrasă din hash atunci când o compară cu parola introdusă. Utilizați aceste funcții și veți fi fericiți.

concluzie

În acest articol, am vorbit doar superficial despre cele mai populare greșeli ale dezvoltatorilor începători și, de asemenea, am dat exemple despre cum să le rezolvăm. Acum v-aș sfătui să studiați mai detaliat fiecare din aceste domenii pentru a înțelege de ce ar trebui să vă fie frică de primul. Google să vă ajute.

Ce altceva este fapta în ceea ce privește securitatea?

Bineînțeles, toată lumea are fapte, noi toți suntem oameni. Recent și am avut - în fișierul de configurare a proiectului a existat o parolă de la poștă pentru a trimite mesaje emap. Am uitat să dezactivez acest fișier de configurare în .gitignore. ca rezultat, parola a fost publica pe github. Din fericire, a fost o persoană care mi-a scris despre această eroare. Am schimbat imediat parola și i-am mulțumit persoanei cu un mic bonus material. Desigur, am fost foarte norocos. După ce ați accesat e-mailul, ați putea accesa mesajele trimise și puteți îmbina baza de utilizatori. Sau, mai rău, trimiteți-i niște lucruri urâte din acest post.

Soluția în acest caz este următoarea: ignorarea tuturor config-urilor în .gitignore de îndată ce acestea sunt create și este mai bine să le scoatem din depozit cu totul.







Articole similare

Trimiteți-le prietenilor: