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 准备好的语句和 LIMIT 时出错 [重复]
SELECT PDO 准备好的语句中的 SELECT [重复]