PDO 准备语句的安全性如何

2022-08-30 11:39:51

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

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

谢谢。


答案 1

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

查询参数的工作方式是,在调用 时将查询发送到数据库服务器,稍后在调用 时发送参数值。因此,它们与查询的文本形式分开。从来没有 SQL 注入的机会(前提是错误的)。prepare()execute()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注入。prepare()


答案 2

它不受SQL注入的影响。

有几件事是不安全的:

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

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


推荐