2011-06-16 96 views
3

我有一堆perl CGI需要參數並在各種DBI mySql查詢中使用它們的值。保護免受惡意的sql注入

如果我不允許任何用戶提交的值包含單詞select,insert,delete或update作爲參數,那麼惡意用戶是否可以從我的系統中傷害(或竊取數據)?並且只要我用單引號包裝所有varchar用戶提供的值?

我意識到這個問題與其他人非常相似,但其他人似乎都指出了各種PHP解決方案,並且我沒有使用PHP,所以請原諒冗餘,或者指出一個相關的問題:回答這個具體問題。

回答

12

在Perl中處理此問題的正確方法是在所有SQL查詢中使用placeholders。通過DBI佔位符傳遞用戶提供的數據將確保正確引用所有內容。 (這並不能保證它是安全,當然,但它會阻止SQL注入。)

+5

Nitpicky,我知道,但佔位符_ *不會傳遞值。 SQL命令的結構和要綁定到佔位符的數據分別發送到數據庫,這樣就不需要引用了。唯一的時間佔位符將引用數據是當DBI必須僞造它們,因爲它處理了一些不支持真實事物的討價還價基礎數據庫後端。 – 2011-06-17 08:27:44

+0

謝謝...我會進一步調查 – 2011-06-17 19:37:12

4

使用參數化查詢。那麼用戶輸入根本不是命令的一部分,這是瞭解命令的唯一可靠方法,不會被修改。

+0

我不確定你的意思是什麼。什麼是參數化查詢?例如,當情況是用戶向我提供關於他們自己的信息時,我需要將用戶輸入作爲命令的一部分。他們的名字可能是「傑克」,或者可能是「從table_a刪除」。目前,我只是在發送這些惡意字符串之前對其進行測試,您的回答是否解決了這種情況? – 2011-06-17 19:35:53

+0

這是與上面的friedo回覆中的「佔位符」相同概念的另一個名稱。關鍵的想法是SQL引擎應該在用戶輸入被污染之前解釋你的SQL命令*。 – catfood 2012-01-17 15:47:23