代码之家  ›  专栏  ›  技术社区  ›  Tarik

将变量与$\u SERVER['PHP\u SELF']进行比较是否安全?

php
  •  6
  • Tarik  · 技术社区  · 15 年前

    我还是一个PHP新手,所以请原谅这个问题,如果它看起来很愚蠢,但我想知道这是否是安全的使用 $_SERVER['PHP_SELF'] .

    例如,我希望PHP/CSS样式表根据用户所在的页面进行更改,因此在PHP/CSS中,它将具有 if 报表检查 $\u服务器['PHP\u SELF'] 查看他们访问的页面是否需要不同的样式表。

    例子:

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

    恶意代码会这样影响我吗?我能简单地验证/清洗它,然后使用它吗?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Lekensteyn    15 年前

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

    $_SERVER['PHP_SELF'] 你也应该改成 $_SERVER['SCRIPT_NAME']


    如果你真的不能使用 __FILE__ $\u服务器['SCRIPT\u NAME']

    例如,此URL: http://example.com/sick.php/mwuahahahaha 给予:

    /sick.php/mwuahahahaha
    

    $\u服务器['SCRIPT\u NAME'] . $\u服务器['PHP\u SELF'] htmlentities($_SERVER['PHP_SELF'])

    变量概述:

    • __文件__
      <?php /*test.php*/ include 'file.php';?>
      <?php /*file.php*/ echo __FILE__;?>
      /var/www/file.php (而不是 /var/www/test.php
    • $_SERVER['SCRIPT_FILENAME'] :包含所请求脚本的文件系统路径,例如。
    • $\u服务器['SCRIPT\u NAME'] /test.php (即使使用重写的URL)
    • $\u服务器['PHP\u SELF'] // -&燃气轮机; / , . .. 已解决),但包含其他路径信息。
    • $_SERVER['REQUEST_URI'] GET [REQUEST_URI] HTTP/1.0 . (转义)空字节在这里仍然可见。这只是我们之间的原始数据 GET HTTP/1.0 (或您使用的任何HTTP版本)

    这些变量的比较:

    我做了这个测试 nc ,但是 telnet 应该也够了。服务器来自 http://xampp.org/ test.php ,包含:

    <?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");
    }
    ?>
    

    测试:

    $ 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
    

    使用 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
    

    结论:在大多数情况下使用最安全的变量是 .

        2
  •  0
  •   Your Common Sense    15 年前

    是的,答案简单明了:
    如果你的文件被直接调用,比如 http://www.example.com/news.php ,你的代码没问题。
    没有恶意代码能以这种方式影响您的站点。

    推荐文章