2014-06-30 144 views
1

我使用PDO聲明如下SQL注入:哪些語句可以防止較好SQL注入

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_real_escape_string

+0

既防止.. – sectus

+0

感謝@sectus ..有人downvoted,我可以知道原因,並感謝誰upvoted的人。我認爲,我們在這裏學習 – Gags

+2

你應該確保你的準備不被模擬('$ con> setAttribute(PDO :: ATTR_EMULATE_PREPARES,false);') - [Read More。](http://stackoverflow.com/questions/ 8776344 /如何對 - 視圖 - 查詢錯誤在-PDO-PHP/8776392#8776392)。但是,兩個查詢都是一樣的。 – Darren

回答

5

MySQL僅支持位置參數(?佔位符),所以PDO內部共享在準備步驟中將命名參數轉換爲位置參數。

所以事實上,兩種風格最終都會對MySQL做同樣的事情。

此外,「模擬準備」實際上並沒有在準備步驟中做任何事情,它只是保存查詢字符串。當你執行時,你提供值,並將它們插入到查詢中,然後提交給MySQL。如果您不信任此過程,請禁用模擬準備。

這並不是說PDO做任何不安全的事情,儘管早期版本的PDO有一些錯誤。

只要確保您使用的是當前版本的PDO(基本上任何PHP 5.3或更新的版本),然後這兩種樣式都可以像安全一樣安全。

儘管我寫這篇文章後可能發生的任何迴歸bug ......

+1

+1這正是你需要知道OP的答案。 – Darren

+0

+1我不知道PDO將命名參數轉換爲位置。這是否意味着使用位置參數而不是命名? –

+0

是的.. @bill karwin ..我只使用PHP 5.3 – Gags