1

我是 PDO 课程的新手,从刚才开始我一直在使用 MYSQLI,我有点困惑。这个问题相当简单,但我在手册的任何地方都找不到纯文本的答案。因此,调用$pdo->query(some query)将自动逃避查询,并且不会为任何类型的潜在注入留下任何空间。这是真的?

4

3 回答 3

4

不,这不是真的。

为避免任何风险,mysql injections您将需要prepared statments或正确转义您的变量(这将涉及您在提交之前手动转义每个变量)。我建议使用准备好的语句,因为它们更容易使用。请阅读这篇文章如何防止 PHP 中的 SQL 注入?. 您可以使用mysqliOR PDO,这是 PDO 准备语句的一个很好的例子,来自 stackoverflow 的令牌

$id  = 1;
$stm = $pdo->prepare("SELECT name FROM table WHERE id=?");
$stm->execute(array($id));
$name = $stm->fetchColumn();

您可以在此处了解有关 PDO 准备语句的更多信息。我也想让你看看这里准备好的语句如何防止 SQL 注入攻击?

于 2013-06-01T14:22:29.500 回答
0

查询功能不安全

你最好使用PDO 对象的准备

例如

$sth = $dbh->prepare("select * from mytable where myattr = :attr");

$sth 处理程序可用于在查询中设置占位符(例如:本例中的 attr

你有两个选择:

要么直接在处理程序的执行函数中使用数组:

$sth->execute (array ('attr', $myattr));

或处理程序的bindParam函数然后执行

$sth->bindParam ('attr', $myattr);
$sth->execute();

该方法提供了一种在参数中转义单引号的好方法。

注意:还可以看看为什么你应该使用 PHP 的 PDO 进行数据库访问 (net.tutsplus.com)

于 2013-06-01T14:23:36.507 回答
-1

不,与任何其他原始查询方法PDO::query一样易受攻击。mysql_query

如果你这样做

$sql = "SELECT foo FROM bar WHERE baz = '$var'";

并且$var

Robert'; DROP TABLE users; --

所以结果是

SELECT foo FROM bar WHERE baz = 'Robert'; DROP TABLE users; --'

那么没有API 可以帮助您,因为没有 API 可以区分查询部分用户值是什么。只有当您使用准备好的语句正确转义值中的特殊字符时,API 才会清楚这种差异。

阅读伟大的逃避现实(或:使用文本中的文本需要知道的内容)

于 2013-06-01T14:22:13.670 回答