De ce este periculos să includă php parametru register_globals, shublog

De ce este periculos să includă php parametru register_globals, shublog
Nu știu de ce ... nu, de ce nu include o directivă register_globals știu, și nu știu de ce în literatura de specialitate, de regulă, despre ea nu spune nimic.

De obicei, scrie că nu se recomandă utilizarea (dacă există scriere - Ed.), Și toate. Ca urmare, de la sine, un programator care începe pur și simplu nu a dat seama de consecințele utilizării register_globals.

In acest articol voi încerca să iasă din rezervor toți cei care stau în ea, și să explice ce este ceea ce (mai ales pentru cei care sunt în tren. - nn). Toate aceleași, nu e de mirare unele gazde dezactiva această directivă. Deci ...

Despre cum funcționează

Setările PHP (php.ini fișier) este astfel Directiva register_globals. Sensul său stă în faptul că, dacă este activată (register_globals = pornit), toate variabilele transmise prin GET sau POST, și va fi înregistrată automat ca la nivel mondial. Ce înseamnă?

De exemplu, vom trece un script index.php Metoda GET o pagină de valoare: index.php pagina = 2 ?. Valoarea transmisă este stocată în matrice GET și pot fi utilizate în script-uri, cum ar fi $ _GET [ „pagina“]. Cu toate acestea, dacă am activat register_globals, apoi treci o valoare la pagina $, care este accesibil în orice parte a script-ul index.php va fi creat.

O mică sumă și adăugare. În cazul în care register_globals creează trei copii ale variabilei: în matrice GET, a GLOBALS matrice și o variabilă în sine ($ _GET [ „pagina“], $ GLOBALS [ „pagina“], pagina $), în timp ce oprit valoarea register_globals trecut poate Acesta este disponibil numai printr-o serie de GET ($ _GET [ „pagina“]). Amintit.

Să considerăm un exemplu simplu pentru a înțelege că strălucească (3 până la 5 ani. - nn). Pentru a face mai ușor, trebuie să spun că datele de conectare $ și $ parola - Această variabile au trecut metoda GET / POST.

Pe scurt despre ce face script-ul:

Linia 2 face o cerere către baza de date cu scopul de a obține parola curentă pentru ID-ul de utilizator selectat.

Linia 3: Ia parola și atribuiți-l la un $ real_pass variabilă.

Linia 4: Comparați prezent și parola furnizate și în cazul în care se potrivesc, verificarea $ variabilă va fi setată adevărat.

Scenariul propus, prin definiție, cel mai sfânt în lume și acum am de gând să-ți arăt aceste găuri. Stare - register_globals este activat.

Să presupunem că există un transfer de metoda GET. Apoi, URL-ul va arăta similar cu următorul:
www.site.com/index.php?login = adminPassword = qwerty
Este clar că creează imediat o conectare la nivel mondial variabilă $ și $ parola. Și acum, uita-te la script-ul. În ea există un cec $ variabila. Și dacă trec printr-o adresă URL?

Cred că cineva a avut o întrebare, și în cazul în care instalația de cracare știu despre verificare de variabilă, ea este responsabil pentru tot? Dacă nu aveți unul pentru a arăta un scenariu, este puțin probabil să știe. Cu toate acestea, nu toate folosesc script-uri proprii, CMS, etc, și se bucură de ceea ce avem în rețea. În astfel de cazuri, de cracare, de exemplu, pot explora codul CMS și de a face atacuri asupra site-urile create cu ajutorul ei.

Cu toate acestea, nu toate hosterii register_globals este oprit, chiar dacă scripturile vor fi încarcerați la nici incluse register_globals, pirolizei ar putea rupe în continuare în scenariu, folosind o vulnerabilitate a acestei directive.

Luați exemplul nostru. Să-l protejeze în cazul register_globals este activată, este necesar, după linia if ($ parola == $ real_pass) $ cec = true; pentru a adăuga următoarele: $ = false cec altceva;. În acest caz, chiar dacă metoda GET va fi transferat la verificarea variabilă egală cu o, apoi script-ul cu parola incorectă se va instala în continuare cec $ = false.

Oh, și mă voi întoarce atenția asupra faptului că, dacă opriți register_globals este, că exemplul nostru nu va funcționa. Și pentru a face să funcționeze, este necesar să se scrie un script $ autentificare = $ _POST [ „conectare“]; $ Parola = $ _POST [ 'parola'];

și două concluzii principale:

1) Când este pornit register_globals poate transmite o varietate de variabile pentru care valorile obținute prin GET sau POST nu este calculată.

2) register_globals Nu atât de mult periculos în sine, cum strâmbă scenariu scris.

Vă dorim o săptămână de succes
Alexander Shuisky

articole similare