sql注入大家都不陌生,是一種常見的攻擊方式,攻擊者在介面的表單資訊或url上輸入一些奇怪的sql片段,例如「or 『1』=』1』」這樣的語句,有可能入侵引數校驗不足的應用程式。所以在我們的應用中需要做一些工作,來防備這樣的攻擊方式。在一些安全性很高的應用中,比如銀行軟體,經常使用將sql語句全部替換為儲存過程這樣的方式,來防止sql注入,這當然是一種很安全的方式,但我們平時開發中,可能不需要這種死板的方式。
mybatis框架作為一款半自動化的持久層框架,其sql語句都要我們自己來手動編寫,這個時候當然需要防止sql注入。其實mybatis的sql是乙個具有「輸入+輸出」功能,類似於函式的結構,如下:
id=
"getblogbyid"
resulttype=
"blog" parametertype=」int」
>
select id,title,author,content
from blog where 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預編譯的呢?其實在框架底層,是jdbc中的preparedstatement類在起作用,preparedstatement是我們很熟悉的statement的子類,它的物件包含了編譯好的sql語句。這種「準備好」的方式不僅能提高安全性,而且在多次執行乙個sql時,能夠提高效率,原因是sql已編譯好,再次執行時無需再編譯。
話說回來,是否我們使用mybatis就一定可以防止sql注入呢?當然不是,請看下面的**:
id=
"orderblog"
resulttype=
"blog" parametertype=」map」
>
select id,title,author,content
from blog order by $
仔細觀察,內聯引數的格式由「#」變為了$。如果我們給引數「orderparam」賦值為」id」,將sql列印出來,是這樣的:
select id,title,author,content from blog order by id
顯然,這樣是無法阻止sql注入的。在mybatis中,」$」這樣格式的引數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用「$」這樣的引數格式,所以,這樣的引數需要我們在**中手工進行處理來防止注入。
結論:在編寫mybatis的對映語句時,盡量採用「#」這樣的格式。若不得不使用「$」這樣的引數,要手工地做好過濾工作,來防止sql注入攻擊。
mybatis中註解的使用
簡單的crud select insert update delete 例如 select select from user options 返回自增長id,更加詳細鏈結 options usegeneratedkeys true,keyproperty id keycolumn id result...
mybatis中註解式開發中傳遞多個引數的方式
在mybatis的動態 開發中,當介面需要傳入多個引數時,一般有以下幾種做法 推薦 param方式 1.傳遞包裝型別 不推薦要建立乙個包裝類去包含所有的引數型別,並且在 中還要填入特定的值 2.假設介面中傳入兩個引數則 代表第乙個引數,以此類推 select from where and x 3.新...
Spring中注入的理解(SSH框架)
1 整個action可以說是web容器的service方法的包裝過的類,是用來處理客戶端傳遞過來的請求的。2 裡面的user只是乙個屬性,引數而已,當客戶端傳送請求過來時,如果將user物件的一些屬性同時傳遞過來,那麼容器將會自動將user例項化。3 service是需要注入,因為,service是...