2009-02-28 128 views
2

我只是偶然發現了另一個愚蠢的未被消毒的sql注入漏洞,我正在進行一個項目......我對此已經很厭倦了。
你有任何建議,如何消除這種不良的SQL語句,並執行準備好的語句,哪裏可行?現在我更喜歡像執行預準備語句的方法

REVOKE DarnInlineDataStatements ON * TO xyz
這樣的解決方案,但是因爲這似乎不大可能,用於查找這些事情的靜態代碼分析工具(可靠性)?或者 任何東西否則你會推薦?
編輯:軟技能方法「請不要使用它們,有(通常)更好的方法」在過去似乎沒有工作得太好。因此,我真的更喜歡阻止此類查詢的東西。不要故意破壞現有的代碼,但爲了將來的項目,一些「沒有這樣的疑問」的解決方案;-)

回答

1

如果您已經使用靜態代碼分析工具,可以將其配置爲查找某些方法的用法,例如在Java世界Connection.createStatement中,而不是在Connection.prepareStatement中。

我認爲更好的方法是通過連接創建動態SQL的不良影響。您必須將其添加到您的編碼標準文檔中!

2

你可以只搜索你的代碼庫的普通T-SQL構造,如SELECT,INSERT,UPDATE,DELETE等等。

如果您使用的是Visual Studio 2008 Team System,則會有一個內置的代碼分析規則來檢查一些SQL問題。否則,有免費FxCop

+0

謝謝,我已將FxCop添加到我的待辦事項列表中;) – VolkerK 2009-02-28 13:16:24

0

希望在您的軟件中找到所有非參數化查詢非常簡單。在準備查詢時,大多數數據庫訪問層(如PHP的PDO或Perl的DBI)在執行SQL時都有不同的調用。搞清楚這些電話是什麼,並搜索代碼會給你一個好的開始。如果你使用Linux,grep是你的朋友。

從那裏修復它們會很容易(我希望)。我不知道這個項目的規模,但是你可以把查詢放在一個普通的地方,或者根據像Active Record/DataMapper/Table Row Gateway這樣的通用模式開發一些圖層。

我不認爲有自動執行它的好方法。也許你只需要對你的同事有一顆心。內聯SQL不好。故事結局。如果你是領導者,我認爲授權是有條件的。

+1

我工作的人員繼續編寫這些SQL包裝。我厭惡包裝!爲什麼要包裝Perl DBI?爲什麼?爲什麼?它已經成爲一個包裝! – 2009-02-28 02:26:12

3

如果您將sql移動到存儲過程,則可以禁用應用程序用戶的SELECT,CREATE,ALTER,UPDATE,DELETE,DROP等權限,只保留EXEC訪問權限。這假設SQL Server,但我確信Oracle/MySQL等允許類似的設置。

還要注意,這不會保證預準備語句:您仍然可以以不安全的方式調用存儲過程。但是,如果你沒有使用大量的存儲過程,它會發現任何編碼不正確的地方,如果你錯過了任何東西,它將使得sql注入攻擊很難成功。

+1

如果你的任何SP使用動態SQL(有些人認爲它是詛咒,我發現它具有有效的用法),那麼只留下EXEC權限並不能讓你免受SQL注入攻擊。 – 2009-03-05 18:34:15

0

不要讓應用程序直接向數據庫服務器發送代碼,而是通過中間層發送代碼。它可以輕鬆解析發送給數據庫的任何內容,並對其執行一些約束。 例如,強制所有SQL代碼由一個組成,並且不超過一個語句,並且拒絕它或僅在第一個語句中執行多個語句。

基本的SQL注入攻擊是這樣的代碼:

DECLARE @SQL VARCHAR(4000), @Table VARCHAR(50) 
SET @Table='Employees' -- Imagine this actually comes as a parameter from app 
SET @SQL='SELECT * FROM '[email protected] 
EXEC(@SQL) 

攻擊者可以通過字符串 「SYSTABLES'; UPDATE的BankAccount SET金錢=金錢+ 10000 WHERE AccountCode = 12345; DROP TABLE AuditTrails;」到數據庫 - 它會有災難性的影響。

通過讓中間層對這些字符串進行最小限度的解析,就可以保護您免受最簡單的SQL注入攻擊。對於其他人,你可以將它們添加到您的中間層(它也可以處理結果緩存,帶寬限制等)

如果需要從應用中傳遞多個SQL語句,我會說你做錯了事情,應該把這個邏輯封裝在一個存儲過程中,或者至少在中間層本身。

+0

在這裏(和我目前的情緒),我甚至考慮過在postgres,mysql,...或者_finding_這樣的項目中查看和修改實際的SQL解析器;)幾乎所有東西都有硬化項目,爲什麼不這樣做? – VolkerK 2009-02-28 15:16:13