Verlässliche Aussage zu Predefined Variables gesucht
Tom
- php
Hello,
wo finde ich denn eine verlässliche Aussage darüber, welche Predefined Variables wann zur Verfügung gestellt werden?
unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.
$_SESSION ist nur vorhanden, wenn eine Session gestartet wurde.
Wenn ich mich richtig erinnere, war $_FILES früher auch nur vorhanden, wenn Files hochgeladen wurden bzw. zumindest ein Versuch dazu unternommen worden war. Jetzt ist es immer vorhanden, genauso wie $_COOKIE. Oder irre ich mich da?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Tach,
unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.
steht im ersten Punkt unter Notes: "By default, all of the superglobals are available but there are directives that affect this availability. For further information, refer to the documentation for variables_order."
mfg
Woodfighter
Hello,
unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.
steht im ersten Punkt unter Notes: "By default, all of the superglobals are available but there are directives that affect this availability. For further information, refer to the documentation for variables_order."
Ja eben. Das steht da.
Aber $_SESSION ist nur vorhanden, wenn auch eine Session gestartet wurde.
Und mMn war das früher mit $_FILES auch so. Ich versuche nun, herauszufinden, ob ich mir das nur einbilde, oder seit wann das nicht mehr so ist.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
unter http://www.php.net/manual/en/language.variables.superglobals.php finde ich jetzt nicht wirklich etwas, oder habe es überlesen.
steht im ersten Punkt unter Notes: "By default, all of the superglobals are available but there are directives that affect this availability. For further information, refer to the documentation for variables_order."
“are available” interpretiere ich hier eher in Bezug darauf, welche dieser Arrays zur Verfügung gestellt werden - unabhängig davon, ob mit Daten gefüllt oder nicht.
variables_order schränkt ja auch nur Environment, Get, Post, Cookie und Server ein - auf Session oder Files hat es überhaupt keine Auswirkung.
Und vom Geltungsbereich dieser Option her kann sich “Setting to "" means no superglobals will be set” ja auch nicht auf Session oder Files beziehen, das wäre ja unsinnig.
MfG ChrisB
Hi!
Wenn ich mich richtig erinnere, war $_FILES früher auch nur vorhanden, wenn Files hochgeladen wurden bzw. zumindest ein Versuch dazu unternommen worden war. Jetzt ist es immer vorhanden, genauso wie $_COOKIE. Oder irre ich mich da?
Wie testest du denn das Vorhandensein?
Lo!
Hello,
Wenn ich mich richtig erinnere, war $_FILES früher auch nur vorhanden, wenn Files hochgeladen wurden bzw. zumindest ein Versuch dazu unternommen worden war. Jetzt ist es immer vorhanden, genauso wie $_COOKIE. Oder irre ich mich da?
Wie testest du denn das Vorhandensein?
Ich lasse mir $GLOBALS anzeigen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Wie testest du denn das Vorhandensein?
Ich lasse mir $GLOBALS anzeigen.
Ok, sind also vom auto_globals_jit nicht betroffen sondern ständig da. Hätte ja sein können, dass du ihre Existenz befragst und sie dann erst auftauchen (wie $_ENV).
Was ist eigentlich das Problem an dem du forschst?
Lo!
Hello,
Wie testest du denn das Vorhandensein?
Ich lasse mir $GLOBALS anzeigen.Ok, sind also vom auto_globals_jit nicht betroffen sondern ständig da. Hätte ja sein können, dass du ihre Existenz befragst und sie dann erst auftauchen (wie $_ENV).
Was ist eigentlich das Problem an dem du forschst?
Es geht mir im Wesentlich nur darum, ob man direkt nach dem Scriptstart
if($_FILES)
oder
if ($_POST)
usw.
benutzen darf, ohne eine Notice zu kassieren.
Bei $_SESSION geht es eben nicht. Und ob das jetzt bei $_FILES abgesichert ist, versuche ich eben herauszufinden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Es geht mir im Wesentlich nur darum, ob man direkt nach dem Scriptstart
if($_FILES)
oder
if ($_POST)
benutzen darf, ohne eine Notice zu kassieren.
Bei $_SESSION geht es eben nicht.
Sessions müssen sowieso mit session_start() eröffnet werden. Erst dann ist die Infrastruktur für $_SESSION initialisiert. Ohne das Starten weiß PHP nicht, ob und wenn ja welche Session-Datei zu öffnen ist.
Lo!
Hello,
Wie testest du denn das Vorhandensein?
Ich lasse mir $GLOBALS anzeigen.
register_long_arrays = off
Außerdem habe ich vorher (optional) noch derartige Zeilen eingebaut, damit durch den Erstzugriff die Arrays auch erzeugt werden. Ohne den Zugriff ist $_SERVER in $GLOBALS nicht vorhanden/nicht sichtbar.
Bei $_SERVER klappt das auch; es wird dann in $GLOBALS auch sichtbar. $_SESSION wird nicht sichtbar. $_FILES ist immer vorhanden. Darum geht es hier: ob das jetzt sicher ist und so bleibt, dass $_FILES immer vohanden und von Anfang an sichtbar ist.
echo '<p>'.((isset($_SESSION))?'$_SESSION ist vorhanden':'$_SESSION ist nicht vorhanden').'</p>';
echo '<p>'.((isset($_SERVER))?'$_SERVER ist vorhanden':'$_SERVER ist nicht vorhanden').'</p>';
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Ohne den Zugriff ist $_SERVER in $GLOBALS nicht vorhanden/nicht sichtbar.
Wegen auto_globals_jit. Gilt auch für $_ENV, braucht aber k(aum )einer.
Bei $_SERVER klappt das auch; es wird dann in $GLOBALS auch sichtbar. $_SESSION wird nicht sichtbar.
$_SESSION ist immer erst da, wenn du die Voraussetzung mit session_start() oder session.auto_start geschaffen hast.
Lo!
Hello,
Ohne den Zugriff ist $_SERVER in $GLOBALS nicht vorhanden/nicht sichtbar.
Wegen auto_globals_jit. Gilt auch für $_ENV, braucht aber k(aum )einer.
Bei $_SERVER klappt das auch; es wird dann in $GLOBALS auch sichtbar. $_SESSION wird nicht sichtbar.
$_SESSION ist immer erst da, wenn du die Voraussetzung mit session_start() oder session.auto_start geschaffen hast.
Aus Erfahrung weiß ich das auch.
Aber wo steht es dokumentiert, welche globale Variable welches Verhalten hat?
Und meine ursprüngliche Frage, ob $_FILES auch schon immer sofort zur Verfügung stand, oder früher auch nur angelegt wurde, wenn ein Upload(versuch) stattgefundn hatte, kann mir die jemand beantworten?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Und meine ursprüngliche Frage, ob $_FILES auch schon immer sofort zur Verfügung stand, oder früher auch nur angelegt wurde, wenn ein Upload(versuch) stattgefundn hatte, kann mir die jemand beantworten?
In PHP 4.3.11 gibt es $_FILES und $HTTP_POST_FILES auch ohne Upload. (POST gibt es auch bei GET-Requests, insofern ist das Vorhandensein von FILES ohne Upload keine Besonderheit.)
Lo!
Hello,
Und meine ursprüngliche Frage, ob $_FILES auch schon immer sofort zur Verfügung stand, oder früher auch nur angelegt wurde, wenn ein Upload(versuch) stattgefundn hatte, kann mir die jemand beantworten?
In PHP 4.3.11 gibt es $_FILES und $HTTP_POST_FILES auch ohne Upload. (POST gibt es auch bei GET-Requests, insofern ist das Vorhandensein von FILES ohne Upload keine Besonderheit.)
Na gut. Dann will ich jetzt mal gutmütig annehmen, dass generell gilt:
$_GET
$_POST
$_COOKIE
$_FILES
... ## $_REQUEST lasse ich hier bewusst aus.
stehen immer bei Scriptstart zur Verfügung
$_SERVER
$_ENV
werden bei einem Zugriff auf die Arrays sofort aus dem Environment erzeugt
$_SESSION
ist nur vorhanden, wenn eine Session gestartet wurde (oder man es unqualifizert selber angelegt hat)
Damit wäre die Abfrage, ob Elemente enthalten sind, bei den ersten sechs also generell erlaubt, ohne Gefahr zu laufen, eine Notice zu kassieren:
if ($_*)
bzw. eben der sofortige Zugriff mit count() auf die Arrays.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
$_SERVER
$_ENV
werden bei einem Zugriff auf die Arrays sofort aus dem Environment erzeugt
Gilt seit PHP 5.0.0, wenn auto_globals_jit aktiviert ist.
Damit wäre die Abfrage, ob Elemente enthalten sind, bei den ersten sechs also generell erlaubt, ohne Gefahr zu laufen, eine Notice zu kassieren:
if ($_*)
bzw. eben der sofortige Zugriff mit count() auf die Arrays.
Warum nimmst du nicht empty()?
Lo!
Hello,
if ($_*)
bzw. eben der sofortige Zugriff mit count() auf die Arrays.Warum nimmst du nicht empty()?
Das ist in diesem Fall tatsächlich zu überlegen, da hier ja keine Leerzeichen oder 0 als Inhalt zulässig sind. Es ist auch sprachlich "selbstdokumentierender".
Bleibt nur noch die Frage, welche Injection noch möglich wäre, wenn Register_Globals noch eingeschaltet ist. Könnte man z.B $_FILES dann von außen einschleusen? Kann ein beliebiges Typformat[1] sein. Wenn es zum Scriptstart verlässlich angelegt wird, müsste es ja jede Einschleppung von außen überschreiben, oder? Damit wäre dann auch immer der Datentyp "Array" sichergestellt.
Ich kann gerade nicht testen...
[1] Gibts ein besseres Wort dafür? soll heißen: verlustfrei umwandelbar in den Zieltyp
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Warum nimmst du nicht empty()?
Das ist in diesem Fall tatsächlich zu überlegen, da hier ja keine Leerzeichen oder 0 als Inhalt zulässig sind. Es ist auch sprachlich "selbstdokumentierender".
Leerstring, nicht Leerzeichen. Letztere wären nicht empty().
Bleibt nur noch die Frage, welche Injection noch möglich wäre, wenn Register_Globals noch eingeschaltet ist.
Keine, wenn du deine Variablen immer schön initialisierst.
Könnte man z.B $_FILES dann von außen einschleusen?
Nein, die vordefinierten Arrays werden damit nicht überschrieben. Diesen Bug hat man schon vor langer Zeit entfernt. Wenn du willst, kannst du die Namen dieser Arrays auf Existenz in $_REQUEST[...] abfragen, dann war das ein misslungener Versuch der Einschleusung.
Lo!
Hello,
Hi!
Warum nimmst du nicht empty()?
Das ist in diesem Fall tatsächlich zu überlegen, da hier ja keine Leerzeichen oder 0 als Inhalt zulässig sind. Es ist auch sprachlich "selbstdokumentierender".Leerstring, nicht Leerzeichen. Letztere wären nicht empty().
Stimmt :-)
Bleibt nur noch die Frage, welche Injection noch möglich wäre, wenn Register_Globals noch eingeschaltet ist.
Keine, wenn du deine Variablen immer schön initialisierst.
Diese initialisiert aber das System, nicht der Programmierer.
Könnte man z.B $_FILES dann von außen einschleusen?
Nein, die vordefinierten Arrays werden damit nicht überschrieben. Diesen Bug hat man schon vor langer Zeit entfernt. Wenn du willst, kannst du die Namen dieser Arrays auf Existenz in $_REQUEST[...] abfragen, dann war das ein misslungener Versuch der Einschleusung.
Die Frage kam auf, weil ich mir etliche Uploadscripte angeschaut habe in den letzten Wochen, um die typischen Fehler zu finden. Diese Möglichkeit hatte ich noch nicht ausgeschlossen, auch wenn ich nicht daran geglaubt habe :-)
Es gibt da wirklich ganz pfiffige Sachen und auch ganz grausame ;-)
Da die meisten aber nicht wirklich dokumentiert sind, weiß man selten, welche Gedanken dem Programmierer im Kopf herumgegangen sind, oder ob es nur "zufällig sicher" ist.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg