PDO 和 SQL 注入问题 [重复]

PDO and SQL Injection concerns [duplicate]

提问人:TAccount 提问时间:3/3/2020 最后编辑:TAccount 更新时间:3/5/2020 访问量:210

问:

很抱歉标题有点不清楚,但我是新来的。我在 StackOverflow 中徘徊,遇到了一个答案,指出在执行 SQL 查询时,不应直接输入数据 (),而应绑定在准备好的语句中 ()。$db->query("SELECT * FROM users WHERE id LIKE $id")$db->prepare("SELECT * FROM users WHERE id LIKE ?)->execute(array($id))

现在,我知道SQL注入,我应该使用看起来像后者的代码,但我的问题是;总是这样吗?比如,如果我有以下代码:

$db->query("SELECT * FROM products WHERE id LIKE $id")

假设我从我的代码中给出了它,并且它不是来自用户的输入,我是否仍然需要使用准备好的语句?或者我能接受第一个例子吗?$id

php mysql sql pdo sql 注入

评论

0赞 user3783243 3/3/2020
始终参数化。开发人员稍后可以重新定义变量以使用用户输入。您还可以根据来源进行二级注射。
0赞 TAccount 3/3/2020
你说得对,我没想过!谢谢你的回答,我会等待其他答案,也许还有更多
1赞 mario 3/3/2020
力求不一致并不是蹑手蹑脚绕过参数化的正当理由。另外:“二阶注入”。
1赞 Greg Schmidt 3/3/2020
您认为不参数化某些查询的潜在好处是什么?节省几秒钟的打字时间?所有的规则都是要被打破的,但只有在有很好的理由这样做时,节省几秒钟也不是一个很好的理由。
0赞 TAccount 3/3/2020
是的,这也是真的

答:

0赞 Bill Karwin 3/5/2020 #1

这是安全的,因为您的代码设置为文本常量值。不能使用不受信任的值。$id

$id = 123;
$db->query("SELECT * FROM products WHERE id LIKE $id");

这是安全的,因为执行类型转换可以消除任何可能导致 SQL 注入问题的特殊字符的可能性。纯整数是安全的。

$id = (int) $_GET['id'];
$db->query("SELECT * FROM products WHERE id LIKE $id");

但事实仍然是,一旦你使用不同的查询编写方法,有时使用字符串中的变量扩展,有时使用绑定的查询参数,你就会使你的代码更难维护。

请考虑此代码的生存期。你有多大信心,下一个接手支持此代码的初级程序员会充分了解 SQL 注入的风险,从而判断何时使用变量扩展是安全的,以及何时应该使用绑定的查询参数?

在将变量与 SQL 查询组合在一起时,最好始终使用绑定的查询参数,因为此编码标准更易于记录和强制执行。因此,意外发生不安全案例的可能性较小。

评论

0赞 Mike Robinson 3/5/2020
比尔,我只会告诉任何人:“使用参数。一直以来。只是因为这是正确的做法。这真的不比构造字符串更难,它更安全,更高效,而且总是有效。因此,耐克规则适用(恕我直言):“说干就干。
0赞 Bill Karwin 3/5/2020
我同意这是正确的做法,但“去做”的原因对一些开发人员来说并不令人信服。你必须给他们一个更实际的理由。