我是 PDO 课程的新手,从刚才开始我一直在使用 MYSQLI,我有点困惑。这个问题相当简单,但我在手册的任何地方都找不到纯文本的答案。因此,调用$pdo->query(some query)
将自动逃避查询,并且不会为任何类型的潜在注入留下任何空间。这是真的?
问问题
1172 次
3 回答
4
不,这不是真的。
为避免任何风险,mysql injections
您将需要prepared statments
或正确转义您的变量(这将涉及您在提交之前手动转义每个变量)。我建议使用准备好的语句,因为它们更容易使用。请阅读这篇文章如何防止 PHP 中的 SQL 注入?. 您可以使用mysqli
OR 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();
该方法提供了一种在参数中转义单引号的好方法。
于 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 回答