如何“防篡改”是PHP中的$ _SERVER变量?

时间:2010-11-22 16:31:14

标签: php security tampering

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

4 个答案:

答案 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)

来自the php.net manual

  

此阵列中的条目由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