PHP este una dintre cele mai populare limbi de programare pentru web. Uneori, un limbaj prietenos cu funcțiile poate ajuta programatorul prea mult, iar găurile de securitate se pot strecura, creând obstacole în calea dezvoltării. În acest tutorial, vom arunca o privire la 5 sfaturi pentru a vă ajuta să evitați unele capcane comune de securitate PHP și probleme de dezvoltare.
În timpul procesului de dezvoltare, raportarea erorilor de aplicație este dvs.
cel mai bun prieten. Rapoartele de eroare vă pot ajuta să găsiți greșeli de ortografie în dvs.
variabile, detectarea utilizării incorecte a funcțiilor și multe altele. Oricum, o dată
site-ul merge în direct aceeași raportare care a fost un aliat în timpul
dezvoltarea poate transforma trădătorul și spune utilizatorilor dvs. mult mai multe despre dvs.
site pe care doriți să le cunoască (software-ul pe care îl executați, dosarul dvs.
structura, etc).
Odată ce site-ul dvs. este live, ar trebui să vă asigurați că ascundeți toate erorile
de raportare. Acest lucru se poate face invocând următoarea funcție simplă
în partea de sus a fișierului (fișierelor) aplicației dvs..
error_reporting (0);
Dacă ceva nu merge bine, tot vrei și trebuie să știi
aceasta. Prin urmare, ar trebui să vă asigurați întotdeauna că vă conectați erorile la a
fișier protejat. Acest lucru se poate face cu funcția PHP set_error_handler.
Începând cu primele sale zile, designerii PHP au inclus întotdeauna unii
pentru a ușura dezvoltarea. Sau așa au crezut ei! Câteva din acestea
funcțiile utile pot avea consecințe neintenționate. Eu le numesc "rău"
caracteristici ", deoarece acestea au permis coșmaruri de validare a datelor și
a creat o cale pentru bug-uri pentru a-și găsi drumul în scripturi. Unul dintre
primele lucruri pe care ar trebui să le faceți atunci când începe procesul de dezvoltare este
dezactivați anumite dintre aceste caracteristici.
Notă: În funcție de gazdă, acestea pot sau nu să fie dezactivate
tu. Dacă vă dezvoltați pe calculatorul propriu sau pe alte localuri similare
mediu, probabil că nu vor fi oprite. Unele dintre aceste caracteristici
au fost, de asemenea, eliminate în PHP6 viitoare, dar sunt ubicue în PHP4
aplicații și sunt depreciate numai în aplicațiile PHP5.
Înregistrează-te Globals (register_globals)
Pe scurt, register_globals a fost menit să ajute la aplicarea rapidă
dezvoltare. Luați, de exemplu, această adresă URL,
http: //yoursite.tld/index.php? var = 1, care include un șir de interogări.
instrucțiunea register_globals ne permite să accesăm valoarea cu $ var
în loc de $ _GET ['var'] în mod automat. Acest lucru ar putea fi util pentru dvs.,
dar, din păcate, toate variabilele din cod au acum această proprietate și
acum putem intra ușor în aplicații PHP care nu protejează împotriva
această consecință neintenționată. Următorul fragment de cod este unul singur
exemplul comun pe care îl veți vedea în scripturile PHP:
dacă empty $ _POST ['username']) && $ _POST ['username'] == 'test' &&! empty ($ _POST ['password']) && $ _POST ['parola'] == "test123 ") $ acces = adevărat;
Dacă aplicația rulează cu register_globals ON, un utilizator ar putea
doar loc acces = 1 într-un șir de interogare, și apoi ar avea acces la
indiferent de scriptul care rulează.
Din păcate, nu putem dezactiva register_globals din scenariu
(folosind ini_set, cum am putea în mod normal), dar putem folosi un
.fișierele htaccess pentru a face acest lucru. Unele gazde vă permit de asemenea să aveți un php.ini
fișier de pe server.
Dezactivarea cu .htaccess
php_flag register_globals 0
Dezactivarea cu php.ini
register_globals = Off
Notă: dacă utilizați un fișier php.ini personalizat care nu este aplicabil
întregul server, trebuie să includeți aceste declarații în fiecare sub folder
care are PHP.
Citate magice (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)
Citate Magic a fost o caracteristică menită să salveze programatorii probleme de
folosind addslashes () și alte caracteristici de securitate similare în codul lor.
Există cel puțin trei probleme asociate cu citatele magice. unu
problema cu această caracteristică utilă este dacă ambele citate magice și
se utilizează addslashes (). Dacă acesta este cazul, atunci ați terminat
se adaugă plăcuțe multiple, cauzând erori. A doua problemă este dacă
faceți citatele ipoteziei magice este activată și de fapt este
nu. Apoi, toate intrările nu sunt verificate. A treia problemă este că magia
citate scapă doar citate unice și duble, dar dacă utilizați un
motor de baze de date, există, de asemenea, multe caractere specifice bazei de date care
de asemenea, trebuie să fie scape. Se recomandă să dezactivați acest lucru
caracteristică și folosiți validarea validă a variabilei (vezi mai jos).
Din păcate, de asemenea, nu putem dezactiva citatele magice din scenariu
folosind ini_set. Ca și cu register_globals, putem folosi .htaccess sau
fișiere php.ini pentru a face acest lucru.
Dezactivarea cu .htaccess
php_flag magic_quotes_gpc 0 php_flag magie_quotes_runtime 0
Dezactivarea cu php.ini
magic_quotes_gpc = Oprit magic_quotes_runtime = Oprit magic_quotes_sybase = Oprit
Notă: dacă utilizați un fișier php.ini personalizat care nu este aplicabil
întregul server, trebuie să includeți aceste declarații în fiecare sub folder
care are PHP.
În plus față de caractere scape, un alt mare pentru a proteja
este de validare. Cu multe aplicații, de fapt deja
știți ce fel de date așteptați la intrare. Cel mai simplu mod
pentru a vă proteja împotriva atacurilor este să vă asigurați că utilizatorii dvs. pot numai
introduceți datele corespunzătoare.
De exemplu, să spunem că creăm o aplicație care afișează utilizatorii
zile de naștere și permite utilizatorilor să-și adauge propriile lor. Vom avea nevoie
accepta o lună ca o cifră între 1-12, o zi între 1-31 și un an
în format AAAA.
Acest tip de logică în aplicația dvs. este simplu și regulat
expresiile (regex) sunt modalitatea perfectă de a gestiona validarea intrărilor.
Luați următorul exemplu:
dacă ! preg_match ("/ ^ [0-9] 1,2 $ /", $ _GET ['lună'])) $ $, $ _GET ['day'])) // eroare de manevră dacă ! Preg_match ("/ ^ [0-9] ])) // error handle
În acest exemplu, am verificat pur și simplu (în primele două declarații dacă)
pentru numere întregi [0-9] cu o lungime de una sau două 1,2 și am făcut-o
aceeași în declarația a treia, dacă a fost verificată pentru o durată strictă de 4
caractere 4.
În toate cazurile, dacă datele nu se potrivesc cu formatul dorit, noi
intoarceti un fel de eroare. Acest tip de validare lasă foarte puțin
cameră pentru orice tip de atac SQL.
Regex expresii ca cele de mai sus poate fi un pic dificil de a
înțelegeți la început, dar explicându-le este în afara acestui domeniu
articol. Manualul php conține câteva resurse suplimentare care să vă ajute la validare. Baza de date PEAR are, de asemenea, câteva pachete, cum ar fi pachetul Validate pentru a ajuta la e-mailuri, date și URL-uri.
Mai jos este un exemplu de scenariu de mai sus în acțiune, folosind 200 ca intrare pentru o lună, abc pentru zi și doar 09 pentru anul.
O aplicație web acceptă, de obicei, informații de la utilizatori și le afișează
într-un fel. Aceasta poate fi, desigur, într-o mare varietate de forme
inclusiv comentariile, firele sau postările de blog care sunt sub formă de cod HTML
cod. Când acceptați intrarea, permiterea HTML poate fi un lucru periculos,
deoarece permite JavaScript să fie executat în moduri neintenționate.
Dacă o singură gaură este lăsată deschisă, JavasScript poate fi executat și cookie-urile
ar putea fi deturnat. Aceste date cookie ar putea fi apoi utilizate pentru a falsifica o realitate
cont și dă accesul utilizatorilor ilegali la datele site-ului web.
Există câteva moduri în care vă puteți proteja de astfel de atacuri. unu
modul este de a dezactiva complet HTML, deoarece atunci nu este posibil
modalitate de a permite executarea oricărui JavaScript. Cu toate acestea, dacă faceți acest lucru atunci
formatarea este, de asemenea, interzisă, ceea ce nu este întotdeauna o opțiune pentru forum
și software de blog.
Dacă doriți ca HTML-ul să fie cel mai des dezactivat, dar totuși doriți să permiteți o simplă utilizare
de formatare, puteți permite doar câteva etichete HTML selectate (fără
atribute) cum ar fi sau . Sau, alternativ,
puteți permite un set popular de etichete numite "BBCode" sau "BB Tags"
frecvent observate pe forumuri în formatul [b] test [/ b]. Acest lucru poate fi a
modalitate perfectă de a permite particularizarea personalizării formatării în timp ce nu permiteți accesul
ceva periculos. Puteți implementa codul BB folosind preexistent
pachete cum ar fi HTML_BBCodeParser sau să scrieți propria implementare BBCode cu expresii regulate și o serie de instrucțiuni preg_replace.
Nu în ultimul rând, este unul dintre cele mai cunoscute atacuri de securitate
pe web: injecție SQL. Atacurile de injectare SQL apar atunci când datele se întâmplă
neconfirmat, iar aplicația nu scapă de caracterele folosite în SQL
șiruri precum ghilimele simple (') sau ghilimele duble (").
Dacă aceste caractere nu sunt filtrate, utilizatorii pot exploata sistemul, făcând interogările întotdeauna adevărate, permițându-le astfel să înșele sistemele de conectare.
Din fericire, PHP oferă câteva instrumente care vă ajută să vă protejați baza de date
intrare. Când sunteți conectat (ă) la un server sql, puteți utiliza aceste
funcționează cu un apel simplu, iar variabilele dvs. ar trebui să fie în siguranță
în interogări. Cele mai multe dintre cele mai importante sisteme de baze de date oferite cu PHP includ
aceste funcții de protecție.
MySQLi vă permite să faceți acest lucru într-unul din două moduri. Fie cu funcția mysqli_real_escape_string când este conectat la un server:
$ username = mysqli_real_escape_string ($ GET ['username']); mysql_query ("SELECT * FROM tbl_members WHERE nume utilizator = '". $ username. "'");
Sau cu declarații pregătite.
Instrucțiunile întocmite sunt o metodă de separare a logicii SQL de datele primite. Funcțiile folosite în biblioteca MySQLi filtrează datele noastre pentru noi atunci când legăm variabilele în instrucțiunea pregătită. Acest lucru poate fi folosit astfel (atunci când este conectat la un server):
$ id = $ _GET ['id']; $ statement = $ conexiune-> pregăti ("SELECT * FROM tbl_members WHERE id =?"); instrucțiunea $ -> bind_param ("i", $ id); $ Declarație> execute ();
Un lucru de remarcat atunci când folosim declarații pregătite este "i" în bind_param. i înseamnă pentru întreg, dar puteți folosi s pentru șir, d pentru dublu, și b pentru blob în funcție de ce date trecem.
Deși acest lucru vă va proteja în cele mai multe cazuri, ar trebui
țineți cont de validarea corectă a datelor, după cum sa menționat anterior.
Acest tutorial scurt poate zgâria numai suprafața de securitate web.
În cele din urmă, este de până la dezvoltatori pentru a se asigura că cererile pe care le
construiesc în siguranță, educându - se pe ei înșiși despre pericolele de pe internet și pe
cele mai frecvente tipuri de vulnerabilități și atacuri. Dacă doriți
citiți mai multe despre problemele de securitate din PHP, există o secțiune despre securitate în manualul php dedicat acestora.
Care sunt sfaturile tale??