2012-02-02 28 views
-1

我正在爲MySQL查詢使用ezSQL PHP類。由於我的所有查詢都通過$ezsql->query()函數,所以我認爲實現一種方法來阻止$ezsql->query()中的常用SQL注入技術是個好主意。檢測查詢中的常見SQL注入模式

例如,最常見的可能是1=1。所以這個正則表達式應該能夠阻止所有的變化:

preg_match('/(?:"|\')?(\d)(?:"|\')?=(?:"|\')?\1(?:"|\')?/',$query); 

這將阻止"1"="1"'1'=11=1

這是一個好主意?如果是這樣,還有其他一些常見模式?

編輯:忘了提及,我確實使用驗證和衛生。這只是一個額外的預防措施。

+7

一個更好的想法是使用允許你做準備語句+參數綁定的東西,這樣可以完全避免最常見的攻擊。 – Amber 2012-02-02 05:07:01

回答

3

這是個好主意嗎?

號有兩個原因:

  1. 你這樣做是錯誤的(是的,你只是失敗,你生了一個SQL黑名單的做法)。不,我不會告訴你如何改進,因爲2:
  2. 這是一個黑名單方法。數據庫類本身不應該使用黑名單方法。這不是預先警告,它只是沒用。例如,可以在網絡服務器的請求級別額外添加黑名單。

改爲使用現有的黑名單,不要重新發明輪子。如果您想了解如何開發自己的SQL黑名單層,請幫助開發這些現有組件。這種安全性不是開箱即用的,因此您可以拋出類似於您的問題,並且實際上您可以期待具體的答案。保重。

2

這是個好主意嗎?

肯定沒有。

每一次我在互聯網論壇上看到這樣的建議,我想知道,如果這個論壇運行的軟件遵循這樣的模式怎麼辦?一個可憐的發明者將無法提出他們的解決方案,因爲軟件會阻止這個帖子!

額外的預防措施不會傷害。比對不起更安全。

正如我在上面指出的,它顯然很痛。無法處理某些奇數部分數據的數據庫是無稽之談。

此外,我確信只有知識可以讓你安全。
不隨意移出一些模糊的想法,但理智而合理的行動。

只要您轉移並引用轉到查詢的數據,並且只要您爲轉義函數設置了正確的編碼,就沒有理由感到悲傷。
只要您使用準備好的語句將數據添加到查詢中,就沒有理由感到悲傷。
只要您根據硬編碼白名單過濾SQL標識符和關鍵字,就沒有理由感到悲傷。