Harry: PHP Bug: ectype="multipart/form-data" -> $_POST Verlust

Beitrag lesen

Holladiewaldfee,

Die Sau ist grob gesagt der enctype. Der Effekt tritt erst ab 4.2.0 auf,
Ah, welcher ist denn genau falsch, und welcher richtig, und wieso habe ich das bisher ausschließlich auf einem System mit winXP und IE6 beobachtet?

Meine Beobachtungen waren: Alle Browser, Win98, Win2k, WinXP, FreeBSD 4.4, 4.6. Da ich danach mit der Seite nicht mehr weitergearbeitet habe weiß ich nicht, wie sich's bei anderen Versionen verhält, ich tippe aber ähnlich. Allerdings muß ich eingestehen daß der Server immer ein Apache war und ich kann auch nicht mehr sagen, ob ein 2er Apache dabei war, ich glaube aber schon.

http://bugs.php.net/bug.php?id=17958 war damals einer der Bug-Reports, wo es um diesen Bug ging. Da gab's aber noch mehr ...

Das Script mit dem ich den Fehler damals hatte (ob er heute noch auftritt weiß ich nicht, muß ich mal wieder ausprobieren), ließ sich wirklich bis auf das absolute Grundgerüst runter vereinfachen:

--
<html>
<head><title>TEST</title></head>
<body>
<?php vardump($_POST); ?>
<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="blahr" value="x">
<input type="submit" value="ok">
</form>
</body>
</html>
--

Wichtig war nur, daß der enctype dabei war.
$_POST war öfter mal leer. Als ich damals probehalber ein Downgrade auf 4.1.x gemacht hab lief die Sache wieder ohne Probleme.

Irgendjemand hatte damals auch versucht das mit Ethereal durchzuziehen, und wenn ich mich recht erinnere hat der Browser die Daten halbwegs korrket abgeschickt (müßte auch noch der eine oder andere Thread im Archiv rumgammeln, gab's damals ein oder zwei dazu).

nachdem die Behandlung von $_POST neu in PHP implementiert wurde.
Hm. Bin mir gar nicht sicher dass es nur bei POST passiert. Ich habe auch noch eine Rewrite-Rule des Apachen dazuwischen, hm ist wirklich schwierig.

Ich hatte keine dazwischen. Und wie gesagt, obiger Code ist extrem einfach ...

Ich habe damals zu den ersten gehört, die den Bug entdeckt und gemeldet haben.
Du bist Dir ganz sicher dass es sich hier um einen PHP-Bug handelt?

Oder Apache im Zusammenspiel mit der neuen PHP-Version, also im Endeffekt doch PHP.

Tritt das mit allen Browsern auf?

Ja, allerdings mit dem IE deutlich häufiger als mit den anderen - was mich auch etwas stutzig macht.

Hast Du mal mit Ethereal geguckt ob der Browser auch alles richtig macht?

Ne.

Leider ist meine Architektur etwas komplexer, so dass ich nicht ohne weiteres sagen könnte was sich da genau abgespielt hat, dazu müsste ich mir die HTTP-Header ansehen - was allerdings zur Zeit nicht klappt da nicht reproduzierbar.

Meine war damals auch sehr komplex, da ging es um ein CM-System. Aber Du kannst ja mal bei Dir probieren, was obiger Code anrichtet. Und - das Ergebnis ist wirklich nicht immer reproduzierbar.

Hm, ist halt die Frage ob es wirklich ein PHP-Bug ist. Ich meine, wenn es ein Fehler in PHP ist, dann müsste sich dieses Fehlverhalten doch reproduzieren lassen, und das schaffe ich z.B. nicht. Gestern habe ich es sicher 50 mal geschafft - ungewollt...

Die Probleme fingen bei fast allen mit 4.2.0 an ... da hegt man schon irgendwie den Verdacht, daß PHP daran nicht ganz unbeteiligt ist.

Wenn ich halt 100% denselben Request an den Server schicke, dann muss der Server ja eigentlich auch 100% dasselbe damit machen, oder?

Das ist genau das, was einen Haufen Leute aus der Bahn geworfen hat - mich eingeschlossen. Nimm mal obiges Formular und hau ein paar mal hintereinander auf Submit - bei mir war es damals so, daß - je nach Browser - mal "x" dastand und mal halt nicht.

Dann weiß man - kommen die Daten vielleicht gar nicht bis ins Script? Vielleicht ein Problem mit der Server-Schnittstelle?...

Das ist auch meine Theorie, daß mit 4.2.0 irgendwas an der Schnittstelle geändert wurde, daß irgendwie zeitkritisch ist. Allerdings kenne ich mich da zu wenig mit den Interna aus, um das beurteilen zu können.

Ciao,

Harry

--
  Die ideale Zeit für Firntouren:
  http://harry.ilo.de/projekte/berge/