php - PDO 准备好的语句有多安全

标签 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();

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

谢谢。

最佳答案

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

查询参数的工作方式是,当您调用 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/

相关文章:

c# - 数据库第一种方法中缺少 Entity Framework 导航属性

jquery - Spring Security 3.1 - 发生 session 超时时自动重定向到登录页面

asp.net-mvc - 所有请求均收到HTTP错误401.2-未经授权的响应

security - XMLHttpRequest 无法加载文件。跨源请求仅支持 HTTP

javascript - Typeahead.js 建议未被过滤

Java 卡在等待完成服务器端执行的缓慢 MySQL 查询,没有抛出错误

java - 如何将 jar 文件转换为其中包含 MySQL 的可执行文件?

JavaScript 转换日期

php - 使用 Google map 帮助创建多个信息窗口

php - 当文件位于不同目录时在服务器中播放 wav 文件