2014-04-03 77 views
2

讀Laravel documentation我看到:我是否需要在laravel中清理DB ::查詢調用的用戶輸入?

Note: The Laravel query builder uses PDO parameter binding throughout to protect your application against SQL injection attacks. There is no need to clean strings being passed as bindings. 

這是否仍然適用,如果我只按照以下方式查詢手藝?

DB::query("SELECT * from table WHERE id like " . $id); 
+0

爲什麼你在這裏使用'like'運算符? – zerkms

+0

是的,我知道我可以使用Wuery Builder進行這樣一個簡單的查詢,但是有時我必須再次運行一個查詢,我會動態構建一個字符串。 – WildBill

+0

爲什麼不能使用查詢生成器動態地構建查詢? – zerkms

回答

4

讓我們的那句話,並強調關鍵的一句:

有沒有需要清理字符串作爲綁定傳遞。

在你的榜樣,$id沒有被作爲綁定過去了,它只是被注入到原始的SQL,所以它不保護

您應該遵循標準的做法,以防止SQL注入:

  • 在這樣的,其中輸入始終是一個整數的情況下,你可以使用intval($id)
  • 你可以用得到的基本PDO對象DB::getPdo()/DB::getReadPdo()並使用PDO::quote()正確轉義字符串
  • 儘管文檔相當差,但Laravel的DB外觀可以運行完全參數化的查詢,例如DB::select('SELECT * FROM users WHERE users.id = ?', array($userId));

參數化查詢通常被認爲是注入預防的黃金標準,並且是使用查詢構建器時Eloquent在內部使用的內容。這個想法是,你首先給數據庫(或者至少是數據庫驅動程序)提供完整的查詢,根本沒有用戶輸入,所以毫無疑問應該使用哪些表和列。然後,您將用戶輸入作爲完全分離數據,這實際上從未寫入SQL,只適用於您已發送的查詢。

參數化查詢不能爲您做所有事情,但 - 例如,大多數庫,including PDO, can't bind a table or column name as a parameter。這是因爲它實際上會在每次運行時創建一個不同的查詢,否定查詢和數據之間的分隔。如果你想這樣做,那麼你需要其他一些確保安全的方法 - 通常,允許值的白名單是最好的選擇。

+0

好吧,我會承認:'串作爲綁定傳遞'是什麼意思? :) – WildBill

+1

@WildBill它意味着將表示用戶輸入的變量作爲單獨變量傳遞給SQL中的DB代碼。這是「參數化查詢」的本質 - 在框架之外,您經常會看到有人推薦使用['PDO :: prepare()'](http://php.net/manual/en/pdo.prepare。 php)編寫一個帶有佔位符的SQL語句。數據庫可以看到查詢的哪些部分是表和列名,函數等,哪些是用戶輸入,因此惡意用戶無法制作輸入充當SQL。 – IMSoP

+0

@WildBill我已經添加了一些更多的信息給我的答案。 – IMSoP

0

,但爲了保障您的查詢的最佳方法是使用查詢生成器在其最大:

DB::table('table')->where('id', 'like', $id)->get(); 

另一種方式來保護你的查詢,如果你真的是被迫寫一個原始查詢時,投你的數據,他們都應該是類型:

DB::query(DB::raw("SELECT * from table WHERE id like " . (int) $id)); 

在這種情況下,如果$id'some exploit'查詢將是:

SELECT * from table WHERE id like 0 

查詢生成器,你也可以通過你的參數(綁定)這樣的硬化您的查詢的安全性:

DB::select('SELECT * FROM users WHERE users.id = ?', array($userId)); 
+0

你爲什麼認爲它受到保護? – zerkms

+0

不完全,保護查詢的最佳方法是在最大值處使用查詢生成器。 –

+0

對。 OP詢問它是否受到保護。 「不完全」 - >「絕對不」 – zerkms

1

沒有,DB ::查詢()不是概念的一部分查詢生成器。相反,這將是保護:

DB::table('table')->where('id', 'like', $id)->get(); 
相關問題