O parte esențială a practicii de dezvoltare PHP este întotdeauna reținerea faptului că securitatea nu este ceva ce puteți cumpăra pur și simplu de pe raft la magazinul local convenabil. Asigurarea securității aplicațiilor dvs. web este un proces care, în timp, trebuie să fie constant evaluat, monitorizat și întărit.
În timp ce utilizarea filtrelor și validarea datelor este o parte a procesului de securitate, un dezvoltator de web ar trebui să fie conștient de faptul că Randomization, Obfuscation și Cryptography în PHP pot face diferența în securitatea aplicațiilor web. Acest tutorial vă va îndruma prin câteva tehnici simple la crearea și utilizarea valorilor aleatoare sau unice în cadrul aplicațiilor dvs. web, aruncând o privire și aplicând câteva tehnici de obfuscare generală și căutând mai adânc în știința Cryptology și utilizarea în PHP.
Dictionary.com definește randomizarea ca:
"-verb: ordinea sau selectarea într-o manieră aleatorie, ca într-un eșantion sau experiment, mai ales pentru a reduce părtinirea și interferența cauzată de variabile irelevante;
Generarea de numere aleatoare este determinată într-o varietate de moduri, cu toate acestea generatoarele computaționale nu se confundă cu aleatorie "adevărată" așa cum se vede în zgomotul natural sau electronic (canalul fuzzy, scrâșnet, alb-negru la televizor). Aceste valori calculate sunt considerate pseudo-aleatoare.
PHP ne oferă câteva moduri diferite de a crea valori aleatorii. Să ne uităm la câteva dintre cele mai populare funcții.
Cele două funcții rand ()
și mt_rand ()
sunt probabil cele mai utilizate funcții pentru a genera un set de numere aleatorii în PHP. Functia rand ()
; este un generator mai vechi, și cădea din uz din cauza mt_rand ()
; care este mai rapidă, mai fiabilă și se poate ocupa de o valoare maximă maximă mai mare pe unele platforme. Functia str_shuffle ()
face exact ceea ce v-ați aștepta la ea, amestecă o șir de caractere care îi este transmisă.
"; print mt_rand (0, 20); // Ieșiți un întreg aleator între 0 și 20 de ecouri"
"; // Exemple de rand () utilizare print rand (); // echo implicit"
"; rand print (0, 25); / Rezultate ale unui intreg aleator între 0 și 25 echo"
"; // Exemplu de str_shuffle folosire $ string = 'abcefghijklmnopqrstuvwxyz'; print str_shuffle ($ string); // shuffles $ string?
rand ()
și mt_rand ()
funcțiile acceptă doi parametri în cazul în care $ min
este cel mai mic întreg pentru început, și $ max
fiind cel mai mare intreg care se termina cu. Functia str_shuffle
ia un parametru, un șir, care emite o mutație amestecată a șirului. Se comportă la fel ca și cum ați mișca un pachet de cărți.
In timp ce mt_rand ();
va scuipa un intreg aleatoriu, și str_shuffle
va amesteca un șir în sus, o funcție pe scară largă utilizată pentru a crea valori aleatorii unice este uniqid ()
. Aceasta generează un identificator unic prefixat, bazat pe timpul curent în microsecunde (prin php.net). Utilizarea acestei funcții este utilă pentru crearea jetoanelor de sesiune și a cheilor de formular, așa cum se vede în formularul Secure Forms with Key Forms.
"; print uniqid (" NETTUTS ", TRUE); // Adăugarea unui prefix suplimentar și setarea more_entropy la TRUE?
Functia uniqid ()
acceptă doi parametri, primul adaugă un prefix rezultatelor, în timp ce al doilea, dacă este setat la TRUE, va adăuga o entropie suplimentară la sfârșitul valorii returnate.
Există câteva exemple de gazilioane pe web care generează parole aleatorii, toți fac o treabă bună la el. "Dar de ce," întrebiți ", ar trebui să generez o parolă aleatorie?" Ei bine, răspunsul, pur și simplu, este că nu trebuie să vă bazați pe utilizatorul final pentru a vă oferi o parolă mai mică decât cea sigură la început. Generarea parolelor aleatoare este foarte utilă în înregistrările utilizatorilor sau atunci când un utilizator face o solicitare deoarece le-a uitat parola. Acest lucru asigură o parolă puternică la începutul experienței utilizatorilor de pe site-ul dvs. sau poate reduce liniile de cod atunci când un utilizator trebuie să obțină din nou acces.
Să examinăm câteva exemple: Exemplul 1
Acest exemplu shuffles un șir cu str_shuffle
și va returna un șir într-un interval de numărare. Deci, dacă ați dori să generați o parolă de 8 caractere, atunci ați trece 8 la funcția randompassword sau randompassword (8) din codul sursă.
Exemplul 2
În comparație, exemplul ia un șir static și îl amestecă, apoi îl întoarce, de exemplu două se adaugă în aromă mai dinamică (mmm gustoasă). În exemplul doi șirul care este amestecat nu mai este static, dar se schimbă cu fiecare generație. În timp ce primul exemplu este cu siguranță suficient în majoritatea cazurilor pentru a genera o parolă puternică, al doilea exemplu ne permite să asigurăm că lungimea șirului și caracterele se vor schimba cu utilizarea, reducând în mare măsură șansa unei dublări.
Punerea în aplicare a parolelor puternice în cadrul unei aplicații web va împiedica utilizatorii să viziteze sau să se înscrie pentru un site Web. Este adesea un compromis între obținerea traficului dorit și asigurarea securității aplicației. Vă sugerăm să permiteți utilizatorilor să creeze propriile parole la înscriere sau să le permită să aleagă între cei doi.
Salvarea parolelor este o modalitate eficientă de a crește securitatea conturilor utilizatorilor, chiar dacă un atacator obține acces la baza dvs. de date, dacă este făcută corect. Se poate argumenta că, cu acces la sare, un atacator poate să-ți obțină acreditările. Deși acest lucru este adevărat, aplicarea unor tehnici de randomizare pentru stocarea parolelor va face acest proces extrem de dificil, mai ales dacă stocarea informațiilor despre utilizatori și a conținutului sunt împărțite în baze de date separate.
Din nou, acest lucru intră sub incidența "măsurii în care utilizatorul final nu se bazează pe asigurarea securității simple". Utilizatorii folosesc în general parole care sunt ușor de reținut și chiar folosesc aceleași parole pe mai multe site-uri web (știu, bine !?). Parolele ușor de memorat sunt în general cuvinte găsite într-un dicționar și alte tipuri de valori (ex. 12345, QWERTY). În calitate de dezvoltatori, suntem deseori atenți la această practică, dar nu putem nega că este doar modul în care sunt lucrurile.
Pentru ca o aplicație web să utilizeze o sare într-o parolă, aplicația trebuie să o stocheze undeva. Nu este recomandat să folosiți aceeași sare într-o întreagă bază de date cu parole, ci să generați o sare unică pe utilizator. Generarea unei sare pentru o întreagă bază de date reduce efectiv securitatea aplicației web într-un sens că, dacă un atacator reușește să-l cracheze, întreaga schemă este ruptă sau, dacă este pierdută, face ca baza de date să fie inutilă. Crearea unui sistem de înregistrare a membrilor cu drepturi depline, cu toate clopotele și fluierele, nu intră în sfera acestui tutorial, cu toate acestea vom crea un sistem simplu de utilizat pentru a folosi un exemplu. Să ne uităm la generarea unei sare și la aplicarea unor tehnici de randomizare:
Aici este tabela SQL pe care o vom folosi.
CREATE TABLE DACA NU EXISTĂ "utilizatori" ('usr_id' int (11) NOT NULL AUTO_INCREMENT, 'usr_name' varchar (24) NOT NULL, 'usr_pass' varchar (32) 'usr_salt' varchar (255) NOT NULL, KEY PRIMARY ('usr_id')) ENGINE = MyISAM DEFAULT CHARSET = latin1;
Succes„; altceva echo 'eșec
„; ?>
Să trecem peste codul PHP. Pentru a păstra lucrurile simple, includeți fișierul de configurare a bazei de date. Următorul PHP verifică dacă formularul HTML a fost trimis, verificând dacă $ _POST
variabilele nu sunt goale. Dacă acestea nu sunt goale, scriptul continuă să scape de datele formularului trimis de utilizator, pregătindu-l să fie introdus în baza de date. Apoi, generăm o simplă sare folosind uniqid ()
și mt_rand ()
și stocarea în variabilă $ salt_gen
. Pentru a sare parola, combinăm parola $, apoi sarea. Următorul pas, într-o manieră de combinare a variabilelor combinate cu md5.
"Dar așteptați! Ați adăugat, de asemenea, adresa de e-mail a utilizatorilor în partea din față a parolei și combinație de sare!" Da! Am facut acest lucru pentru ca, daca un atacator va avea acces la baza mea de date intr-un fel si sarea, singura cale prin care atacatorul va sti cu siguranta ca adresa de e-mail este folosita in hashing-ul parolei este daca au acces codul sursă. Cum este aleator și unic o adresă de e-mail?
Pentru a restrânge restul codului PHP introducem variabilele noastre în tabela de baze de date din câmpurile respective și le oferim utilizatorilor feedback despre succes sau eșec. Acum, pe restul fișierului de înregistrare, HTML
Aici vom crea un simplu formular HTML care va colecta un nume de utilizator, un e-mail și o parolă de la un utilizator. Nimic nu este aici.
Așadar, avem acum un simplu formular de înregistrare, care introduce un utilizator în baza de date împreună cu parola sărate. Să creați o pagină de conectare care va cere să preluăm informații din baza de date și să autentificăm utilizatorul. În primul rând PHP:
Yippie, suntem autentificați!„; altceva echo 'Nu, nu suntem autentificați!
„; altceva echo 'Oh, nu suntem în baza de date!
„; ?>
Practic, ceea ce facem în fișierul login.php este luarea variabilelor formularului depus, prinderea rândului de tabel asociat cu numele de utilizator și reconstruirea parolei din elementele din baza de date la care a fost creat (e-mail, trecere, sare) și reechilibrarea acestora . Apoi, verificăm din nou baza de date pentru numele de utilizator și valoarea parolei reînchizită pentru a găsi o potrivire, aflându-l pe utilizator cu succes sau cu eșec. În sfârșit, aici este codul HTML:
O definiție simplă și complexă a obfuscării este (folosiți versiunea conținută în sursă dacă doriți să rulați codul):
După cum puteți vedea, acest cod nu este menit să fie distins. Nu există nume de variabile distincte, nu există comentarii, nu există distanțe, nu există indentări, nu există o ordine distinctă și toate sunt într-o singură linie. Chiar dacă nu putem distinge codul, mașinile noastre încă mai știu ce este. Functioneaza. Această linie de haos pur și simplu echoze "Obfuzia este o tehnică folosită pentru a complica codul în așa fel încât să nu fiu de înțeles". Da, știu despre erori.
Obfuscarea are argumente pro și contra. Scopul este acela de a dezactiva o persoană de la a afla ce cod se face dintr-o privire sau pentru o perioadă de timp. Acesta este un plus față de persoanele cu puțin sau deloc cunoașterea limbajului de programare. Cu toate acestea, oricine are o înțelegere de bază despre PHP poate să disemineze codul obosit și să-și dea seama ce face, ar putea dura puțin timp. Acesta este unul dintre defectele de obfuscare, nu este o formă de criptare, este doar o încercare de a fi criptică. De asemenea, obfuscația adaugă în mod normal la dimensiunea fișierului. O mulțime de timp, veți întâlni cod obfuscated în software propriu-zis și rău intenționat.
Aceasta este o întrebare obișnuită. Există în primul rând două moduri de a obfusca codul. În primul rând, o puteți face manual. Scrierea unui cod obfuscat durează mult timp. Exemplul folosit în acest articol a durat ceva timp pentru a scrie din aceleași motive pe care le utilizați în primul rând pentru obfuscation (lipsa structurii, a ordinii etc ...), ceea ce a dus chiar la unele erori minuțioase pe care nu le-am dorit nici măcar să le vânez și repară. Cel de-al doilea mod în care vă puteți distrage codul este achiziționarea de software-ul care o face pentru dvs. Folosirea unui program pentru a obfusca codul este banală și, desigur, costă bani mult timp. Unele programe software care pretind că vă strică codul, criptează și / sau îl codifică în așa fel încât să se bazeze pe o strângere de mână pentru a funcționa. De multe ori veți găsi software-ul a cărui furnizor nu va garanta nici măcar că codul dvs. va funcționa când sa terminat. Chiar și în exemplu, am folosit un simplu base64
funcția de a codifica construirea ieșirii script-ului.
Depinde într-adevăr de planul tău. În special, dacă doriți să vă vindeți scriptul PHP (sau orice software), trebuie să îl acordați licență. Aceasta va fi una dintre cele mai importante linii de aparare pentru a contracara programele destinate audienței de a face tot ce vor. Un prim exemplu de licențiere poate fi văzut în Envato Marketplace Wiki. Cu toate acestea, poate doriți să obfuscate unele, sau tot codul dvs., indiferent de motiv. Cu toate acestea, din cauza negativelor obfuscations, dacă într-adevăr îngrijorați de securitatea codului dvs. sursă, este posibil să meritați să căutați criptarea.
Wikipedia.com definește criptografia ca:
"practica și studiul ascunderii informațiilor".
Criptografia este o afacere mare, oricât de conștientă de ea sau nu. În aproape toate aplicațiile web care se desfășoară în prezent, există o prezență de criptografie utilizată (adică clienți de poștă electronică și site-uri web). În calitate de dezvoltatori, trebuie să fim informați și conștienți de aplicațiile practice ale criptografiei în cadrul software-ului nostru. PHP ne oferă câteva funcții foarte fundamentale și practice pe care le putem utiliza pentru a cripta datele. În această secțiune, voi trece mai întâi peste algoritmi de hashing cu sens unic, deși mă voi atinge ușor pe criptarea bazată pe Symmetric-key. Există mult mai multe (adică Steganografia, Asimmetric-Key pentru a numi un cuplu).
Într-o bună parte, folosim hashing-ul într-o singură direcție ca modalitate de stocare sigură a parolelor și de verificare a integrității datelor din fișiere. În timp ce facem acest lucru, pentru a autentifica membrii unei aplicații web, avem hash utilizatorii introduși parola și se potrivesc cu utilizatorii hash stocați. Aceeași tehnică se aplică și verificării integrității fișierelor.
SHA-1, 2 și 3
Familia SHA a algoritmilor hash este în prezent cea mai populară, în mod semnificativ SHA-1. Chiar dacă algoritmul SHA-1 poate avea o slăbiciune, acesta este încă utilizat pe scară largă.
"echo $ hash2".
"; // va ieși: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c?>
În PHP, SHA-2 este chemat într-un alt punct de vedere și necesită PHP 5 mai mare sau egal cu 5.1.2. SHA-2 este superioară SHA-1 și poate fi apelat cu diferite dimensiuni de biți.
"; echo $ hash_sha384."
"; echo $ hash_sha512."
? „; / * Rezultate repspectively: SHA256: sha384 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc: 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32 SHA512: c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a * />
Funcția hash este numită de hash (algoritm, string); În cele mai noi versiuni de PHP, funcția hash () poate fi utilizată pentru a apela orice algoritm de hash unidirecțional susținut de PHP (adică md5, sha-1, haval, ghost). Dacă doriți să vedeți o listă a tuturor algoritmilor hashing înregistrați, puteți utiliza:
= 5.1.2 print_r (hash_algos ()); ?>
SHA-3 este încă în curs de elaborare și luată în considerare pentru standardizare. Un concurs pentru a găsi un bun candidat pentru a acționa ca nou algoritm de hash securizat a fost lansat de Institutul Național de Standarde și Tehnologie, iar înscrierile pentru concurs au fost expuse la 31 octombrie 2008. O intrare destul de populară numită Skein are un modul PHP disponibil puteți descărca (deși trebuie să-l compilați singuri). Skein este dezvoltat de unele mari nume gasite in industria de securitate, cum ar fi Bruce Schneier, Niels Ferguson si Stefan Lucks pentru a numi doar cateva. Site-ul oficial Skein poate fi găsit aici.
Metodele de criptare Symmetric-Key sunt în cazul în care securitatea criptării se află în primul rând într-o cheie, care este împărțită între două puncte, unde datele sunt criptate și unde datele sunt decriptate. Un exemplu foarte bun despre modul în care acest lucru poate funcționa a fost oferit de tutorialul "Crearea unui curs Crypter cu PHP" al lui Christian Beikov.
În esență, HMAC este ca o combinație între criptarea one-way și criptarea bazată pe chei. Securitatea HMAC se bazează pe mărimea cheie folosită și pe puterea funcției hash la care se calculează. Puteți compara oarecum această metodă cu sărind parole.
";>>
Ce calatorie! Randomizarea valorilor, generarea de parole aleatoare, saltare, stocarea și autentificarea utilizatorilor, obfuscation, crypto ... pare să fie o mulțime de a lua. Dar merită! Este important să știți ce fel de securitate doriți să implementați în aplicațiile dvs. web și cum o veți proteja. Mai mult, este important să păstrăm o atitudine inteligentă față de aceste implementări și să nu credem că securitatea este pusă în aplicare numai prin câteva metode, ci printr-o combinație a acestora, cu o diminuare a creativității.