【发布时间】:2014-06-24 01:10:47
【问题描述】:
我一直在研究 PDO 的 bindValue()。我知道使用 PDO 准备我的 SQL 语句可以防止 SQL 注入发生。
代码示例:
$stmt = $dbh->prepare('SELECT * FROM articles WHERE id = :id AND title = :title');
$stmt->bindValue(':id', PDO::PARAM_INT);
$stmt->bindValue(':title', PDO::PARAM_STR);
$stmt->execute();
通过将 ID 绑定为一个数字,而 Title 是一个字符串,我们可以限制当有人试图在代码中进行 SQL 注入时造成的损害。
我们是否应该始终将我们的值与PDO::PARAM_ 绑定,以便我们可以限制在 SQL 注入中可以从数据库中提取的内容?在执行我们的bindValue() 时,这是否会增加 PDO 的安全性?
【问题讨论】:
-
如果您不将
LIMIT中使用的参数绑定为 int,则查询不会像您想象的那样做出反应(我不记得它是失败还是忽略它)。 -
...而不是什么?其他不是
bindValue的绑定方法?离开我们的PDO::PARAM_论点?或者完全放弃prepareAPI? -
我很确定 OP 的含义如下:“我是否需要使用
PDO::PARAM_INT作为数字,或者我可以使用默认的PDO::PARAM_STR生存,如果我不这样做的话'不选择参数类型?我知道它会在数字周围添加',但这真的很重要吗?“。 -
@h2ooooooo 这基本上是个问题,但你的措辞比我写的方式好。我不明白为什么你会希望一个 int 成为一个刺痛。可能是我思维太逻辑了。
-
@Fluorocarbon 您可能会从阅读mysql - quote numbers or not? 中受益。也就是说,我总是倾向于使用我自己的 DB 包装器来检查 PHP 类型,然后选择正确的 PARAM 类型。 (stackoverflow.com/a/22235348/247893)