PDO准备的陈述有多安全

sqr*_*ram 42 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();
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Bil*_*win 78

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

查询参数的工作方式是在调用时将查询发送到数据库服务器prepare(),并在调用时稍后发送参数值execute().因此它们与查询的文本形式分开.从来没有SQL注入的机会(假设PDO::ATTR_EMULATE_PREPARES是错误的).

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

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

SELECT * FROM blog WHERE userid IN ( ? );
Run Code Online (Sandbox Code Playgroud)

您不能使用参数使表名或列名动态:

SELECT * FROM blog ORDER BY ?;
Run Code Online (Sandbox Code Playgroud)

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

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Run Code Online (Sandbox Code Playgroud)

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

  • 这是非常好的信息.谢谢! (3认同)
  • 注入PDO准备的一个很好的例子(由于这个答案中提到的限制)是最近的drupal漏洞https://www.sektioneins.de/advisories/advisory-012014-drupal-pre-auth-sql-injection-vulnerability html的 (3认同)

Yul*_*liy 11

SQL注入是安全的.

一些不安全的事情:

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

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

  • 假设您将博客帖子的标题存储在数据库中,其他用户可以查看这些帖子.然后存在潜在的跨站点脚本攻击,因为恶意用户可以制作包含HTML的标题,以便在向您网站的其他用户显示恶意脚本时将其嵌入到页面中. (3认同)