php_self 安全,将变量与$_SERVER [‘PHP_SELF’]安全使用进行比较?

一个更好的代码示例是:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值