一个更好的代码示例是:
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’](重写的URL),请在输出时将其转义(使用htmlentities($_SERVER['PHP_SELF']).
变量概述:
> __FILE __:包含活动脚本的完整文件系统路径.例如.:
请求test.php给出类似:/var/www/file.php(而不是/var/www/test.php)
> $_SERVER [‘SCRIPT_FILENAME’]:包含所请求脚本的文件系统路径,例如: /var/www/test.php
> $_SERVER [‘SCRIPT_NAME’]:包含所请求脚本的路径(如文件系统之一,但文档根被剥离),例如/test.php(即使使用重写的URL)
> $_SERVER [‘PHP_SELF’]:包含已翻译的路径(// – > /,.和..已解决),但包含其他路径信息.
> $_SERVER [‘REQUEST_URI’]:最糟糕的是,它包含请求中的原始字符串,如.GET [REQUEST_URI] HTTP / 1.0. (转义)nullbytes仍然在这里可见.这只是GET(或您使用的任何方法)和HTTP / 1.0(或您使用的任何HTTP版本)之间的原始数据
这些变量的比较:
我用nc执行了这个测试,但是telnet也应该足够了.服务器来自http://xampp.org/.请求的文件是test.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’].