【发布时间】:2023-03-14 18:37:01
【问题描述】:
我知道 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' 函数是否只允许一个语句?
- 如果这在这种情况下不易受到攻击,是否还有其他情况容易受到攻击?
【问题讨论】:
-
使用参数化查询,然后再也不用问这个问题
-
我正在尝试理解其他概念,我知道如何使用参数化查询,请您阅读清单 1、2 和 3 中的真正问题吗?
-
没有。过滤器输入不会阻止任何事情。仅仅因为您想不出一种通过看起来像电子邮件地址的东西来利用查询的快速方法,并不意味着其他人不能。您不会将您的安全系统建立在“嗯,不太可能发生”的基础上,而只是使用您已经在正确使用的工具:您正在使用 PDO - 使用占位符。它不会花费您任何费用,并且您可以完全防御注入攻击。
-
是的,每个查询调用只有一个查询语句。这不是 PDO 限制。这是底层 mysql 驱动程序内置的基本限制,用于防止某些(但绝对不是全部)形式的注入攻击。
-
我认为这里的问题是人们很乐意帮助保护网站,但他们不太愿意向任何人展示如何利用网站。我敢肯定,人们之前曾问过一些听起来很真实的问题,然后用这些信息来对付某人。我们可能不应该向人们展示这种事情是如何完成的,如果他们还不知道,就不要告诉他们
标签: php sql sql-injection