2012-01-16 97 views
7

按照PHP文檔PDO ::準備()增加了引號,所有的參數,使您不必擔心這樣做:與PDO加引號處理::準備()

「準備語句的參數不需要被引用;驅動程序自動處理這個,如果應用程序獨佔使用預準備語句,開發人員可以確保不會發生SQL注入(但是,如果查詢的其他部分正在建立與未轉義的輸入,SQL注入仍然是可能的)。「

對我來說這個問題是我構建查詢和數據庫結構的方式。通常,SQL語句的FROM部分不需要參數化,因爲Table可能會由直接用戶輸入定義。然而,我的代碼在某些地方是這種情況,因此我對參數化版本感到更加舒適。

而不是 SELECT * FROM tablename WHERE?=?

所以我的問題是這樣的,是可以防止我的PDO對象從周圍加入了FROM參數,以便我沒有得到我的臉上泛起SQL錯誤,引號?或者我必須以不同的方式做到這一點。

+2

究竟是什麼問題? – jeroen 2012-01-16 18:01:10

+0

它不一定會加引號。支持本機預處理語句的驅動程序將保留文字'?',數據庫服務器執行替換。 - 但是你需要解釋你的代碼在做什麼以及爲什麼這裏有問題。在FROM子句中添加「?」或「:placeholder」是字面字符串,不是綁定參數。 – mario 2012-01-16 18:03:12

+0

對不起,我不小心撞到進入之前我打完的表名稱中使用PDO/MySQL的準備語句作爲參數]問題 – hamalnamal 2012-01-16 18:04:33

回答

4

準備語句中的佔位符僅用於數值。插入動態表名的唯一方法就是自己做

"SELECT FROM `".$table."` WHERE `".$column."` = ?" 
+3

當然,如果變量內容來自一個受污染的源,那麼僅僅用back ticks包裝這個值是不安全的。 – Matthew 2012-01-16 18:14:40

+0

@YourCommonSense您能否給我一個用例,其中_table_和_column_名稱來自您的控制之外的來源?當他們_somehow_基於用戶輸入時,只要給他們你的DB密碼就容易多了。這就是說,你可以假設他們來自可靠的來源(例如配置或其他地方的硬編碼),或者你做了一些非常錯誤的事情。它仍然不會阻止你使用你的大腦:) – KingCrunch 2014-03-03 03:01:28

+0

便宜的談話,老兄。 – 2014-03-03 04:29:50

2

@KingCrunch是他的回答大多是正確的。你應該真的逃避自己的字符串。像這樣的東西應該可以防止大部分的噴射:

//make sure $table and $column only contain alphanumeric chars 
$table = preg_replace("/[^A-Za-z0-9]/", '', $table); 
$column = preg_replace("/[^A-Za-z0-9]/", '', $column); 

$query = "SELECT FROM `{$table}` WHERE `{$column}` = ?"