提问人:TAccount 提问时间:3/3/2020 最后编辑:TAccount 更新时间:3/5/2020 访问量:210
PDO 和 SQL 注入问题 [重复]
PDO and SQL Injection concerns [duplicate]
问:
很抱歉标题有点不清楚,但我是新来的。我在 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
答:
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
我同意这是正确的做法,但“去做”的原因对一些开发人员来说并不令人信服。你必须给他们一个更实际的理由。
评论