Mailinglisten-Archive |
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