将变量与$ _SERVER ['PHP_SELF']安全使用进行比较?

时间:2010-08-29 19:57:13

标签: php

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

从我的阅读中了解它有什么问题(容易注射),我想知道比较它是否安全。

例如,我希望PHP / CSS样式表根据人员所在的页面进行更改,因此在PHP / CSS中,它会有一个if语句检查$_SERVER['PHP_SELF']以查看是否他们访问的页面需要不同的样式表。

示例:

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

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

2 个答案:

答案 0 :(得分:5)

更好的代码示例是:

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

但是,这取决于$ thisPage的内容。如果$ thisPage也包含$_SERVER['PHP_SELF'],则应将其更改为$_SERVER['SCRIPT_NAME']


如果你真的不能使用__FILE__$_SERVER['SCRIPT_NAME']之类的替代品,并确保你理解所涉及的检查,是的。

例如,此网址:http://example.com/sick.php/mwuahahahaha提供:

/sick.php/mwuahahahaha

对于像CSS这样的非关键性事物,允许比较。

如果不需要获取请求的路径(没有URL重写),请使用$_SERVER['SCRIPT_NAME']。 如果您确实需要$_SERVER['PHP_SELF'](重写的网址),请在输出时将其转义(使用htmlentities($_SERVER['PHP_SELF'])

变量概述:

  • __FILE__:包含活动脚本的完整文件系统路径。例如: -
    <?php /*test.php*/ include 'file.php';?>
    <?php /*file.php*/ echo __FILE__;?>
    请求test.php提供类似于:/var/www/file.php(而不是/var/www/test.php
  • 的内容
  • $_SERVER['SCRIPT_FILENAME']:包含所请求脚本的文件系统路径,例如: /var/www/test.php
  • $_SERVER['SCRIPT_NAME']:包含所请求脚本的路径(就像文件系统一样,但文档根被剥离),例如/test.php(即使使用重写的网址)
  • $_SERVER['PHP_SELF']:包含已翻译的路径(// - &gt; /...已解决),但包含其他路径信息。
  • $_SERVER['REQUEST_URI']:最糟糕的是,它包含请求中的原始字符串,如。GET [REQUEST_URI] HTTP/1.0。 (转义)nullbytes仍然在这里可见。这只是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

结论:在大多数情况下使用的最安全的变量是$_SERVER['SCRIPT_NAME']

答案 1 :(得分:0)

是的,答案简单明了:
如果您的文件被直接调用,例如http://www.example.com/news.php,您的代码就可以了 没有恶意代码会以这种方式影响您的网站。