不久前开始使用 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();
这真的安全吗?我还需要做什么吗?我还需要考虑什么?
谢谢。
最佳答案
严格来说,实际上不需要转义,因为参数值永远不会插入到查询字符串中。
查询参数的工作方式是,当您调用 prepare()
时,查询被发送到数据库服务器。 , 参数值稍后发送,当您调用 execute()
.因此它们与查询的文本形式分开。永远不会有 SQL 注入(inject)的机会(假设 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 注入(inject)。
关于php - PDO 准备好的语句有多安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1314521/