PDO准备报表有多安全

不久之前开始使用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(); 

这真的很安全吗? 我还需要做其他事情吗? 还有什么我需要考虑?

谢谢。

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

查询参数的工作方式是当您调用prepare()时将查询发送到数据库服务器,并且稍后在调用execute()时发送参数值。 所以他们保持与查询的文本forms分开。 从来没有机会进行SQL注入(提供的PDO::ATTR_EMULATE_PREPARES为false)。

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

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

 SELECT * FROM blog WHERE userid IN ( ? ); 

您不能使用参数来使表名称或列名称变为dynamic:

 SELECT * FROM blog ORDER BY ?; 

您不能使用任何其他types的SQL语法的参数:

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

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

从SQL注入是安全的。

一些事情是不安全的:

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

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

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

在提到XSS的时候,我认为使用诸如这个input清理类http://www.phpclasses.org/browse/package/2189.html来防止XSS攻击也是很好的做法。;