Hakan: Affenformular

Hallo Leute,

ich hab da mal eine Frage:

Ich bau gerade ein Formular mit der Affentechnik bzw. Affenformular.
Info hierzu: www.de.wikipedia.org und einfach Affenformular eingeben.

Vereinfacht:
Form-Tag: method='POST' action='<?php print $_SERVER["PHP_SELF"]; ?>'

Text-Feld: value='<?php if (isset($_REQUEST['textfeld'])) echo htmlspecialchars($_REQUEST['textfeld']); ?>'

Das Formular ruft sich beim "action" selbst auf.

Dann wird eine Validierung des Textfeldes durchgeführt:
if(isset($_REQUEST['textfeld'])){
   if (strlen($_REQUEST['textfeld']) < 3){
      FEHLER!!!! Böse!!!
   }else{
      header("Location: weiter.php");
   }
}

Problem:
auf der Seite weiter.php werden keine Werte übergeben. Also $_REQUEST['textfeld'] ist nicht existend.

Liegt wohl daran, dass mit header keine POST-Variablen mit übergeben werden. Aber wozu ist dann dieses Affentheater sonst gut??

Gruß!

  1. Hallo Hakan,

    Du hast das Prinzip nicht verstanden. Du musst/solltest nicht auf weiter.php redirecten (was du im übrigren auch nicht richtig machst, Stickwort komplette URL) sondern du machst alles innerhalb der gleichen php-Datei (Sachen mit require/include einbinden geht natürlich). Das heißt, sowohl das Anfangsformular, als auch die Formularkontrolle, das Anzeigen von Formularfehlern und auch das Verarbeiten des Formulars sollte in der gleichen Datei stattfinden.

    Also nix mit weiterleitung.

    Jonathan

  2. Im übrigen haben alle Formulare (und allgemein alle Skripts), die $_SERVER['PHP_SELF'] unmaskiert übernehmen, ein XSS-Problem. Verwende htmlspecialchars() oder htmlentities(), oder gib das action-Attribut direkt an.

    1. Hallo,

      Was spricht dagegen es einfach leer zu lassen?
      <form action="" method="post">

      netten Tag
      ^da Powl

      --
      ===============================
      powl.hat-gar-keine-homepage.de/
      1. Hallo Powl,

        Was spricht dagegen es einfach leer zu lassen?
        <form action="" method="post">

        Das ist so meines Wissens nicht im Webstandard enthalten und führt auch zumindest im manchen Textbrowsern zu Problemen, die dann ne leere Seite oder sonstwas aufrufen.

        Jonathan

        1. Hallo,

          Das ist so meines Wissens nicht im Webstandard enthalten und führt auch zumindest im manchen Textbrowsern zu Problemen, die dann ne leere Seite oder sonstwas aufrufen.

          Validiert aber ohne Probleme XHTML 1.0 strict und das mit den Browser wäre mir neu. Wer zickt denn bei leerem action?

          netten Tag
          ^da Powl

          --
          ===============================
          powl.hat-gar-keine-homepage.de/
        2. Hello,

          Was spricht dagegen es einfach leer zu lassen?
          <form action="" method="post">

          Das ist so meines Wissens nicht im Webstandard enthalten und führt auch zumindest im manchen Textbrowsern zu Problemen, die dann ne leere Seite oder sonstwas aufrufen.

          Es ist enthalten.

          Es gibt dazu hier im Archiv einen Thread, in dem alle Möglichkeiten und ihre Folgen (mit Ausnahme der ['PHP_SELF']-Geschichte) diskutiert wurden und auch die passenden Stellen aus den RFCs herausgesucht wurden.

          Ein harzliches Glückauf

          Tom vom Berg

          --
          Nur selber lernen macht schlau
      2. Hallo,

        Was spricht dagegen es einfach leer zu lassen?
        <form action="" method="post">

        netten Tag
        ^da Powl

        Nichts, aber warum einfach, wenns auch schwer geht? :)
        Im ernst: Ich war bisher der Meinung, dass nicht alle Browser bei einem leeren action-Attribut die aktuelle URL aufrufen. Hab jetzt aber im Forum gestöbert und weiß es nun besser.

        1. Hallo Patrick,

          Im ernst: Ich war bisher der Meinung, dass nicht alle Browser bei einem leeren action-Attribut die aktuelle URL aufrufen. Hab jetzt aber im Forum gestöbert und weiß es nun besser.

          Nein du hast recht, das machen nicht alle Browser.

          Jonathan

          1. Hallo Patrick,

            Im ernst: Ich war bisher der Meinung, dass nicht alle Browser bei einem leeren action-Attribut die aktuelle URL aufrufen. Hab jetzt aber im Forum gestöbert und weiß es nun besser.

            Nein du hast recht, das machen nicht alle Browser.

            Jonathan

            Sicher? Wenn ich RFC 3986 richtig deute, sind alle leeren action-Attribute Same-Document References.

            1. Hallo

              Sicher? Wenn ich RFC 3986 richtig deute, sind alle leeren action-Attribute Same-Document References.

              Ich kann zwar weder bestätigen noch ausschließen, dass einzelne Browser damit Probleme haben, aber was nützt es, dem Standard zu genügen, wenn es die Browser eventuell nicht tun? Was spricht dagegen, den Namen der Seite z.B. mit $_SERVER["SCRIPT_NAME"], welches im Gegensatz zu $_SERVER["PHP_SELF"] nach heutiger Kenntnis sicher ist, oder hartkodiert explizit in das action-Attribut einzutragen?

              Tschö, Auge

              --
              Die deutschen Interessen werden am Liechtenstein verteidigt.
              Veranstaltungsdatenbank Vdb 0.2
              1. Hallo,

                ... aber was nützt es, dem Standard zu genügen, wenn es die Browser eventuell nicht tun?

                Pädagogik. ;) Der Browser soll dem Standard genügen. Das sollten die MSler 1000 mal an die Tafel schreiben.

                Was spricht dagegen, den Namen der Seite z.B. mit $_SERVER["SCRIPT_NAME"], welches im Gegensatz zu $_SERVER["PHP_SELF"] nach heutiger Kenntnis sicher ist, oder hartkodiert explizit in das action-Attribut einzutragen?

                Faulheit! (Da bin ich ehrlich. Die Zeit kann ich besser im Forum lurken.)
                Es ist ja auch konform es freizulassen.

                siehe hier Post 9

                netten Tag
                ^da Powl

                --
                ===============================
                powl.hat-gar-keine-homepage.de/
                1. Hello,

                  Faulheit! (Da bin ich ehrlich. Die Zeit kann ich besser im Forum lurken.)
                  Es ist ja auch konform es freizulassen.

                  Mann sollte sich aber darüber im Klaren sein, dass dann der alte Aufruf des Scriptes wiederholt wird, also die URi (nebst Get-Parametern und Path-Info) wiederverwendet wird.

                  Wenn man das nicht will, sollte man ein '#' einsetzen. Dann wird die alte URi mit der neuen überschrieben.

                  Ein harzliches Glückauf

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
              2. Hello,

                Ich kann zwar weder bestätigen noch ausschließen, dass einzelne Browser damit Probleme haben, aber was nützt es, dem Standard zu genügen, wenn es die Browser eventuell nicht tun? Was spricht dagegen, den Namen der Seite z.B. mit $_SERVER["SCRIPT_NAME"], welches im Gegensatz zu $_SERVER["PHP_SELF"] nach heutiger Kenntnis sicher ist, oder hartkodiert explizit in das action-Attribut einzutragen?

                $_SERVER['SCRIPT_NAME']

                enthält nur den Namen der Ressource, ohne Domain und ohne Pathinfo.
                Es ist also genau die passende Wahl für den Einsatzzweck.
                Dann sollte man aber auch noch auf

                $_SERVER['REQUEST']

                verzichten und gezielt

                $_GET
                oser
                   $_POST

                verwenden, es sei denn, dass es tatscählich egal ist, auf welche Weise die Parameter an den Server übergeben wurden.

                Ein harzliches Glückauf

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                1. Hi,

                  $_SERVER['SCRIPT_NAME']

                  enthält nur den Namen der Ressource, ohne Domain und ohne Pathinfo.
                  Es ist also genau die passende Wahl für den Einsatzzweck.

                  Auch damit kann man sich schoen ins Knie schiessen - wenn bspw. mod_rewrite zum Einsatz kommt, dann muss der Name der angeforderten Ressource mit dem SCRIPT_NAME nicht das Geringste gemein haben.

                  MfG ChrisB

                  1. Hello,

                    $_SERVER['SCRIPT_NAME']

                    enthält nur den Namen der Ressource, ohne Domain und ohne Pathinfo.
                    Es ist also genau die passende Wahl für den Einsatzzweck.

                    Auch damit kann man sich schoen ins Knie schiessen - wenn bspw. mod_rewrite zum Einsatz kommt, dann muss der Name der angeforderten Ressource mit dem SCRIPT_NAME nicht das Geringste gemein haben.

                    Und was steht dann in $_SERVER['PHP_SELF']?

                    Ein harzliches Glückauf

                    Tom vom Berg
                    http://bergpost.annerschbarrich.de

                    --
                    Nur selber lernen macht schlau
    2. Hello,

      Im übrigen haben alle Formulare (und allgemein alle Skripts), die $_SERVER['PHP_SELF'] unmaskiert übernehmen, ein XSS-Problem. Verwende htmlspecialchars() oder htmlentities(), oder gib das action-Attribut direkt an.

      oder benutze $_SERVER['SCRIPT_NAME']

      Das hat das 'Problem' mit der Path-Info nicht.
      Oder schalte beim Webserver (Apachen) die Pathinfo ab.

      Ein harzliches Glückauf

      Tom vom Berg

      --
      Nur selber lernen macht schlau
  3. Hallo Hakan,

    Problem:
    auf der Seite weiter.php werden keine Werte übergeben. Also $_REQUEST['textfeld'] ist nicht existend.

    Liegt wohl daran, dass mit header keine POST-Variablen mit übergeben werden. Aber wozu ist dann dieses Affentheater sonst gut??

    also, was in der Wikipedia dazu steht finde ich nicht sonderlich erhellend, bzw. vor allem das Beispiel finde ich ein wenig wirr. Man sollte das vielleicht mal ändern ...

    Schau doch mal auf FAQ der Newsgroups de.comp.lang.php.* - 27.2. Von HTML zu PHP: Schreibe Formularverarbeitungen in Normalform, dort steht ein Beispiel, das ganz ohne header() auskommt.

    Übrigens: Eine ähnliche Frage wurde hier kürzlich bereits beantwortet (auch damals stiftete dieser Wikipedia-Eintrag Verwirrung ...).

    Grüße aus Stockholm,
    Götz

    --
    Losung für Dienstag, 22. April 2008
    Wahrt das Recht und übt Gerechtigkeit; denn mein Heil ist nahe, dass es komme, und meine Gerechtigkeit, dass sie offenbart werde. (Jesaja 56,1)
    Siehe, jetzt ist die Zeit der Gnade, siehe, jetzt ist der Tag des Heils! (2.Korinther 6,2)
    (zur aktuellen Losung)