Verständinsfrage $_GET /$_Post Globals on oder off
Moses
- php
0 EKKi0 Moses0 Harlequin6 Vinzenz Mai1 Ingo Turski0 Moses
Hallo,
habe gleich noch eine zweite Frage - nur des Verständnisses wegen.
Es wird immer wieder diskutiert, daß Register Globals On gefährlich wäre - aber irgendwie verstehe ich das Problem nicht.
Habe eine variable $a
der Inhalt dieser Variablen wird entweder über url anhang oder formular gefüllt, da ist es doch vollkommen egal ob ich diese Variable direkt beziehe oder über $_GET[$a] oder $_POST[$a] - der Inhalt ist doch exakt der gleiche, oder???
OK, durch get/post kann ich sehen woher der Inhalt der Variablen kommt, aber das ist doch schon alles.
In beiden Fällen ist es doch gleichwichtig, wie ich im Script mit der Variablen umgehe also je nach Verwendungszweck (htmlspecialchars, etc. etc.) die Variable "entschärfe".
Welche zusätzliche Sicherheit bietet mir das Globals Off?
Bitte nicht böse sein - versuche es nur zu verstehen :-)
Grüße,
Moses
Mahlzeit,
Habe eine variable $a
WO hast Du die?
der Inhalt dieser Variablen wird entweder über url anhang oder formular gefüllt, da ist es doch vollkommen egal ob ich diese Variable direkt beziehe oder über $_GET[$a] oder $_POST[$a] - der Inhalt ist doch exakt der gleiche, oder???
OK, durch get/post kann ich sehen woher der Inhalt der Variablen kommt, aber das ist doch schon alles.
Genau darum geht's: dass niemand Deine Variablen "von außen" manipulieren kann, sondern Du stattdessen die Werte explizit aus den genannten Arrays "abholen" musst (und sie dabei natürlich auf Gültigkeit usw. prüfen solltest).
In beiden Fällen ist es doch gleichwichtig, wie ich im Script mit der Variablen umgehe also je nach Verwendungszweck (htmlspecialchars, etc. etc.) die Variable "entschärfe".
Welche zusätzliche Sicherheit bietet mir das Globals Off?
Wenn "Globals = On" gesetzt ist, hättest Du, wenn Du z.B. einen URL-Parameter wie "?a=foobar" an Dein Skript anhängst, automagisch eine mit dem String "foobar" gefüllte Variable $a zur Verfügung. Das Problem daran ist, dass man damit beliebe Inhalte in Dein Skript einschleusen könnte, wenn Du Deine Variablen vor der ersten Benutzung nicht initialisierst.
Bitte nicht böse sein - versuche es nur zu verstehen :-)
Aber gerne doch.
MfG,
EKKi
Moin, moin,
Mahlzeit,
Habe eine variable $a
WO hast Du die?
In meinem Script ich will ja irgendwas mit $a machen - sonst bräuchte ich die nicht
Genau darum geht's: dass niemand Deine Variablen "von außen" manipulieren kann, sondern Du stattdessen die Werte explizit aus den genannten Arrays "abholen" musst (und sie dabei natürlich auf Gültigkeit usw. prüfen solltest).
Wenn "Globals = On" gesetzt ist, hättest Du, wenn Du z.B. einen URL-Parameter wie "?a=foobar" an Dein Skript anhängst, automagisch eine mit dem String "foobar" gefüllte Variable $a zur Verfügung. Das Problem daran ist, dass man damit beliebe Inhalte in Dein Skript einschleusen könnte, wenn Du Deine Variablen vor der ersten Benutzung nicht initialisierst.
ok hänge "?a=foobar" an
ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß ändert doch nichts am Inhalt von $a? Sprich die Variale ist genauso beliebig von außen manipulierbar: wenn ich jetzt böswillig "?a=<script>lösche Datenbank</script>" anhänge passiert das gleiche ob GLobals on oder Off gesetzt sind. Entweder ich überprüfe die Variable vor Gebrauch oder nicht (dann ist's blöd gelaufen) aber ob die Variable sofort zur Verfügung steht oder aus dem Array abgeholt werden muß macht doch keinen Unterschied - sorry ich peil's einfach nicht.
Grüße,
Moses
Yerf!
ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß ändert doch nichts am Inhalt von $a? Sprich die Variale ist genauso beliebig von außen manipulierbar: wenn ich jetzt böswillig "?a=<script>lösche Datenbank</script>" anhänge passiert das gleiche ob GLobals on oder Off gesetzt sind. Entweder ich überprüfe die Variable vor Gebrauch oder nicht (dann ist's blöd gelaufen) aber ob die Variable sofort zur Verfügung steht oder aus dem Array abgeholt werden muß macht doch keinen Unterschied - sorry ich peil's einfach nicht.
Das Problem sind nicht die Variablen, von denen du erwartest, dass sie per Post/Get kommen, sondern alle anderen. In PHP ist es möglich Variablen ohne vorherige Initialisierung zu verwenden. Ist dies der Fall, so kann jemand durch Modifizieren der URL dir ungünstige Werte in diese Variablen einbringen.
Oder anders Ausgedrückt: mit register_globals muss *absolut jede* Variable als potentiell gefährlich betrachtet werden.
Gruß,
Harlequin
Hi,
Das Problem sind nicht die Variablen, von denen du erwartest, dass sie per Post/Get kommen, sondern alle anderen. In PHP ist es möglich Variablen ohne vorherige Initialisierung zu verwenden. Ist dies der Fall, so kann jemand durch Modifizieren der URL dir ungünstige Werte in diese Variablen einbringen.
Oder anders Ausgedrückt: mit register_globals muss *absolut jede* Variable als potentiell gefährlich betrachtet werden.
Hmm, aber muß ich die Variablen nicht in meinem Script verarbeiten damit sie gefährlich werden?
also es kann doch nur gefährlich sein was angesprochen wird, also z.B.
"?a=inhalt&b=3&c=action";
<script>
<?php
mache was mit $a;
mache was mit $b;
mache was mit $c;
?>
wenn dann eine Variable angehängt wird, die keinen Sinn macht weil
im Script nicht vorkommend also z.B. "?d=fremdeingabe";
aber $d wird im Script nicht angesprochen - passiert doch auch nichts, oder?
Grüße,
Moses
Yerf!
wenn dann eine Variable angehängt wird, die keinen Sinn macht weil
im Script nicht vorkommend also z.B. "?d=fremdeingabe";
aber $d wird im Script nicht angesprochen - passiert doch auch nichts, oder?
Im Prinzip ja, aber man benutzt ja normalerweise in einem Skript nicht nur die Parameter sondern auch Hilfsvariablen. Wenn da eine nicht vorinitialisiert wurde wirds gefährlich (z.B. wenn man einen String immer nur mit $var += "text" aufbaut)
Man sollte beim Programmieren immer so vorgehen, dass möglichst viele Fehler bereits von vorneherein ausgeschlossen werden. Von daher solltest du die Tipps von Vinzenz beherzigen.
Gruß,
Harlequin
Hallo,
Man sollte beim Programmieren immer so vorgehen, dass möglichst viele Fehler bereits von vorneherein ausgeschlossen werden. Von daher solltest du die Tipps von Vinzenz beherzigen.
Das ist eh klar! :-) und ich teste bzw. "entschärfe" die Variablen auch vor gebrauch nur mir ist immer noch nicht ganz klar, wo die Gefahr liegt - habe anscheind ein großes Brett vorm Kopf....
Grüße,
Moses
Hallo Moses,
ok hänge "?a=foobar" an
ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß
Du solltest nicht
$a = $_GET['a']
schreiben. Du verschleierst die Herkunft. Verwende - soweit es geht - das
superglobale Array $_GET ( bzw. $_POST oder $_<usw>). Das sind _auch_ Variablen.
Wozu nochmals umkopieren?
Und ja: verlasse Dich nicht auf register_globals = off.
Initialisiere _grundsätzlich_ jede Variable, die Du benutzt.
Dann spielt der Wert von register_globals keine Rolle mehr, zusammengefasst:
Während der Entwicklung verwende die Einstellung error_reporting = E_ALL (und
display_errors = on) und programmiere so, dass Du keine einzige Notice bekommst.
Freundliche Grüße
Vinzenz
Hallo
Warum kann man nicht mehr als einmal "fachlich hilfreich" vergeben?
Du solltest nicht
$a = $_GET['a']
schreiben. Du verschleierst die Herkunft. Verwende - soweit es geht - das
superglobale Array $_GET ( bzw. $_POST oder $_<usw>). Das sind _auch_ Variablen.
Wozu nochmals umkopieren?Und ja: verlasse Dich nicht auf register_globals = off.
Initialisiere _grundsätzlich_ jede Variable, die Du benutzt.
Dann spielt der Wert von register_globals keine Rolle mehr, zusammengefasst:
- Programmiere so, als sei register_globals = off, d.h. greife auf $_GET['a']
und nicht auf $a zu.- Programmiere so, als sei register_globals = on, d.h. initialisiere jede
selbstdefinierte Variable, die Du benutzt, damit Dir nicht jemand Werte
unterjubeln kann.Während der Entwicklung verwende die Einstellung error_reporting = E_ALL (und
display_errors = on) und programmiere so, dass Du keine einzige Notice bekommst.
Achja, und: Warum kann man nicht mehr als einmal "fachlich hilfreich" vergeben?
Tschö, Auge
Hi,
ob $a sofort verfügbar ist, oder erst "abgeholt" werden muß ändert doch nichts am Inhalt von $a? Sprich die Variale ist genauso beliebig von außen manipulierbar: wenn ich jetzt böswillig "?a=<script>lösche Datenbank</script>" anhänge passiert das gleiche ob GLobals on oder Off gesetzt sind.
nein. Du hast die wesentliche Aussage wohl überlesen:
dass man damit beliebe Inhalte in Dein Skript einschleusen könnte, wenn Du Deine Variablen vor der ersten Benutzung nicht initialisierst.
Wenn Dein Script z.B. so aussieht:
if(isset($_POST['passwort']) && $_POST['passwort']=='geheim') $admin=true;
und weiter hinten dann:
if(isset($admin) && $admin) #lösche Datenbank
dann kann bei register_globals=on ein User ?admin=1 an die URL hängen und prompt ist die Datenbank weg... (Schlampige Programmierer verzichten auch auf die isset-Abfrage, zumal wenn das error_reporting deaktiviert ist).
Es geht hierbei ja gar nicht um _erwartete_ URL-Variablen, sondern eben um Variablen, die vom Script selbst angelegt und genutzt werden.
Auch gerne gesehen:
$text .= $_GET['text']
bei register_globals=on ohne vorherige Initialisierung $text='' ist die Eingabe veredoppelt.
Ich hatte es auch schon mit einem CMS zu tun, das bei register_globals=on fehlerhaft lief, wenn ich ein Formularfeld mit einem vom Script verwendeten Namen eingebaut hatte. Wie ich dann gesehen hatte, umschifften andere Autoren dieses Problem durch kryptische Feldnamen wie xyztext... ;-)
freundliche Grüße
Ingo
Hi,
Wenn Dein Script z.B. so aussieht:
if(isset($_POST['passwort']) && $_POST['passwort']=='geheim') $admin=true;
und weiter hinten dann:
if(isset($admin) && $admin) #lösche Datenbank
dann kann bei register_globals=on ein User ?admin=1 an die URL hängen und prompt ist die Datenbank weg... (Schlampige Programmierer verzichten auch auf die isset-Abfrage, zumal wenn das error_reporting deaktiviert ist).
Ah! Jetzt kapiere ich so langsam! Ja, das Brett vorm Kopf war sogar größer als gedacht - Asche auf mein Haupt, manchmal brauche ich etwas länger....
Danke,
Moses