通过信任$ _SERVER变量数组的内容以使用$ _SERVER ['PHP_SELF']来获取php文件的名称,我是否会冒很大的安全风险?
答案 0 :(得分:3)
Many but not all of the $_SERVER variables are attacker controlled。例如$_SERVER['SCRIPT_NAME']
是安全的,因为$_SEVER['PHP_SELF']
是一个变化的危险变量,通常是xss的来源:
<?php
echo $_SEVER['PHP_SELF'];
?>
的PoC:
http://localhost/self.php/<script>alert(/xss/)</script>
通过查看phpinfo很容易看到此漏洞。
答案 1 :(得分:1)
没有特殊的机制来保护这个变量。您可以将其写入任何其他变量。所以你必须保护它免受任何其他变量的篡改(禁用register_globals,避免变量等)。那你就可以相信了。
作为一种确定的解决方法,您可以在程序的早期定义自己的常量:
define('SCRIPT_FILENAME',$_SERVER['SCRIPT_FILENAME']);
并在可用的情况下使用预定义的常量,例如__FILE__
。
答案 2 :(得分:1)
此阵列中的条目由Web服务器创建。无法保证每个Web服务器都能提供这些服务;服务器可以省略一些,或提供此处未列出的其他服务器。
因此,如果您了解所有有权更改服务器配置的用户(以及会话中可能修改变量内容的所有脚本),您可以合理地确定$_SERVER
变量的数据
答案 3 :(得分:0)
完全没有,只要您不使用来自用户的数据,这实际上根本不存在风险。也就是说,使用其中一个:
echo __FILE__;
// is the same as
echo $_SERVER["SCRIPT_FILENAME"];
echo $_SERVER["SCRIPT_NAME"];
// SCRIPT_NAME contains just the path