我早些时候与我的一位程序员交谈,他向我展示了他正在考虑的一段代码:
foreach($_REQUEST as $var=>$val) {
$$var = addslashes($val);
}
他希望能够使用 $varName
而不必编写 $_REQUEST['varName']
我建议他使用 mysql_real_escape_string
而不是 addSlashes
并且不要将 $_REQUEST
变量放入本地堆栈,因为这会给黑客带来麻烦附加向量。对我来说,这似乎与旧的 REGISTER_GLOBALS 指令存在同样的问题。
他说不存在相同的安全风险,因为这些变量都是在本地堆栈上创建的。所以我不确定,我查看了 PHP 变量变量页面:http://www.php.net/manual/en/language.variables.variable.php但除了警告框之外,没有看到任何有关 super 全局变量和安全性的内容。
黑客可以轻松利用该构造吗?
最佳答案
这就像倒退 6 年的 PHP 安全增强...基本上,register_globals
和 magic_quotes
放在一起!这两个在 PHP 的最新版本中已被标记为已弃用,并且出于充分的理由将从 future 版本中删除。
想象一下以下代码:
if ($is_admin) {
do_administrative_task();
}
现在有人提出以下请求:
http://www.example.com/script.php?is_admin=1
就这样,你就是管理员了!
同样,addslashes()
并没有真正提供任何针对 SQL 注入(inject)攻击的保护,因为它不理解现代字符集。制作绕过 addslashes()
并破解您的数据库的东西非常容易。
关于php - 安全风险? $_REQUEST 变量 ... $$ 在本地堆栈上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3983933/