我知道SQL注入的基础知识以及如何避免它。我知道我的代码很脆弱,但我正在尝试注入 SQL,但它不起作用。这是关于知道它是如何脆弱的,因为在实践中,我做不到。
这是代码:
$email = filter_input(INPUT_GET, 'email');
if ($email != '') {
try {
$stm1 = $db->query("SELECT * from clients WHERE email = '$email'");
$result = $stm1->fetchAll();
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
我正在尝试通过此输入注入
<input id="textinput" name="email" type="text">
我正在使用这样的代码:
'; UPDATE clients set status = 0 WHERE client_id = 1
请注意,这是一个有效的 SQL 查询。
我真正的问题是:
- 在这种情况下,filter_input阻止什么吗?
- PDO"$query"函数只允许一个语句吗?
- 如果在这种情况下不易受攻击,那么还有其他易受攻击的情况吗?
首先,$email = filter_input(INPUT_GET, 'email');
不执行任何操作,则与$email = filter_input(INPUT_GET, 'email', FILTER_DEFAULT);
相同,FILTER_DEFAULT
被记录为"不执行任何操作"。
其次,PDO的查询功能似乎确实支持多个语句(尽管使用起来相当烦人,我不能说我个人玩过它)。PHP PDO 多选查询始终删除最后一个行集
第三,即使没有多语句支持,也可以填充$email
之类的内容nobody@example.com' OR username='admin
以返回您不打算返回给用户的数据。
从根本上说:不要再担心坏代码是否可以被利用,而是开始编写好代码。开始使用正确准备的语句,不再担心注入。