用#{引數}進行預編譯就可以防止了,千萬別用${}這種方式注入引數。
mybatis框架作為一款半自動化的持久層框架,其sql語句都要我們自己來手動編寫,這個時候當然需要防止sql注入。其實Mybatis的sql是一個具有“輸入+輸出”功能,類似於函式的結構,如下:
select id,title,author,content
from blog where id=#{id}
這裡,parameterType標示了輸入的引數型別,resultType標示了輸出的引數型別。迴應上文,如果我們想防止sql注入,理所當然地要在輸入引數上下功夫。上面程式碼中高亮部分即輸入引數在sql中拼接的部分,傳入引數後,打印出執行的sql語句,會看到sql是這樣的:
select id,title,author,content from blog where id = ?
不管輸入什麼引數,打印出的sql都是這樣的。這是因為mybatis啟用了預編譯功能,在sql執行前,會先將上面的sql傳送給資料庫進行編譯,執行時,直接使用編譯好的sql,替換佔位符“?”就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。
用#{引數}進行預編譯就可以防止了,千萬別用${}這種方式注入引數。
mybatis框架作為一款半自動化的持久層框架,其sql語句都要我們自己來手動編寫,這個時候當然需要防止sql注入。其實Mybatis的sql是一個具有“輸入+輸出”功能,類似於函式的結構,如下:
select id,title,author,content
from blog where id=#{id}
這裡,parameterType標示了輸入的引數型別,resultType標示了輸出的引數型別。迴應上文,如果我們想防止sql注入,理所當然地要在輸入引數上下功夫。上面程式碼中高亮部分即輸入引數在sql中拼接的部分,傳入引數後,打印出執行的sql語句,會看到sql是這樣的:
select id,title,author,content from blog where id = ?
不管輸入什麼引數,打印出的sql都是這樣的。這是因為mybatis啟用了預編譯功能,在sql執行前,會先將上面的sql傳送給資料庫進行編譯,執行時,直接使用編譯好的sql,替換佔位符“?”就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。