Hibernate防止SQL注入的方法

2021-08-26 13:37:56 字數 3032 閱讀 1238

如果在查詢欄位中輸入單引號"'",則會報錯,這是因為輸入的單引號和其他的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

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+spring中gethibernatetemplate()返回的物件可以呼叫find(string querystring, object value...object value)來實現 named parameter。比如:

view plain

date starttime =  new  date();  

date endtime = new  date();  

string querystring = "from sdmsracalertlog as log where"  +  

" log.alerttime between :starttime and :endtime" ;  

return  gethibernatetemplate().find(querystring, starttime, endtime); 

mybatis以及預編譯如何防止SQL注入

sql注入是一種 注入技術,用於攻擊資料驅動的應用,惡意的sql語句被插入到執行的實體欄位中 例如,為了轉儲資料庫內容給攻擊者 摘自 sql injection wikipedia sql注入,大家都不陌生,是一種常見的攻擊方式。攻擊者在介面的表單資訊或url上輸入一些奇怪的sql片段 例如 or ...

Hibernate使用中防止SQL注入的幾種方案

hibernate使用中防止sql注入的幾種方案 hibernate是乙個開放源 的物件關係對映框架,它對jdbc進行了非常輕量級的物件封裝,使得j a程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。在獲取便利操作的同時,sql的注入問題也值得我們的密切注意,下面就來談談幾點如何避免sql...

sql盲注特點 SQL盲注

盲注原理 盲注的分類 盲注常用函式 一 sql盲注概述 1.如果資料庫執行返回結果時只反饋對錯不會返回資料庫中的資訊 此時可以採用邏輯判斷是否正確的盲注來獲取資訊。2.盲注是不能通過直接顯示的途徑來獲取資料庫資料的方法。在盲注中,攻擊者根據其返回頁面的不同來判斷資訊 可能是頁面內容的不同,也可以是響...