Martin aus Wien: <form action=""> vs. PHP_SELF

Wie es scheint, ruft ein Formular:
<form name="sowieso" method="post" action="">
die Datei auf, in der es steht.

Was ist der Vorteil von:
<form name="sowieso" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">

Gruß und Dank

Martin

  1. Hi Martin!

    Wie es scheint, ruft ein Formular:
    <form name="sowieso" method="post" action="">
    die Datei auf, in der es steht.

    Was ist der Vorteil von:
    <form name="sowieso" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">

    Bei Letzterem weißt du, was passiert.
    Wenn du das Attribut leer lässt, hängt es wahrscheinlich vom Browser ab.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  2. Moin!

    Wie es scheint, ruft ein Formular:
    <form name="sowieso" method="post" action="">
    die Datei auf, in der es steht.

    Das _mag_ sein.

    Was ist der Vorteil von:
    <form name="sowieso" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">

    Damit ist _auf jeden Fall_ die Datei gemeint, in der das Formular steht. Du kannst das ganze aber auch kürzer haben:

    <form name="sowieso" method="post" action="#">
    oder
    <form name="sowieso" method="post" action="?">

    Schönes Wochenende,
    Robert

    1. Hallo,

      <form name="sowieso" method="post" action="#">
      oder
      <form name="sowieso" method="post" action="?">

      Was soll daran besser sein, als an
      <form name="sowieso" method="post" action="">?

      viele Grüße

      Axel

      1. Moin!

        Mein Beitrag bezog sich u.a. auch auf H☼psels Ausführung.

        Schönes Wochenende,
        Robert

        1. Hallo,

          Mein Beitrag bezog sich u.a. auch auf H☼psels Ausführung.

          Meine Frage war ja, warum Du meinst, dass eine URI-Angabe "#" besser (Hopsel sagt sicherer in der Funktion) wäre, als "". Beide verlassen sich auf den selben Mechanismus. Deshalb sind beide gleich gut oder schlecht. Browser, die mit einem klar kommen, müssten auch mit dem anderen klar kommen. Der einzige Unterschied ist, dass die Variante "#" später versucht einen Anker anzuspringen.

          Die Variante "?" ist falsch, weil das Query-Fragezeichen nur in einer relativeURI oder einem hier_part vorkommen darf.
          http://www.faqs.org/rfcs/rfc2396.html
          relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]
          hier_part     = ( net_path | abs_path ) [ "?" query ]
          Beide dürfen nicht leer sein. Eine URI darf also nicht _nur_ das Fragezeichen enthalten.

          Für das sichere Funktionieren garantiert _keine_ der drei Varianten, weil es Browser geben kann, welche die base URI Regelung nicht korrekt umsetzen. Sicher ist also nur, mindestens eine wirkliche relativeURI anzugeben.

          viele Grüße

          Axel

          1. Moin!

            Mein Beitrag bezog sich u.a. auch auf H☼psels Ausführung.
            Meine Frage war ja, warum Du meinst, dass eine URI-Angabe "#" besser (Hopsel sagt sicherer in der Funktion) wäre, als "".

            Die Wege der Browserhersteller sind unergründlich. Ich weiß jedenfalls, dass man mit # auf der gleichen Seite bleibt – aber halt:

            <a href="#">ein Link</a>

            Dies führt dazu, dass die aktuelle Seite _nicht noch einmal aufgerufen wird_. Kann es sein, dass der Ansatz

            <form action="#" method="post" name="sowieso">

            nicht wie beabsichtigt funktioniert?

            Beide verlassen sich auf den selben Mechanismus. Deshalb sind beide gleich gut oder schlecht. Browser, die mit einem klar kommen, müssten auch mit dem anderen klar kommen. Der einzige Unterschied ist, dass die Variante "#" später versucht einen Anker anzuspringen.

            Sehr interessante Ausführungen in der verlinkten Seite. Was # anbetrifft weiß ich, dass mein obiges Beispiel dazu führt, dass der Browser nach ganz oben scrollt (# scheint also eine Art unbenannter Anker zu sein, der das gleiche wie das früher gebräuchliche #top bewirkt.)

            Die Variante "?" ist falsch, weil das Query-Fragezeichen nur in einer relativeURI oder einem hier_part vorkommen darf.
            http://www.faqs.org/rfcs/rfc2396.html
            relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]
            hier_part     = ( net_path | abs_path ) [ "?" query ]
            Beide dürfen nicht leer sein. Eine URI darf also nicht _nur_ das Fragezeichen enthalten.

            Genau das, wollte ich gerade fragen.

            Für das sichere Funktionieren garantiert _keine_ der drei Varianten, weil es Browser geben kann, welche die base URI Regelung nicht korrekt umsetzen. Sicher ist also nur, mindestens eine wirkliche relativeURI anzugeben.

            Vielen Dank für deine Ausführungen. Um einen bekannten Mann des deutschen Fernsehens zu zitieren: »Haben wir wieder was gelernt.«

            Schönes Wochenende,
            Robert

            1. Dank an alle für die Aufklärung.

              Martin

            2. Hallo,

              Ich weiß jedenfalls, dass man mit # auf der gleichen Seite bleibt – aber halt:

              <a href="#">ein Link</a>

              Dies führt dazu, dass die aktuelle Seite _nicht noch einmal aufgerufen wird_.

              Ja, denn weder die gesamte URI (weder base URI noch relative URI) verändert sich, noch ändert sich etwas anderes am Aufruf des im Browserfenster gezeigten Dokuments. Die Ankeradressen, die hinter # stehen könnten, müssen dem Browser ja schon bekannt sein, denn sie stehen als A.name oder *.id im Quelltext.

              Kann es sein, dass der Ansatz

              <form action="#" method="post" name="sowieso">
              nicht wie beabsichtigt funktioniert?

              Du meinst, weil der Browser die Ressource gar nicht neu anfordert? Nein, denn beim Absenden eines Formulars ändert sich die Ressourcenanforderung _immer_. Bei GET ändert sich die URI direkt, weil die Name-Wert-Paare der successful controls dort übergeben werden. Bei POST ändert sich die Art des Requests und es werden natürlich POST-Parameter generiert und mitgesendet.

              Die einzige gemeinsame Unsicherheit bei action="#" und action="" ist, dass es sein könnte, dass ein Browser die base URI nicht korrekt ergänzt, wenn der relativeURI-Teil leer ist, denn das ist er bei beiden Varianten.

              viele Grüße

              Axel

  3. Hi,

    Wie es scheint, ruft ein Formular:

    Es ist so - per definitionem.

    Was ist der Vorteil von:
    <form name="sowieso" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">

    • PHP_SELF muß nicht gesetzt sein
    • Du vermeidest eine Sicherheitslücke. PHP_SELF enthält *nicht* den Script-Namen, sondern den aufrufenden Namen. Und der ist vom User manipulierbar ("/myscript.php/irgendwasVomUser"). Traue *niemals* Anwenderdaten!

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    1. Hallo,

      <form name="sowieso" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">

      • PHP_SELF muß nicht gesetzt sein

      Unter welchen Bedingungen kann das passieren?

      • Du vermeidest eine Sicherheitslücke. PHP_SELF enthält *nicht* den Script-Namen, sondern den aufrufenden Namen. Und der ist vom User manipulierbar ("/myscript.php/irgendwasVomUser"). Traue *niemals* Anwenderdaten!

      Das stimmt allerdings. So genau hatte ich die Doku gar nicht gelesen. Natürlich habe ich es grade ausprobiert ;-), und tatsächlich wird das Script ausgeführt (Apache/PHP) auch wenn man es als http://example.com/myscript.php/irgendwasVomUser aufruft. Im action steht dann action="/myscript.php/irgendwasVomUser". Nun habe ich mir zwar noch keine Gedanken gemacht, wie man das "irgendwasVomUser" manipulieren müsste, damit es im action-Attribut Schaden anrichten könnte, aber prinzipiell ist es natürlich schon mal schlecht, dass der Nutzer etwas in meinen HTML-Quellcode schreiben kann. Man müsste also auch $_SERVER['PHP_SELF'] gegenchecken, bevor man es mit echo irgendwo in den Quellcode schreibt.

      viele Grüße

      Axel

      1. Hi,

        Man müsste also auch $_SERVER['PHP_SELF'] gegenchecken, bevor man es mit echo irgendwo in den Quellcode schreibt.

        warum? Es steht auch $_SERVER['SCRIPT_NAME'] zur Verfügung.

        freundliche Grüße
        Ingo

        1. Hallo,

          Man müsste also auch $_SERVER['PHP_SELF'] gegenchecken, bevor man es mit echo irgendwo in den Quellcode schreibt.

          warum? Es steht auch $_SERVER['SCRIPT_NAME'] zur Verfügung.

          Stimmt. Warum wird das dann in Beispielen so selten benutzt, selbst hier nicht? Gibt es das nocht nicht so lange?

          viele Grüße

          Axel

          1. Hi,

            Stimmt. Warum wird das dann in Beispielen so selten benutzt, selbst hier nicht? Gibt es das nocht nicht so lange?

            Vielleicht weil es IIRC seltener als PHP_SELF zur Verfügung steht. Die User-Anmerkungen im manual sind da sehr hilfreich ...

            Generell kann man sich nur auf die Existenz weniger dieser Variablen verlassen - inkl. DOCUMENT_ROOT. Ich behelfe mir damit, daß ich wichtige fehlende ggf. selbst bastele - irgendwas ist immer da ... ;)

            ...hoffentlich. ;->

            Gruß, Cybaer

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      2. Hi,

        • PHP_SELF muß nicht gesetzt sein
          Unter welchen Bedingungen kann das passieren?
        • $PHP_SELF ist veraltet -> $_SERVER['PHP_SELF'].
        • PHP-Manual User-Anmerkungen: "Running Xitami in Windows 2000 and PHP 4.3.7, nor PHP_SELF or SCRIPT_FILENAME is not availiable."
        • Man kann es aus Sicherheitsgründen deaktivieren (IMHO z.B. bei suPHP).

        Nun habe ich mir zwar noch keine Gedanken gemacht, wie man das "irgendwasVomUser" manipulieren müsste, damit es im action-Attribut Schaden anrichten könnte,

        http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Konfiguration#Pseudo-URLs_durch_PATH_INFO -> http://example.com/tests/simple.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        1. Hallo,

          • PHP_SELF muß nicht gesetzt sein
            Unter welchen Bedingungen kann das passieren?
          • $PHP_SELF ist veraltet -> $_SERVER['PHP_SELF'].

          Ach was? *g* _Das_ wusste ich. Ich dachte Du sprichst über PHP_SELF als Key in $_SERVER.

          • PHP-Manual User-Anmerkungen: "Running Xitami in Windows 2000 and PHP 4.3.7, nor PHP_SELF or SCRIPT_FILENAME is not availiable."

          *g* Aha: "weder PHP_SELF oder SCRIPT_FILENAME ist nicht verfügbar" Ja, die Negation der Negation. Aber ich weiß, was gemeint ist.

          • Man kann es aus Sicherheitsgründen deaktivieren (IMHO z.B. bei suPHP).

          Ja, Danke für die Info. Werde ich mir merken.

          Nun habe ich mir zwar noch keine Gedanken gemacht, wie man das "irgendwasVomUser" manipulieren müsste, damit es im action-Attribut Schaden anrichten könnte,
          http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Konfiguration#Pseudo-URLs_durch_PATH_INFO -> http://example.com/tests/simple.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo

          *uups* Das _ist_ böse. Danke für den Hinweis. Glücklicherweise habe ich bisher keine PHP-Schulungen durchführen müssen und auch noch keine PHP-Projekte online, muss mich also noch für nichts schämen ;-).

          viele Grüße

          Axel

          1. Hi,

            • $PHP_SELF ist veraltet -> $_SERVER['PHP_SELF'].
              Ach was? *g* _Das_ wusste ich.

            Das dachte ich mir. :) Aber im OP war halt die alte Version ...

            • Man kann es aus Sicherheitsgründen deaktivieren (IMHO z.B. bei suPHP).
              Ja, Danke für die Info. Werde ich mir merken.

            Wobei sich das wirklich auf $PHP_SELF bezieht und nicht auf $_SERVER['PHP_SELF'] - wohl als "erzieherische Maßnahme", die alle alten Schreibweise in den Orkus kippt ...

            ... bevor es PHP demnächst ohnehin von sich aus machen wird. ;)

            *uups* Das _ist_ böse. Danke für den Hinweis. Glücklicherweise habe ich bisher keine PHP-Schulungen durchführen müssen und auch noch keine PHP-Projekte online, muss mich also noch für nichts schämen ;-).

            Das PATH_INFO-Verhalten ist aber natürlich ggf. ebenfalls deaktiviert - aus Sicherheitsgründen. :)

            Man kann sich ja nun auch denken, warum. ;)

            Gruß, Cybaer

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!