通过信任 $_SERVER 变量数组的内容来使用 $_SERVER['PHP_SELF'] 获取 php 文件的名称,我会承担很大的安全风险吗?
问问题
2535 次
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
此数组中的条目由 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 回答