在笨 PHP框架,存在上,除其他事项外,每个请求将自动运行的函数过滤GET / POST / COOKIE数组键 ,并杀死该应用程序,如果遇到它认为不安全的字符。
为了防止恶意用户试图利用我们确保密钥只用字母数字文本和其他一些项目命名键。
就像是:
// foreach GET/POST/COOKIE keys as $str...
if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
{
exit('Disallowed Key Characters.');
}
例如,这将触发如果你不小心发布类似<input name="TE$T">
或有查询字符串像?name|first=1
。
我可以看到这是在开发一个应用程序来执行常识键名称,或发现错误的好办法,但我不明白:怎么能恶意用户可能在“攻击键” $_POST
例如数据? 特别是因为(我假设)输入值是正利用的,这是什么其实预防?
你提的问题,本身提出了一个很好的一点:目前还不清楚究竟你被保护,反对什么 。 但也有一些受欢迎的项目就可以解决:
- 魔术引号
- 事情最终可能导致SQL注入
- 这可以通过shell命令的方式执行字符串
- 事情可能与您的网址冲突
- 事情可以用HTML冲突
- 事情就像一个目录遍历攻击
- 跨站脚本 (XSS)攻击
但比其他,我实在想不出为什么你永远为什么你要到一般通过保护preg_match("/^[a-z0-9:_\/-]+$/i", $str)
我已经有了,他们只是简单地过度保护 ,因为笨的用途很广泛,他们需要防止的事情,他们本身并没有为他们的用户着想的思想还没有谁可能更不感知的不是这类攻击的感觉CodeIgniter的开发商。
你看这垃圾往往在小白的代码:
$_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);
我并不是说这就是为什么笨擦洗按键,但它是一个多“的方式输入键是可利用的”。
也许更可能的原因虽然是因为人肯定做的东西是这样的:
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时,我见过很多人逃避价值,但并不是关键。
如果你不逃避一切,你很容易被黑客攻击。 擦洗值不作为逃避为好,但总比没有好得多,并考虑有多少开发商还没有足够的经验,了解何时以及如何逃避,我可以看到的吸引力,增加自动请求变量擦洗。
说,在控制台我改变你的表单字段名称从name="email"
,以name="email\"); DROP TABLE users;
name="email\"); DROP TABLE users;
它不太可能成为一个成功的XSS攻击,但我可以看到类似到编码不PHP这样做伤害。 CI是可能只是试图掩盖自己的所有基地,使他们能够有一个自称是为XSS保护越好。
这种检查是在浪费时间。 你只是你期望反正访问键 - 如果由于某种原因你遍历所有元素,你将最有可能逃脱他们正确任何你会与他们无关。
然而,看着一个新手的PHP程序员(即使这个物种的成员很可能不使用框架的话)也有一定道理,你可以永远不知道什么难听的话他会用代码来执行的技能,甚至可能杀死他的猫没有这样的检查。
同样的道理也适用于拒绝含有如帖“从删除”作为防SQL注入的措施。 它可以很容易引起误报,如果你比如说用参数化查询,你是安全的反正。
或许它正试图阻止这种攻击 。
该攻击通过使用PHP如何构建其散列结构知识,使在键$_POST
这需要任意长的时间来处理。
我怀疑它可能只是试图阻止更多的平凡的SQL注入攻击,但。