global_vars = off

peeed

Grünschnabel
Ich habe schon öfter gelesen, dass man in der php.ini den Eintrag global_vars auf off stellen soll. Hat das Sicherheitsgründe? Wäre nett, wenn mir das jemand erklären könnte oder mir einen link geben kann, wo das erklärt ist. Habe leider nix gefunden.

Danke
 
PHP-FAQ hat gesagt.:
Seit PHP 4.2.0 wurde register_globals in der php.ini per Default abgeschaltet. Die Option war dafür zuständig, dass ein Parameter an das Script automatisch in eine entsprechend genannte Variable kopiert wurde. Ein Angreifer hat damit jedoch die Möglichkeit, Variablen, die der Programmierer versehentlich uninitialisiert ließ, mit beliebigen Werten vorzubelegen.

Gruesse,
stanleyB
 
Einfaches Beispiel hierfür:

login.php:
PHP:
 if($user=="..." & $passwort="...") {
 	 $login = "OK";
 }
 if($login=="OK") {
 	header("Location: ...");
 }

Ein Angreifer, der die jetzt login.php?login=OK aufruft kommt direkt zur geheimen Seite.

DESHALB: register_globals immer auf off !
 
Allerdings muss man sagen, dass register_globals = off vor allem dazu dient, den Entwickler vor sich selber zu schützen; wenn man sauber programmiert ist es meist auch möglich, mit register_globals = on sichere Scripte zu produzieren.
 
Hier mal ein kleines Script zum testen der Einstellung.
Allgemein empfiehlt es sich fuer register_globals=off zu entwickeln, denn dann laeuft es auch noch wenn man mal den Provider wechselt.
Fuer ein Entwicklungssystem ist es ganz gut PHP so restriktiv wie moeglich einzustellen.
Also register_globals=off, SafeMode an, ErrorLogging=E_ALL und so weiter.
So kann man dann davon ausgehen, dass das Script nachher in fast jeder Umgebung laeuft.
 
Ersteinmal Danke an alle, die mir geantwortet haben.

Eine Frage noch: Wenn ich mit

PHP:
 foreach($_GET as $var=>$value){
    $var = $value;
}

die Variablen auslese, damit ich Sie weiterhin unter dem "normalen" Namen zur Verfügung habe, birgt das das gleiche Risiko, oder?
 
peeed hat gesagt.:
..., birgt das das gleiche Risiko, oder?
Ja.
Du solltest nur die Variablen aus den Parametern übernehmen (wenn Du nicht im ganzen Skript mit $_GET und $_POST arbeiten willst), die das Skript auch erwartet. In einem Skript, was den Login prüft und nur Passwort und Benutzername benötigt, solltest Du auch nur diese auslesen:
PHP:
$username=(isset($_POST['username'])?$_POST['username']:'');
$password=(isset($_POST['password'])?$_POST['password']:'');
Gruß hpvw
 
Zurück