不久前开始使用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();
这真的很安全吗?我还要做别的吗?还有什么需要考虑的?
感谢。
答案 0 :(得分:76)
严格地说,实际上不需要转义,因为参数值永远不会插入到查询字符串中。
查询参数的工作方式是,当您调用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注入。
答案 1 :(得分:10)
从SQL注入开始是安全的。
有些事情不安全:
安全性不仅仅是阻止SQL注入。
答案 2 :(得分:2)
关于SQL注入,我相信这是最安全的,特别是如果你使用像PDO :: PARAM_INT这样的常量。
答案 3 :(得分:1)
看到XSS被提及,我认为使用诸如此输入清除类http://www.phpclasses.org/browse/package/2189.html之类的东西来防止XSS攻击也是很好的。