2012-07-30 41 views
-1

所以我正在使用PDO來試圖防止SQL注入。PDO我什麼時候需要參數化我的查詢?

我的問題是我應該使用它之前檢查/驗證我的數據庫信息?

例如:

$stmt = $pdo -> prepare(SELECT userID FROM user, comment WHERE userNumber ='1' AND user.userName = comment.UserName"); 

我覺得我已經是選項:

1)我驗證所有輸入之前,我將它插入我的數據庫,所以我沒有檢查是否user.userName是可以注入代碼的字符串。

2)我應該參數化我從數據庫中獲得的數據。還不確定,但類似:

$stmt->bindValue(':comment.UserName', comment.UserName, PDO::PARAM_STR); 

3)驗證並仍然參數化。在飛行

回答

1

的規則作出

*查詢很簡單:ALWAYS參數化查詢。即使這些查詢從未在網頁上使用過,並且面臨惡意用戶羣,您也可以在查詢字符串中使用外部數據,即使數據來自數據庫,您也可以使用STILL注入自己。

唯一的例外是參數查詢不起作用的時間,例如,任意長度WHERE IN (...)值列表,動態表/字段名稱(無論如何這通常是一個壞主意)。在這些有限的情況下,您自己構建查詢,但必須採取適當的注入攻擊緩解措施。

+0

只是爲了確保所有條款。選擇,在哪裏,等等,因爲在任何時候,一個「好」類型的字符串可以在整個查詢中注入代碼?這會使代碼變大嗎? – Juan 2012-07-30 16:14:59

+0

考慮一個查詢序列,您可以從一個表中獲取某個人的姓名,然後在其他查詢中使用該查詢序列。如果那個人是「Miles O'Brien」,那麼你現在會在其他查詢中注入一個引號並將其打破。直到小[Bobby Tables](http://bobby-tables.com)註冊您的系統纔會結束。使用參數,這個問題就會消失,不管數據內有多少可注入的東西。 – 2012-07-30 16:16:14

相關問題