2009-07-24 30 views
1

我有一個java應用程序+ SQL服務器數據庫。數據庫操作使用帶有動態SQL字符串的JDBC。例如:如何在java應用程序中捕獲/編碼SQL Server的特殊字符?

從標籤選擇列,其中列= StringParm

StringParam中是用戶輸入。如果stringParm包含撇號,則Java應用程序將拋出異​​常並表示無法執行SQL。

如何解決這個問題沒有Java代碼更改?

+1

如果不更改至少某些java代碼,則無法解決該問題。 – 2009-07-24 18:08:07

+0

看看http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain – 2009-07-24 18:07:12

回答

2

不要將用戶輸入直接放在SQL查詢中。您需要使用帶有參數的PreparedStatement。在不更改Java代碼的情況下,我沒有看到任何方法可以使此安全。

+0

我確實使用PreparedStatement。如果使用帶參數(setXXX)的PreparedStatement,是否意味着它可以處理特殊字符,如?,'...甚至是unicode?還避免SQL注入攻擊? – KentZhou 2009-07-24 19:06:28

0

您應該真的使用java.sql.PreparedStatement來設置參數。代碼的改變應該是最小的,並且試圖逃避用戶輸入的問題較少。

3

我猜你構造SQL以某種方式像

String sql = "Select Column from tab where column='" + StringParm + "'"; 

或者類似的東西呢?如果你這樣做,你可以接受各種漏洞利用,你也會看到像你所描述的行爲,其結果字符串不再是有效的SQL。你必須首先逃避用戶提供的參數。

最好的解決方案是使用預處理語句,這樣你就

Statement stmt = conn.prepareStatement("Select Column from tab where column=?"); 
stmt.setString(1,StringParam); 

我看不到解決您的問題,而不會改變任何Java代碼雖然任何快速的方法,也許吧逃脫/前消毒輸入命中你的代碼(例如,如果你是一個web應用程序的JavaScript)

0

你不能修改這個,而不改變應用程序。 SQL Server可以處理引號,但是當您構建動態SQL命令時,您的應用程序(Java代碼)無法正確引用引號。我更喜歡使用存儲過程並傳入參數,這樣就不會有任何引號問題或注入。

0

您可以通過在數據庫中放置一個觸發器來清理條目來解決這個問題 - 即嘗試插入時,請在輸入上進行正確的轉義,然後繼續使用新的插入輸入。但是,這是錯誤的層次,它可能不應該在那裏完成。一個更好的解決方案(IMO)是使用一個準備好的語句,並做可變的替換,讓JDBC爲你做逃生工作。