我仍然是PHP的新手,所以请原谅这个问题,如果它看起来很傻,但我想知道这是否安全使用$_SERVER['PHP_SELF']
。
从我的阅读中了解它有什么问题(容易注射),我想知道比较它是否安全。
例如,我希望PHP / CSS样式表根据人员所在的页面进行更改,因此在PHP / CSS中,它会有一个if
语句检查$_SERVER['PHP_SELF']
以查看是否他们访问的页面需要不同的样式表。
示例:
if ($_SERVER['PHP_SELF'] === $thisPage) { }
恶意代码会这样影响我吗?我可以简单地验证/清理它,然后使用它吗?
答案 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__;?>
/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
,您的代码就可以了
没有恶意代码会以这种方式影响您的网站。