什么时候应该使用 PDO::query?[复制]

When should one use PDO::query? [duplicate]

提问人:DrFaraday 提问时间:2/27/2021 最后编辑:DharmanDrFaraday 更新时间:6/29/2022 访问量:84

问:

我刚刚了解到,为了避免SQL注入,最好使用准备/执行二人组:

$pdo = new PDO ('mysql:host=something;port=something dbname=something','name','pswd');
$sql = "SELECT name FROM users WHERE email = :em AND password = :pw";
$stmt = $pdo -> prepare($sql);
$stmt -> execute (array());

而不是使用:

$stmt = $pdo -> query($sql);

问题是:

在什么情况下,有人会使用查询,因为我们有一种非常快速的方法来保护自己免受SQL注入的影响,那么有人使用查询方法吗?如果是这样,为什么?

php pdo sql 注入

评论

1赞 tadman 2/27/2021
提示:代码格式的 3 个反引号。
1赞 tadman 2/27/2021
请注意,在 PDO 中,占位符不应有引号。 不。:em':em'
1赞 tadman 2/27/2021
如果您可以选择,那么您没有正确散列密码。您应该使用password_hashpassword
0赞 Jeroen Mostert 2/27/2021
在某些情况下,数据库命令不接受参数(例如,在 T-SQL 中,语句不能参数化;表名必须是文本)。如果你需要动态生成这样的语句,你仍然需要(或更有可能)和(或自定义转义,甚至)。DROP TABLEqueryexecquote
0赞 Andy Lester 2/27/2021
请注意,它不是保护您的。这是绑定变量的使用。您仍然可以对从不受信任的输入构建的语句执行 and,例如 并且仍然对 SQL 注入持开放态度。您不希望有任何代码(该 SQL 语句就是代码)是从来自外部的数据构建的。preparepreparequeryselect * from users where password='$password'

答:

1赞 Acorn 2/27/2021 #1

几乎从不;你会知道你是否处于无法使用它的情况。

请注意,即使动态生成查询,仍应生成具有占位符和参数集的字符串,这些字符串彼此独立。

0赞 Oscar Soler 2/27/2021 #2

当使用查询是安全的(它不是sql注入攻击的目标)时,我会使用方法,例如:querySELECT name FROM users