8

通过信任 $_SERVER 变量数组的内容来使用 $_SERVER['PHP_SELF'] 获取 php 文件的名称,我会承担很大的安全风险吗?

4

4 回答 4

3

许多但不是所有的 $_SERVER 变量都是攻击者控制的。例如$_SERVER['SCRIPT_NAME']是安全的,因为$_SEVER['PHP_SELF']它是一个不同的危险变量,并且通常是 xss 的来源:

<?php
echo $_SEVER['PHP_SELF'];
?>

概念验证:

http://localhost/self.php/<script>alert(/xss/)</script>

通过查看phpinfo很容易看到这个漏洞在起作用。

于 2010-11-22T18:36:50.923 回答
1

没有有效的特殊机制来保护这个变量。您可以像写入任何其他变量一样写入它。所以你必须像任何其他变量一样保护它免受篡改(禁用 register_globals,避免变量变量等)。然后你就可以相信它了。

作为一种解决方法,可以肯定的是,您可以在程序的早期定义自己的常量:

define('SCRIPT_FILENAME',$_SERVER['SCRIPT_FILENAME']);

并在可用的情况下使用预定义的常量,例如__FILE__.

于 2010-11-22T16:34:26.493 回答
1

php.net 手册

此数组中的条目由 Web 服务器创建。无法保证每个 Web 服务器都会提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。

因此,如果您知道所有有权更改服务器配置的用户(以及会话中可能修改变量内容的所有脚本),您就可以合理地确定$_SERVER变量的数据。

于 2010-11-22T16:35:24.787 回答
0

一点也不,只要您不使用来自用户的数据,这实际上根本就不是风险。也就是说,使用以下之一:

echo __FILE__;
// is the same as
echo $_SERVER["SCRIPT_FILENAME"];

echo $_SERVER["SCRIPT_NAME"];
// SCRIPT_NAME contains just the path
于 2010-11-22T16:35:58.127 回答