hibernate防止sql语句注入
如果在查詢字段中輸入單引號"'",則會報錯,這是因為輸入的單引號和其他的sql組合在一起編程了一個新的sql,實際上這就是SQL注入漏洞,后來我在前臺和后臺都對輸入的字符進行了判斷。
?
永遠也不要寫這樣的代碼:
?????String queryString = "from Item i where i.description like?'" + searchString + "'";
?????List result = session.createQuery(queryString).list();
????如果用戶輸入:foo' and callSomeStoredProcedure() and 'bar' = 'bar,則你的程序在執行一個簡單查詢后,還會調用某個存儲過程,
這樣你的程序就開了一個安全漏洞,如果用戶偶爾輸入了一個單引號,你的程序就可能報錯。
?
永遠也不要把未經檢查的用戶輸入的值直接傳給數據庫!
幸運的時有一個簡單的機制可以避免這種錯誤:
JDBC在綁定參數時有一個安全機制,它可以準確的將那些需要轉義的字符進行轉義(escape),
如上面的searchString,它被escape,不再作為一個控制字符了,而是作為被查詢的匹配的字符串的一部分。(這里指的是prepared statement,而是用普通的statment不行,我試過)。
另外,如果我們使用參數綁定,還可以提高數據庫的執行效率,prepared statement語句被編譯一次后,被放在cache中,就不再需要編譯,可以提高效率。
參數綁定有2種辦法:使用positional parameter或者named parameter。
hibernate支持JDBC樣式的positional parameter(查詢字符串中使用?),它同使用named parameter的效果一樣(查詢字符串中使用:)。
使用named parameter
使用named parameter,我們重新寫上面的查詢語句:
String queryString = "from Item item where item.description like :searchString";
冒號后面是一個named parameter,我們可以使用Query接口將一個參數綁定到searchString參數上:
????List result = session.createQuery(queryString)
??????????????????????.setString("searchString", searchString)
??????????????????????.list();
因為searchString是一個用戶輸入的字符串,所以我們使用Query的setString()方法進行參數綁定,這樣代碼更清晰,更安全,效率更好!
如果有多個參數需要被幫定,我們這樣處理:
String queryString = "from Item item "
???????????????????????????+ "where item.description like :searchString "
???????????????????????????+ "and item.date > :minDate";
List result = session.createQuery(queryString)
??????????????????.setString("searchString", searchString)
???????????????????.setDate("minDate", minDate)
??????????????????.list();
使用positional parameter
????如果你喜歡,也可以使用positional parameter:
String queryString = "from Item item "
???????????????????????????+ "where item.description like ? "
???????????????????????????+ "and item.date > ?";
List result = session.createQuery(queryString)
??????????????????.setString(0, searchString)
??????????????????.setDate(1, minDate)
??????????????????.list();
這段代碼可讀性強不如上面的強,而且可維護性差,如果我們的查詢稍微改變一點,將第一個參數和第二個參數改變一下位置:
String queryString = "from Item item "
????????????????????????????+ "where item.date > ? "
???????????????????????????+ "and item.description like ?";
這樣我們的代碼中涉及到位置的地方都要修改,所以我們強烈建議使用named parameter方式進行參數綁定。
最后,在named parameter中可能有一個參數出現多次的情況,應該怎么處理呢?
String userSearch = "from User u where u.username like :searchString"
???????????????????????????+ " or u.email like :searchString";
List result = session.createQuery(userSearch)
??????????????????.setString("searchString", searchString)
???????????????????.list();
不要使用
為了防止SQL注入,避免使用拼湊SQL語句的方式!!!
?
總結
以上是生活随笔為你收集整理的hibernate防止sql语句注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaweb如何定位
- 下一篇: 桌面快速启动软件AltRun----赶快