2008-12-04 26 views
1

我正在檢查Java/jdbc代碼中的SQL語句,以確保要執行的SQL具有可接受的質量。 PMD不Findbugs似乎有JDBC或SQL規則。我可以使用p6spy記錄SQL並以這種方式查看,但這是手動的。用於檢測java中的非參數化sql的工具jdbc代碼

我想知道是否使用PMD/Findbugs/etc創建規則的策略,任何字符串傳遞給PreparedStatement哪裏有一個「=」或「in」只有參數化比較方面的變量。

有沒有人這樣做?或者通過其他方式做到這一點?

回答

1

這是一個棘手的問題。比較運算符如=IN()是一些情況,但也有:!= <> < <= > >= LIKE

如何發現在應用程序變量中插入文字的情況?

String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable"; 

您可以搜索包含字符串分隔符的SQL,但SQL注入不僅僅來自插值字符串文字。

你會如何發現內插應用程序變量的情況,而不是數據值?

String sql = "SELECT * FROM mytable ORDER BY " + columnname; 

我不知道任何自動檢測SQL注入缺陷的方法。代碼審查是一種更有效的方法來發現它們。在每個包含插值應用程序變量的SQL語句中,您都必須確認應用程序變量是「安全的」,並且您的應用程序已經明確地驗證了它們或對它們進行了轉換,以便它們不包含危險的有效負載。

+0

我不知道這可以做到。 我認爲插入應用程序變量是一個問題,因爲這是在遷移到新的rdbms之前進行重構而不是僅僅查找sql​​注入問題。 我傾向於搜索從sql開始並從那裏前進的所有變量。 – sal 2008-12-04 23:27:42

+0

嗯。我不明白你的評論。我猜你的Java應用程序中的所有SQL語句都存儲在字符串中,變量名以'sql'開頭?如果是這樣,那麼是的,你需要爲所有這些情況進行代碼審查。 – 2008-12-05 19:29:10

0

您是否有能力通過連接到它的調試器完全測試應用程序?

在您的JDBC驅動程序的Connection.createStatement()實現中設置一個斷點,並運行應用程序...(或者如果使用的驅動程序沒有源代碼,請編寫一個假的驅動程序,到真實的,並記錄createStatement()的所有實例)

相關問題