2010-08-29 6 views
6

Ich bin ein Neuling zu PHP immer noch, also entschuldige diese Frage, wenn es albern scheint, aber ich frage mich, ob dies eine sichere Verwendung von $_SERVER['PHP_SELF'] ist.

Von meinem Lesen über, was mit ihm falsch ist (Neigung zur Einspritzung), ich fragte mich, ob es sicher ist, es zu vergleichen.

Zum Beispiel möchte ich das PHP/CSS-Stylesheet je nach der Seite ändern, auf der die Person ist, so in der PHP/CSS würde Anweisung überprüfen $_SERVER['PHP_SELF'], um zu sehen, ob die Seite ihren Besuch erfordert eine andere Stylesheet.

Beispiel:

if ($_SERVER['PHP_SELF'] === $thisPage) { } 

könnte bösartigen Code beeinflussen mich auf diese Weise? Kann ich es einfach validieren/reinigen und dann benutzen?

Antwort

5

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'].

+0

+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. –

+0

Ich glaube, Sie haben es falsch. $ _SERVER ['PHP_SELF'] enthält immer den Pfad des laufenden Skripts. Du denkst an REQUEST_URI. – Codeacula

+0

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

0

Ja, die Antwort ist einfach und kurz:
wenn Ihre Dateien direkt aufgerufen werden, wie http://www.example.com/news.php, Ihr Code ist alles in Ordnung.
Kein schädlicher Code kann Ihre Site auf diese Weise beeinträchtigen.

Verwandte Themen