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();

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

谢谢。


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

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

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

他们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注入。


从SQL注入安全。

一些事情是不安全的:

  • 拒绝服务(导致过量的行被创建)
  • 跨站点脚本攻击(如果标题曾回复给其他用户)
  • 安全性不仅仅是防止SQL注入。


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

    链接地址: http://www.djcxy.com/p/93653.html

    上一篇: how safe are PDO prepared statements

    下一篇: Cast from VARCHAR to INT