PDO - 使用准备好的语句[重复]

Posted

技术标签:

【中文标题】PDO - 使用准备好的语句[重复]【英文标题】:PDO - using prepared statements [duplicate] 【发布时间】:2013-10-26 09:00:53 【问题描述】:

我一直在查看本教程以获取有关切换到 PDO 的帮助:http://wiki.hashphp.org/PDO_Tutorial_for_mysql_Developers

但是,只有一件事我找不到。

假设我有一个名为“用户”的文本输入表单

那么,PDO 的 PHP 代码会如下所示:

$name = $_POST['name'];
$stmt = $db->prepare("INSERT INTO table(name) VALUES(?)");
$stmt->execute(array($name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

基本上我要问的是这是否安全。我知道 PDO 与 mysql_* 不同,因为您不再使用 mysql_real_escape_string,但我需要做的就是确保不会将恶意数据放入数据库吗?

【问题讨论】:

这就是 PDO 诞生的原因。 值已为您转义 使用 pdo 代替旧的 mysql 过程式函数更安全。 pdo 类将为您完成主要的字符串转义和清理。 仿真模式和原生模式一样安全。 防止执行 mysql 查询 - 准备好的语句就足够了,你应该对所有查询使用它们,你应该对所有参数使用 ?,但不要忘记其他可能的安全问题:交叉- 站点脚本等 【参考方案1】:

据我所知,SQL 注入 PDO 几乎是不可能的(或者至少我还没有听说过这样做的方法)。

即使您使用 mysql_real_escape,也可能会在函数中存在一些微小的未知错误或 few cases where the function fails。 PDO 的工作方式是它首先“准备”,它列出要做什么,它制定操作,工作。 然后它会带入您输入的内容。 SQL 注入通过进入查询来工作

简单来说,

$query = "INSERT INTO table(name) VALUES($name)";

易受攻击。即使你逃脱了它,你也可能不会完全安全。

如果你准备它,它不会考虑 $name。因此,黑客无法进入查询。只有在它已经计算出要调用哪些操作之后,它才会相应地放入所有内容,从而使黑客几乎不可能以任何方式修改查询。

【讨论】:

感谢您的反对。介意解释一下吗?.. 阅读this question的答案。 mysql_real_escape_string() 并不能真正让你免于所有错误! @ComFreek:我想如果您阅读第 2 段,您会发现 @aayush 并不是说​​ mysql_real_escape_string 会帮助您避免所有错误。 现在(修改后)请我 +1 ;) 在这个网站上,关闭一个重复的问题而不是写一个你自己的答案被认为是礼貌的,这会污染有数千个类似问题的网站。

以上是关于PDO - 使用准备好的语句[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何查看准备好的 PDO SQL 语句 [重复]

在查询中使用 PDO 准备好的语句和 LIMIT 时出错 [重复]

从 PDO 准备好的语句中获取查询 [重复]

SELECT PDO 准备好的语句中的 SELECT [重复]

带有命名占位符的 PDO 准备好的语句 IN 子句无法按预期工作 [重复]

PHP PDO准备语句给出“无效语法”错误[重复]