Ein besseres Codebeispiel wäre:
if ($_SERVER['SCRIPT_NAME'] === $thisPage) { }
Dennoch kommt es auf den Inhalt von $ Thispage. Wenn $ Thispage $_SERVER['PHP_SELF']
auch enthält, sollten Sie das ändern zu $_SERVER['SCRIPT_NAME']
Wenn Sie wirklich keine Alternativen wie __FILE__
und $_SERVER['SCRIPT_NAME']
verwenden können, und stellen Sie sicher, dass Sie die Kontrollen beteiligt verstehen, ja.
Zum Beispiel dieser URL: http://example.com/sick.php/mwuahahahaha
gibt:
/sick.php/mwuahahahaha
Beim Vergleich erlaubt ist, für nicht-kritische Dinge wie CSS.
Wenn der angeforderte Pfad nicht benötigt wird (keine URL wird neu geschrieben), verwenden Sie $_SERVER['SCRIPT_NAME']
. Wenn Sie wirklich $_SERVER['PHP_SELF']
(rewrited URL) benötigen, sie entkommen, wenn die Ausgabe (htmlentities($_SERVER['PHP_SELF'])
mit
Überblick über Variablen.
__FILE__
: enthält den vollständigen Dateisystem-Pfad aus dem aktiven Skript. ZB:
<?php /*test.php*/ include 'file.php';?>
<?php /*file.php*/ echo __FILE__;?>
test.php Anforderung gibt so etwas wie: /var/www/file.php
(und nicht /var/www/test.php
)
$_SERVER['SCRIPT_FILENAME']
: enthält den Dateisystempfad des angeforderten Skripts, z. /var/www/test.php
$_SERVER['SCRIPT_NAME']
: enthält den Pfad des angeforderten Skripts (wie ein Dateisystem, jedoch mit dem entfernten Dokumentenstamm), z. /test.php
(auch bei Verwendung von rewrited URL)
$_SERVER['PHP_SELF']
: enthält einen übersetzte Pfad (//
->/
, .
und ..
aufgelöst), aber mit zusätzlichen Pfadinformationen.
$_SERVER['REQUEST_URI']
: das Schlimmste von diesen, enthält es die rohe Zeichenfolge in der Anfrage als in. GET [REQUEST_URI] HTTP/1.0
. (Escape) Nulbytes sind hier immer noch sichtbar.Dies ist nur die Rohdaten zwischen GET
(oder was auch immer Methode Sie verwenden) und HTTP/1.0
(oder was auch immer HTTP-Version verwenden)
Ein Vergleich dieser Variablen:
ich diesen Test durchgeführt mit nc
, aber telnet
sollte auch ausreichen. Server war von http://xampp.org/. Die angeforderte Datei ist test.php
, die enthält:
<?php
$properties = array('SCRIPT_FILENAME', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_URI');
printf("% 15s: %s\n", '__FILE__', __FILE__);
foreach($properties as $property){
printf('% 15s: %s', $property, $_SERVER[$property]."\n");
}
?>
Test:
$ nc localhost 80
GET ///somedir/./../////test.php/somedata%20here?q%00=%25 HTTP/1.0
HTTP/1.1 200 OK
Server: Apache/2.2.14 (Unix)
[stripped]
__FILE__: /opt/lampp/htdocs/test.php
SCRIPT_FILENAME: /opt/lampp/htdocs/test.php
SCRIPT_NAME: /////test.php
PHP_SELF: /////test.php/somedata here
REQUEST_URI: ///somedir/./../////test.php/somedata%20here?q%00=%25
Mit RewriteRule ^page/test test.php
:
$ nc localhost 80
GET ///somedir/./../page//.////test/somedata%20here?q%00=%25 HTTP/1.0
HTTP/1.1 200 OK
Server: Apache/2.2.14 (Unix)
[stripped]
__FILE__: /opt/lampp/htdocs/test.php
SCRIPT_FILENAME: /opt/lampp/htdocs/test.php
SCRIPT_NAME: /test.php
PHP_SELF: /test.php
REQUEST_URI: ///somedir/./../page//.////test/somedata%20here?q%00=%25
Fazit: Der sicherste Variable in den meisten Fällen zu verwenden ist $_SERVER['SCRIPT_NAME']
.
+1 Dies ist die einzige Möglichkeit, PHP_SELF zu missbrauchen, die ich kenne. Es könnte unter bestimmten Umständen Probleme verursachen, wenn es als Basis-URL für ein Formular oder etwas verwendet wird, aber es ist sicher in einem Vergleich zu verwenden, wie es vom OP gezeigt wird. –
Ich glaube, Sie haben es falsch. $ _SERVER ['PHP_SELF'] enthält immer den Pfad des laufenden Skripts. Du denkst an REQUEST_URI. – Codeacula
Ich habe es gerade noch einmal getestet: 'http: //localhost/xampp/phpinfo.php/whatDidYouSay?% 25' gibt:' _SERVER ["PHP_SELF"] \t/xampp/phpinfo.php/whatDidYouSay'. REQUEST_URI ist noch schlimmer: '/xampp/phpinfo.php/whatDidYouSay?% 25'. Dieses 'Feature' heißt ['Pathinfo'] (http://httpd.apache.org/docs/current/mod/core.html#acceptpathinfo) – Lekensteyn