Roland Schuster: Sicherheitsrisiko $_SERVER['PHP_SELF']?

Hey!

ich hab mal gehört das angeblich ein einfaches einbilden von $_SERVER['PHP_SELF'] alla
echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">';
ein Sicherheitsrisiko darstellen soll.

Ist das Richtig?
Falls ja, wie kann ich sonst denn Dateinamen dynamisch ermitteln?

lg
Roland

  1. Hi,

    ich hab mal gehört das angeblich ein einfaches einbilden von $_SERVER['PHP_SELF'] alla
    echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">';
    ein Sicherheitsrisiko darstellen soll.

    Ist das Richtig?

    Ja.
    Insbesondere dann, wenn du es vollkommen "unbehandelt" ausgibst, also den Kontext, in den du es bringst, unberuecksichtigt laesst.
    (Der Kontext heisst in diesem Falle HTML, und zur Absicherung dient htmlspecialchars().)

    Falls ja, wie kann ich sonst denn Dateinamen dynamisch ermitteln?

    SRCIPT_FILENAME aus dem $_SERVER-Array ist unter normalen Umstaenden gleichwertig.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi!

      Falls ja, wie kann ich sonst denn Dateinamen dynamisch ermitteln?
      SRCIPT_FILENAME aus dem $_SERVER-Array ist unter normalen Umstaenden gleichwertig.

      Und das is vor XSS-Angriffen sicher?
      Oder muss ich das auch noch irgendwie manipulieren damit es sicher ist?

      danke
      Roland

  2. Hallo Roland.

    Falls ja, wie kann ich sonst denn Dateinamen dynamisch ermitteln?

    Schau dir doch mal http://de2.php.net/manual/en/reserved.variables.server.php an, da wirst du bestimmt fündig.

    Servus,
    Flo

  3. ich hab mal gehört das angeblich ein einfaches einbilden von $_SERVER['PHP_SELF'] alla
    echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">';
    ein Sicherheitsrisiko darstellen soll.

    Ist das Richtig?
    Falls ja, wie kann ich sonst denn Dateinamen dynamisch ermitteln?

    Dass du action abhängig machst vom ausführenden Script, ist nur ein Aspekt.
    Ein anderer aber ist, dass dein action keine absolute Url darstellt.
    Du kannst zumindest dies ändern, indem du
    <base href="http://your.domain.example/">
    verwendest. Damit werden alle relativen Pfade in Links auf diese Adressbasis bezogen.
    Alternativ kannst du die Basisadresse ja auch ins action Attribut direkt schreiben.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. Hi,

      Dass du action abhängig machst vom ausführenden Script, ist nur ein Aspekt.
      Ein anderer aber ist, dass dein action keine absolute Url darstellt.

      Ja, und?

      MfG ChrisB

      --
      „This is the author's opinion, not necessarily that of Starbucks.“
    2. Dass du action abhängig machst vom ausführenden Script, ist nur ein Aspekt.

      Worin liegt das Problem? das Zauberwort heißt Codewiederverwendung ;)

      Ein anderer aber ist, dass dein action keine absolute Url darstellt.
      Du kannst zumindest dies ändern, indem du
      <base href="http://your.domain.example/">
      verwendest. Damit werden alle relativen Pfade in Links auf diese Adressbasis bezogen.
      Alternativ kannst du die Basisadresse ja auch ins action Attribut direkt schreiben.

      Wieso denn das, läuft ja auch ohne?

      lg
      Roland

      [ignore]
      PS: Weil ich jetzt zu viel zitiere hier ein sinnloser Text damit ich den Post senden kann
      [/ignore]

  4. Hello,

    ich hab mal gehört das angeblich ein einfaches einbilden von $_SERVER['PHP_SELF'] alla
    echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">';
    ein Sicherheitsrisiko darstellen soll.

    Ist das Richtig?

    Diese Frage kannst Du Dir mit einem kleinen Versuch beantworten, der gar nicht aufwändig ist.

    Baue Dir ein Miniscript

    <?php   ### info.php
        phpinfo();
    ?>

    Mehr muss es nicht enthalten.

    Nun rufe das Script über die Adressleiste Deines Browsers auf:

    http://domain.tld/info.php/hier/kommt/der/text?dumm=gelaufen

    Schau Dir die Variablen

    $_SERVER['PHP_SELF']
       $_SERVER['SCRIPT_NAME']
       $_SERVER['PATH_INFO']

    usw. an.

    Wie man ein Formular mit einem ungeschützten $_SERVER['PHP_SELF'] im action-Attribut entführt, zeige ich hier nicht, aber man kann dies durch Zusendung eines manipulierten Links ganz einfach tun.

    Der einfachste Weg ist,

    htmlspecialchars($_SERVER['PHP_SELF'])

    zu verwenden, oder alternativ $_SERVER['SCRIPT_NAME']

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom!

      cool, danke für die Erklärung!

      Der einfachste Weg ist,

      htmlspecialchars($_SERVER['PHP_SELF'])

      zu verwenden, oder alternativ $_SERVER['SCRIPT_NAME']

      Und das würde ausreichend Sicherheit bieten?
      Der Scriptname kann nicht mehr manipuliert werden?

      Danke
      Roland

      1. Hello,

        Der einfachste Weg ist,

        htmlspecialchars($_SERVER['PHP_SELF'])

        zu verwenden, oder alternativ $_SERVER['SCRIPT_NAME']

        Und das würde ausreichend Sicherheit bieten?
        Der Scriptname kann nicht mehr manipuliert werden?

        Doch, aber dann findet der Server die Ressource nicht mehr und antwortet mit einem Status 404 oder einer Umleitung oder was Du sonst so konfigurierst hast. Dem Client kann also nicht unbemerkt etwas untergejubelt werden. Die zusätzliche PATH_INFO wird jedenfalls abgeschnitten und die beinhaltet ja ja die Gefahr.

        http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  5. Hi,

    echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">';

    Hier reicht meistens bereits ein <form action="">.

    Falls ja, wie kann ich sonst denn Dateinamen dynamisch ermitteln?

    SCRIPT_FILENAME bzw. manche Server (IIS) liefern stattdessen SCRIPT_NAME.

    Gruß, Cybaer

    --
    Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
    (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)