您经常在菜鸟代码中看到此垃圾:
$_SESSION = $_POST;
一个鲜为人知的秘密是,_SESSION美元
是“特殊的”,无法将管道字符作为顶级数组键来处理。php 无法在关闭/session_write_close期间保存会话变量,而是擦除整个数组。|
session_start();
if (!isset($_SESSION['cnt'])) {
$_SESSION['cnt'] = 0;
}
$_SESSION['cnt']++;
/* prior to php 5.4, it will never increment, because it never successfuly saves
unless you comment line below
*/
$_SESSION['a|b'] = 1;
print_r($_SESSION);
我并不是说这就是CodeIgniter擦除密钥的原因,但这是许多“输入密钥可利用的方式”之一。
也许更可能的原因是因为人们肯定会做这样的事情:
if ($formPostDidntValidate) {
echo "Please fix the form submission errors and try again\n";
foreach ($_POST as $key => $value) {
echo "<p>$key<br>
<input name='$key' value='$value'></p>";
}
}
输出请求变量而不执行正确的特定于上下文的转义,例如对 html 上下文、html 属性上下文甚至 sql 上下文进行转义:
$sql = "select * from myTable where 1=1";
foreach ($_POST as $key => $value) {
$sql .= " and $key = '$value'";
}
我见过很多人逃避这个值,但在构建sql和/或html时不是关键。
如果你不逃避一切,你很容易被黑客入侵。清理值不如转义好,但它总比没有好得多,考虑到有多少开发人员还不够复杂,无法理解何时以及如何转义,我可以看到添加自动请求变量清理的吸引力。