Php SQL注入:哪条语句可以阻止更好的SQL注入

Php SQL注入:哪条语句可以阻止更好的SQL注入,php,mysql,pdo,Php,Mysql,Pdo,我使用PDO语句,如下所示 select * from `admine_user` where `user_id` = ? and passw = ? $resultfm1 = DB::instance()->prepare($query)->execute (array($escapedid,$hashedpass))->fetchAll(); 我正在考虑使用 select * from `admine_user` where `user_id` = :user and p

我使用PDO语句,如下所示

select * from `admine_user` where `user_id` = ? and passw = ?
$resultfm1 = DB::instance()->prepare($query)->execute
(array($escapedid,$hashedpass))->fetchAll();
我正在考虑使用

select * from `admine_user` where `user_id` = :user and passw = :pwd
$resultfm1 = DB::instance()->prepare($query)->execute
(array(":user"=>$escapedid,":pwd"=>$hashedpass))->fetchAll();

在上面的语句中,最好使用哪一个语句可以有效地防止SQL注入,因为现在我不能使用
mysql\u real\u escape\u string

mysql只支持位置参数(
占位符),所以PDO在准备步骤中将命名参数内部转换为位置参数

因此,事实上,这两种风格最终对MySQL做了相同的事情

另外,“模拟准备”实际上在准备步骤中不做任何事情,它只是保存查询字符串。执行时,提供值,并将其插入查询中,然后提交给MySQL。如果您不信任此进程,请禁用模拟准备

这并不是说PDO做了任何不安全的事情,尽管早期版本的PDO有一些bug

只要确保您使用的是当前版本的PDO(基本上是PHP5.3或更高版本中的任何东西),然后这两种样式都尽可能安全


尽管在我写这篇文章之后可能会出现任何回归错误

MySQL只支持位置参数(占位符
),因此PDO在准备步骤中将命名参数内部转换为位置参数

因此,事实上,这两种风格最终对MySQL做了相同的事情

另外,“模拟准备”实际上在准备步骤中不做任何事情,它只是保存查询字符串。执行时,提供值,并将其插入查询中,然后提交给MySQL。如果您不信任此进程,请禁用模拟准备

这并不是说PDO做了任何不安全的事情,尽管早期版本的PDO有一些bug

只要确保您使用的是当前版本的PDO(基本上是PHP5.3或更高版本中的任何东西),然后这两种样式都尽可能安全


尽管在我写这篇文章之后可能会出现任何回归错误

谢谢@sectus。。有人投了反对票,我能知道原因吗?谢谢投了反对票的人。。我想我们是来学习的,你应该确保你的准备工作没有被模拟(
$con->setAttribute(PDO::ATTR\u EMULATE\u prepares,false);
)-。但是,是的,两个查询都做相同的事情。是的,如果数据库实例是pdo,它们都会准备好。它们实际上是同一个查询。其中一个只使用名字持有者,两者都不比另一个好,它们都能有效地防止SQL注入。使用您更喜欢的。它设置为
TRUE
。。如果这是真的,那么SQL注入是可能的吗?谢谢@sectus。。有人投了反对票,我能知道原因吗?谢谢投了反对票的人。。我想我们是来学习的,你应该确保你的准备工作没有被模拟(
$con->setAttribute(PDO::ATTR\u EMULATE\u prepares,false);
)-。但是,是的,两个查询都做相同的事情。是的,如果数据库实例是pdo,它们都会准备好。它们实际上是同一个查询。其中一个只使用名字持有者,两者都不比另一个好,它们都能有效地防止SQL注入。使用您更喜欢的。它设置为
TRUE
。。如果这是真的,那么SQL注入是可能的吗?+1我不知道PDO会将命名参数转换为位置参数。这是否意味着在命名上使用位置参数有性能优势?是的@比尔·卡温。。我使用的是PHP5.3only@MarkM,不必担心位置参数和命名参数之间的性能差异。这只是几行C代码,因此差异几乎无法测量。如果您愿意,您可以对其进行基准测试,但我预测您最好将时间花在优化PHP代码上,或者分析SQL查询以创建正确的索引上。+1我不知道PDO会将命名参数转换为位置参数。这是否意味着在命名上使用位置参数有性能优势?是的@比尔·卡温。。我使用的是PHP5.3only@MarkM,不必担心位置参数和命名参数之间的性能差异。这只是几行C代码,因此差异几乎无法测量。如果您愿意,您可以对其进行基准测试,但我预测您的时间最好用于优化PHP代码,或者分析SQL查询以创建正确的索引。