PDO准备的陈述有多安全

时间:2009-08-21 22:47:10

标签: php mysql security pdo sql-injection

不久前开始使用PDO编写的语句,据我所知,它可以为您完成所有的转义/安全性。

例如,假设$ _POST ['title']是一个表单字段。

$title = $_POST['title'];
$query = "insert into blog(userID, title) values (?, ?)"
$st = $sql->prepare($query);
$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT);
$st->bindParam(2, $title);
$st->execute();

这真的很安全吗?我还要做别的吗?还有什么需要考虑的?

感谢。

4 个答案:

答案 0 :(得分:76)

严格地说,实际上不需要转义,因为参数值永远不会插入到查询字符串中。

查询参数的工作方式是,当您调用prepare()时,查询将被发送到数据库服务器,并且在您调用execute()时稍后会发送参数值。因此它们与查询的文本形式分开。 SQL注入永远不会有机会(假设PDO::ATTR_EMULATE_PREPARES为假)。

所以,查询参数可以帮助您避免这种形式的安全漏洞。

他们是否100%抵御任何安全漏洞?不,当然不。您可能知道,查询参数仅取代SQL表达式中的单个文字值。您不能使用单个参数替换值列表,例如:

SELECT * FROM blog WHERE userid IN ( ? );

您无法使用参数使表名或列名动态化:

SELECT * FROM blog ORDER BY ?;

您不能将参数用于任何其他类型的SQL语法:

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;

因此,在prepare()调用之前,有很多情况需要将查询作为字符串进行操作。在这些情况下,您仍需要仔细编写代码以避免SQL注入。

答案 1 :(得分:10)

从SQL注入开始是安全的。

有些事情不安全:

  • 拒绝服务(导致创建过多行)
  • 跨站点脚本攻击(如果标题回复给另一个用户)

安全性不仅仅是阻止SQL注入。

答案 2 :(得分:2)

关于SQL注入,我相信这是最安全的,特别是如果你使用像PDO :: PARAM_INT这样的常量。

答案 3 :(得分:1)

看到XSS被提及,我认为使用诸如此输入清除类http://www.phpclasses.org/browse/package/2189.html之类的东西来防止XSS攻击也是很好的。