Register_Globals

Sasser

Erfahrenes Mitglied
Guten Abend!

Meine Scripte sind immer bisher sehr sorgfältig programmiert worden. D.h. jede Variable, welche nicht vom User beeinflusst werden soll, wird am Scriptanfang initialisiert.

Ich möchte nun ungern alles auf Register_Globals = Off umschreiben. Ab PHP 6 soll ja dies standartmäßig deaktiviert bleiben.

Gibt es eine Möglichkeit, ein Script welches keine Superglobalen Variablen nutzt ohne großen Aufwand auch dann noch am Laufen zu halten?

Ehrlich gesagt finde ich es einfacher und auch schöner auf $_GET und $_POST zu verzichten. Und meiner Ansicht nach, sollte ein Script auch sicher programmiert werden, sodass es auch sicher mit Register_Globals = On läuft.

Was haltet ihr davon, wenn man am Anfang des Scripts einfach $_POST und $_GET in Variablen umwandelt?

PHP:
foreach($_GET AS $key => $value) {
   ${$key} = $value;
}

Vielen Dank für eure Anregungen.
 
Zuletzt bearbeitet:
Und wie genau schaltest du deine Skripte auf sicher bei Register_Globals?
Wie prüfst du, ob eine Variable wirklich aus deiner Config Datei kommt und nicht durch die URL beeinflusst wurde?
Wie prüfst du, ob eine Variable wirklich aus dem Formular kommt oder gerade über die URL eingegeben wurde und jetzt per F5 gespammt wird?

Das Verlassen auf register_globals ist bereits seit PHP 5.3 als "deprecated" eingestuft, also seit 2 Jahren. Wer dieses Feature heute noch nutzt, öffnet sinnlose Sicherheitslücken.

Dies also als Warnung an alle die sich der folgenden Lösung bedienen wollen...

EGPCS
PHP:
<?php
$variables = array('_GET', '_POST', '_COOKIE');

foreach($variables as $variable)
{
	$ext = ${$variable};
	if(is_array($ext))
	{
		extract( $ext );
	}
}
?>
 
Guten Abend!

Am Beispiel von einer Schleife mache ich das z.B. so, dass ich am Scriptanfang die Variable $i auf 0 setze (nur als Beispiel). Versteht mich nicht falsch, aber wenn ein Script so programmiert wurde, sodass man alle übergebenen Daten per POST akzeptiert und nicht prüft, dann bringt das Register_Globals auf Off auch nichts mehr oder?

Ich finde es einfach sehr umständlich alles auf superglobale Variablen Umzustellen, da z.B. teilweise Daten per POST und GET an das selbe Script übermittelt werden. In diesem Fall müsste ich nun prüfen, ob die Daten per Post oder Get übertragen wurden und demensprechend die richtige Variable nutzen. In einigen Fällen ist es doch vorteilhaft Register_Globals zu nutzen oder?
 
Nein, es ist immer zu Lasten der Sicherheit.

Beispiel:

config.php
PHP:
<?php
$dbuser = 'root';
$dbpass = 'test';
?>

Diese inkludierst du jetzt in dein Hauptscript, index.php
Aufruf: index.php?dbpass=123

Und dein $dbpass ist überschrieben! Das ist das Problem dabei. Wäre es nur $_GET['dbpass'] hättest du damit überhaupt kein Problem.
Anderes Beispiel...

Noch dazu kannst du in Teufelsküche kommen, wenn die "variables_order" nicht richtig konfiguriert ist und etwa Cookie Daten durch die URL überschrieben werden können.

Ergo ist es nie vorteilhafter, sondern einfacher für faule Programmierer.
 
Ich sehe es auch als Sicherheitsrisiko.
$_GET & $_POST könntest du ja beispielsweise zusammenführen:
Code:
$get_u_post = array_merge($_GET, $_POST);
 
Ich vestehe schon, was du meinst.

Zu deinem ersten Beispiel:

Ich habe das einmal getestet mit der Include-Datei, aber bei mir lässt sich das nicht überschreiben. Wenn ich am Anfang des Scripts eine Datei mit Variablen include, dann überschreibt diese doch automatisch eventuell übergebene Variablen oder nicht?

PHP:
// datei.php
$test = "Gut!";

PHP:
$test = "Böse!";

include ( "datei.php" );

echo $test; // Gibt Gut! bei mir aus
 
Hast Recht, schlechtes Beispiel, bin übermüdet. Ich klau jetzt einfach das von php.net ;)

PHP:
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>
 
Hallo!

Ich verstehe die ganze Aufregung nicht.
Als ich vor 5 Jahren meine ersten Schritte in PHP gemacht habe, wurde schon darauf hingewiesen dass register_globals ein Sicherheitsrisiko darstellen kann (darum habe ich mir auch gleich angewöhnt mit den Superglobalen zu arbeiten).
Und bis PHP 6 zum "Standard" wird, wird sicherlich auch noch einige Zeit dauern.
Es sollte also genug Zeit sein um sich umzugewöhnen und seine Scripte anzupassen..... wenn man sie nicht eh komplett neu entwickelt.
Ausserdem hast Du ja auch die Möglichkeit einen eigenen Server zu betreiben..... dann hast Du die freie Wahl ob Du die nächsten 10 Jahre bei PHP 5.x bleibst oder Dich doch umgewöhnst. ;)

Irgendwann wirst Du Dich wohl eh umgewöhnen müssen..... und sei es nur weil Du unbedingt Möglichkeiten nutzen willst, die Dir erst ab PHP 6 zur Verfügung stehen.
Warum also nicht "schon" jetzt umgewöhnen?
Noch hast Du Zeit..... später muss alles schnell schnell gehen, weil Du keine Wahl mehr hast.
Meiner Meinung nach ist die Zeit die Du jetzt in die Suche für irgendwelche "Hacks" reinsteckst, besser in die Umgewöhnung investiert. ;)

Gruss Dr Dau
 
Ok, ich wurde überredet...

Nochmals eine Frage hierzu; Ich bearbeite meist den Inhalt der Variable nochmals, bevor ich diese weiterverarbeite. Welches der beiden Beispiele würdet Ihr nutzen:

1. Version
PHP:
$name = str_replace ( "#", "+", $_POST ["name"] );
echo "<input type='text' name='name' value='" . $name . "'>";

2. Version
PHP:
$_POST ["name"] = str_replace ( "#", "+", $_POST ["name"] );
echo "<input type='text' name='name' value='" . $_POST ["name"] . "'>";
 
Brauchst du die Variable danach nochmal in der gleichen Form?

Falls nein, gar nicht speichern.

PHP:
echo "<input type='text' name='name' value='" .  str_replace ( "#", "+", $_POST ["name"] ) . "'>";
 
Zurück