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注入.
Yul*_*liy 11
SQL注入是安全的.
一些不安全的事情:
安全性不仅仅是阻止SQL注入.
归档时间: |
|
查看次数: |
16267 次 |
最近记录: |