代码之家  ›  专栏  ›  技术社区  ›  sqram

PDO准备声明的安全性如何

  •  39
  • sqram  · 技术社区  · 15 年前

    不久前就开始使用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 回复  |  直到 9 年前
        1
  •  75
  •   Bill Karwin    15 年前

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

    查询参数的工作方式是在调用时将查询发送到数据库服务器 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;
    

    因此,在许多情况下,您必须在 准备() 打电话。在这些情况下,您仍然需要小心地编写代码,以避免SQL注入。

        2
  •  10
  •   Yuliy    15 年前

    它不受SQL注入的影响。

    有几件事是不安全的:

    • 拒绝服务(导致创建过多的行)
    • 跨站点脚本攻击(如果标题被回送给其他用户)

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

        3
  •  2
  •   Alix Axel    15 年前

    关于SQL注入,我认为这是最安全的方法,特别是使用pdo::param_int等常量时。

        4
  •  1
  •   Chuck    9 年前

    正如上面提到的XSS,我认为看看使用诸如这个输入清理类之类的东西也是很好的。 http://www.phpclasses.org/browse/package/2189.html 以防止XSS攻击。