如何安全是PDO预准备语句(how safe are PDO prepared statements

2019-06-18 17:12发布

使用PDO准备语句不是很久以前开始,而且,据我所知,它所有的转义/安全为您服务。

例如,假定$ _POST [“标题”]是一个形式字段。

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

这是真的安全吗? 我必须要做什么吗? 我有什么别的考虑?

谢谢。

Answer 1:

严格说来,实际上没有逃脱需要,因为参数值永远不会插值到查询字符串。

该方式的查询参数的工作原理是,将查询发送到数据库服务器时,你叫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;

因此,有相当那里你必须处理查询作为一个字符串,之前的几个案件prepare()调用。 在这种情况下,你仍然需要仔细编写代码来避免SQL注入。



Answer 2:

这是从SQL注入安全。

有两件事情是不是安全的:

  • 拒绝服务(导致行过量被创建)
  • 跨站点脚本攻击(如果标题是不断回显到另一个用户)

安全不仅仅是防止SQL注入更多。



Answer 3:

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



Answer 4:

为XSS提到来看,我认为这也很好地看看使用的东西,如该输入清洁类http://www.phpclasses.org/browse/package/2189.html防止XSS攻击。



文章来源: how safe are PDO prepared statements