gpt4 book ai didi

php - 将变量与 $_SERVER ['PHP_SELF' ] 进行比较是否安全?

转载 作者:可可西里 更新时间:2023-11-01 13:23:32 25 4
gpt4 key购买 nike

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

从我读到它有什么问题(容易注入(inject)),我想知道比较它是否安全。

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

例子:

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

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

最佳答案

更好的代码示例是:

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

不过,这取决于 $thisPage 的内容。如果 $thisPage 包含 $_SERVER['PHP_SELF']同样,您应该将其更改为 $_SERVER['SCRIPT_NAME']


如果你真的不能使用像 __FILE__ 这样的替代品和 $_SERVER['SCRIPT_NAME'] ,并确保您了解所涉及的检查,是的。

例如,这个 URL:http://example.com/sick.php/mwuahahahaha给出:

/sick.php/mwuahahahaha

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

如果不需要获取请求的路径(无 URL 重写),请使用 $_SERVER['SCRIPT_NAME'] .如果你真的需要$_SERVER['PHP_SELF'] (重写的 URL),在输出时转义它们(使用 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 (即使使用重写的 URL)
  • $_SERVER['PHP_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

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

关于php - 将变量与 $_SERVER ['PHP_SELF' ] 进行比较是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3596346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com