it-swarm.com.de

Warum $ _SERVER ['PHP_SELF'] anstelle von "" verwenden?

In einem Formular auf einer PHP Seite können Sie Folgendes verwenden:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ...>

oder

<form action="#" ...>

oder

<form action="" ...>

im Aktionsattribut des Formulars. Da echo $_SERVER['PHP_SELF'] Keine Variablen für die Verwendung von GET übergibt und Sie "" Verwenden müssen, warum sollten Sie das oder "#" Verwenden?

Ich frage, weil ich einige Zeit gebraucht habe, um herauszufinden, dass die Variablen nicht mit $_SERVER['PHP_SELF'] Übergeben werden. Vielen Dank.

41
robk27

Das action Attribut wird standardmäßig auf die aktuelle URL gesetzt. Dies ist der zuverlässigste und einfachste Weg, um zu sagen, dass das Formular an derselben Stelle eingereicht werden soll, von der es stammt.

Es gibt keinen Grund, $_SERVER['PHP_SELF'] Zu verwenden, und # Sendet das Formular überhaupt nicht (es sei denn, es ist ein submit -Ereignishandler beigefügt, der die Übermittlung behandelt).

61

Die Verwendung einer leeren Zeichenfolge ist völlig in Ordnung und tatsächlich viel sicherer als die einfache Verwendung von $_SERVER['PHP_SELF'].

Beim Benutzen $_SERVER['PHP_SELF'] Es ist sehr einfach, böswillige Daten durch einfaches Anhängen von /<script>... nach dem whatever.php Teil der URL, daher sollten Sie diese Methode nicht verwenden und kein PHP Tutorial mehr verwenden, das dies vorschlägt.

43
ThiefMaster

Wenn Sie EINE BELIEBIGE Variable in HTML einfügen, verwenden Sie am besten htmlspecialchars() on, es sei denn, Sie möchten, dass der Browser die Variable selbst als HTML interpretiert es. Unter anderem wird verhindert, dass Hacker beliebigen HTML-Code in Ihre Seite einfügen.

Der Wert von $_SERVER['PHP_SELF'] Wird direkt von der im Browser eingegebenen URL übernommen. Wenn Sie es also ohne htmlspecialchars() verwenden, können Hacker die Ausgabe Ihres Codes direkt manipulieren.

Wenn ich Ihnen zum Beispiel einen Link zu http://example.com/"><script>malicious_code_here()</script><span class=" per E-Mail sende und Sie haben <form action="<?php echo $_SERVER['PHP_SELF'] ?>">, Lautet die Ausgabe:

<form action="http://example.com/"><script>malicious_code_here()</script><span class="">

Mein Skript wird ausgeführt, und Sie werden nicht klüger sein. Wenn Sie angemeldet waren, habe ich möglicherweise Ihre Cookies gestohlen oder vertrauliche Informationen von Ihrer Seite entfernt.

Wenn Sie jedoch <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>"> verwenden, wäre die Ausgabe:

<form action="http://example.com/&quot;&gt;&lt;script&gt;cookie_stealing_code()&lt;/script&gt;&lt;span class=&quot;">

Wenn Sie das Formular abschickten, hatten Sie eine seltsame URL, aber zumindest mein böses Skript wurde nicht ausgeführt.

Wenn Sie dagegen <form action=""> Verwenden, ist die Ausgabe dieselbe, unabhängig davon, was ich meinem Link hinzugefügt habe. Dies ist die Option, die ich empfehlen würde.

23
Mark Eirich

Ich weiß, dass die Frage zwei Jahre alt ist, aber es war das erste Ergebnis dessen, wonach ich suche. Ich habe eine gute Antwort gefunden und hoffe, dass ich anderen Nutzern helfen kann.

Schau dir das an

Ich werde mich kurz fassen:

  • benutze das $_SERVER["PHP_SELF"] Variable mit htmlspecialchars ():

    `htmlspecialchars($_SERVER["PHP_SELF"]);`
    
  • PHP_SELF gibt den Dateinamen des aktuell ausgeführten Skripts zurück.

  • Die Funktion htmlspecialchars () konvertiert Sonderzeichen in HTML-Entitäten. -> NO XSS
11
Micha93

Zusätzlich zu den obigen Antworten können Sie auch $_SERVER['PHP_SELF'] Oder einfach eine leere Zeichenfolge verwenden, indem Sie __DIR__ Verwenden.
ODER
Wenn Sie eine niedrigere PHP Version (<5.3) verwenden, ist die Verwendung von dirname(__FILE__) eine häufigere Alternative.
Beide geben den Ordnernamen der Datei im Kontext zurück.

EDIT
Wie Boann ausführte, gibt dies den Speicherort der Datei auf der Festplatte zurück. Das würdest du im Idealfall nicht als URL ausstellen. In diesem Fall kann dirname($_SERVER['PHP_SELF']) den Ordnernamen der Datei im Kontext zurückgeben.

0
maxxon15