是否有與PHP的mysql_real_escape_string()等價的Java?PHP的mysql等價物mysql_real_escape_string()
這是爲了在將它們傳遞給Statement.execute()之前轉義SQL注入嘗試。
我知道我可以使用PreparedStatement來代替,但我們假設這些是一次性語句,所以準備它們將導致lower performance。我已經將代碼改爲使用PreparedStatement,但考慮到現有代碼的結構,escape()函數會使代碼更改變得更簡單,以便於檢查和維護;我更喜歡容易維護代碼,除非有額外複雜性的令人信服的理由。 PreparedStatements也由數據庫以不同方式處理,因此這可能會使我們發現我們以前沒有遇到過的數據庫中的錯誤,在發佈到生產之前需要進行更多測試。
Apache StringEscapeUtils escapeSQL()只能轉義單引號。
後記: 我繼承的環境中有許多微妙之處,我故意避免在我的問題中。
兩點考慮:
1)預處理語句是不是萬能的,不提供對SQL注入100%的保護。一些數據庫驅動程序使用不安全的字符串連接實例化參數化查詢,而不是將查詢預編譯爲二進制形式。另外,如果你的SQL依賴於存儲過程,你需要確保存儲過程本身不會以不安全的方式構建查詢。
2)最準備好的語句實現將語句綁定到語句實例化的數據庫連接上。如果您正在使用數據庫連接池,則需要注意
僅使用準備好的語句引用與其準備的連接。一些池化機制確實透明地實現了這一點。否則,您可以彙總準備好的語句,或者(最簡單但更多的開銷)爲每個查詢創建一個新的準備好的語句。
您喜歡易維護的代碼,但你寧願使用手動串逃逸,而不是PrearedStatement? – skaffman 2009-06-19 15:11:46
考慮到現有的代碼(我沒有寫),是的,它會更容易維護。 – 2009-06-19 15:16:57
較低的性能可能比安全風險更具吸引力。安全處罰可能太高。在應用程序初始化代碼中準備你的語句,並且懲罰可能是不明顯的(當然,取決於應用程序)。 – Cheekysoft 2009-06-22 16:33:56