phpbar.de logo

Mailinglisten-Archive

[php] GET/POST/COOKIE VARS nicht identifizierbar (war: Re: [php] Danke)

[php] GET/POST/COOKIE VARS nicht identifizierbar (war: Re: [php] Danke)

Ulf Wendel ulf_(at)_redsys.de
Thu, 17 Feb 2000 09:44:38 +0000


Oliver Kummerow wrote:
> www.domain.tld?$HTTP_COOKIE_VARS=nix
> und wech ist das Cookie-Array.
> 
> Die globalen Variablen sind noch da, aber man weiß nicht mehr, welcher
> Herkunft sie sind. Es wäre besser, wenn diese 3 Parameterarrays
> schreibgeschützt wären, dann würde das Problem nicht auftreten.

Hallo Oliver, 

ich sehe es genauso ähnlich wie Tobias, das ist irgendwo zwischen Bug
und Feature-Request. Diese Arrays sollten schreibgeschützt sein. Reichst
Du den Bug bitte ein?

Tobias betont jedoch zurecht, daß diese Arrays notwendig sind. 

PHP rotzt alle Werte aus den entsprechenden Arrays in den globalen
Namespace. Programmierer vieler anderer Sprachen werden darüber
schockiert sein. Ohne Vorwarnung werden Variablen überschrieben und noch
schlimmer: es werden u.a. Daten aus der URL ausgelesen. Wenn wir uns
erinnern, welche Angriffe einst über die Manipulation von URL's möglich
waren und wieviele Warnungen der Perl Programmierer heute noch in den
Dokumentationen findet, kann man es nur begrüßen, daß der PHP Einsteiger
von all dem nichts wissen muß. 

Wenn Du mal einen Blick in den PHP Source wirfst, wirst Du sehen, daß
die Verarbeitung der GET/POST/COOKIE/UPLOAD (wer hilft mir aus mit dem
korrekten Wort...) Daten sehr früh geschieht und ein Blick in die
Archive wird zeigen, daß niemand einen Bug in diesem Code lange
unbeantwortet läßt. Es tut einfach, ist sauschnell und vereinfacht die
Angelegenheit.

Da man nach dem Import der Daten in den globalen Namespace nicht mehr
die Herkunft der Daten erkennen kann, kann man entweder ein Bundle von
Funktionen zur Verfügung stellen oder man greift zur schnellen Variante
und definiert globale Arrays. Letzteres ist sicherlich nicht nur
einfacher zu implementieren, sondern auch verständlicher für den
Einsteiger. 

Den Weg den PHP beschritten hat, kann ich nachvollziehen und
unterstützen. Was jedoch nichts an der Tatsache ändert, daß diese Arrays
schreibgeschützt sein sollten. Du hast tatsächlich einen Bug gefunden.

Wofür braucht man diese Arrays?

- Herkunftsbestimmung
- Bewußte Ignorierung und Manipulation von Daten
- Skriptseitige (wie PHPLib) Sessionimplementierungen

Die Herkunftsbestimmung mag bei der Fehlersuche sinnvoll sein und für
Sicherheitsfanatiker auch zur Abwehr von Manipulationsversuchen. Ich
kenne zwar die Reihenfolge der Verarbeitung der unterschiedlichen Daten
(POST/GET/COOKIE) nicht aus dem Kopf, könnte mir aber vorstellen, das
einige besonders gewitzte Zeitgenossen aus Langeweile versuchen mit URL
oder Cookiemanipulationen ein Skript aus dem Konzept zu bringen.
Wenngleich es reine Glückssache ist, eine Variable zu erraten, die
überschrieben werden kann...

Die bewußte Ignorierung und Manipulation wird bei mehrdimensionalen
Arrays in Formularen gerne verwendet. PHP3 ist aus eindimensionale
Arrays in Formularen beschränkt. Man schreibt als name für das HTML
Formularfeld kunde[vorname] oder kunde[] und erhält ein Array.
Mehrdimensionale Konstrukte werden von PHP3 noch nicht unterstützt
kunde[1][vorname] ist derzeit nur über einen Umweg lösbar:
kunde_1_[vorname]. Um das wieder in ein mehrdimensionales Array zu
wandeln, benötigt man $HTTP_POST/GET_VARS. Die Arrays werden geparst und
manipuliert.

Letztlich sind die Arrays auch in der PHPLib von zentraler Bedeutung.
Jedes Skript, welches von den Session Funktionalitäten der PHPLib
gebrauch macht -muß- am Anfang den Funktionsaufruf page_open() und am
Ende page_close() haben. Diese Funktionen kümmern sich um die
Authentifizierung, die Session-ID und die Speicherung der registrierten
(in der Session zu speichernden) Variablen und Objekte. page_open()
importiert auch die Sessionvariablen. Hierbei kann es vorkommen, daß
neue Formulardaten mit alten Sessiondaten überschrieben werden. Der
einzige Ausweg besteht darin, die HTTP_x_VARS zu scannen und die Daten
erneut zu importieren. Hierfür sind die reimport_x_vars() Funktionen in
der PHPLib vorhanden. Vielleicht noch eine Anmerkung zu diesen
Funktionen: besonders schlau sind sie nicht, bei komplexeren Aufgaben
wird man sie durch eigene Funktionen ersetzen müssen.

PHP hat einen der möglichen Wege eingeschlagen. Das Verfahren ist
inzwischen so tief in der Sprache verwurzelt, daß keine Änderung mehr
möglich ist und auch nicht notwendig scheint. Nur schreibgeschützt...

Ulf


php::bar PHP Wiki   -   Listenarchive