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

Gag*_*ags 1 php mysql pdo

我正在使用如下的PDO声明

select * from `admine_user` where `user_id` = ? and passw = ?
$resultfm1 = DB::instance()->prepare($query)->execute
(array($escapedid,$hashedpass))->fetchAll();
Run Code Online (Sandbox Code Playgroud)

我在考虑使用

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

以上语句中哪些更好用,可以有效防止SQL注入,因为现在我无法使用 mysql_real_escape_string

Bil*_*win 5

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

事实上,这两种风格最终都与MySQL相同.

此外,"模拟准备"实际上并没有在准备步骤中执行任何操作,它只是保存查询字符串.执行时,您提供值并将它们插入查询中,然后提交给MySQL.如果您不信任此过程,则禁用模拟准备.

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

只需确保您使用的是当前版本的PDO(基本上是PHP 5.3或更新版本中的任何版本),然后这两种样式都可以安全使用.

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