1. 程式人生 > >iBatis解決自動防止sql注入

iBatis解決自動防止sql注入

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

#xxx# 代表xxx是屬性值,map裡面的key或者是你的pojo物件裡面的屬性, ibatis會自動在它的外面加上引號,表現在sql語句是這樣的where xxx = 'xxx' ;

(1)ibatis xml配置:下面的寫法只是簡單的轉義name like '%$name$%'
 
(2) 這時會導致sql注入問題,比如引數name傳進一個單引號“'”,生成的sql語句會是:name like '%'%'
 
(3) 解決方法是利用字串連線的方式來構成sql語句name like '%'||'#name#'||'%'
 
(4) 這樣引數都會經過預編譯,就不會發生sql注入問題了。
 
(5)#與$區別:
 
$xxx$ 則是把xxx作為字串拼接到你的sql語句中, 比如order by topicId , 語句這樣寫... order by #xxx# ibatis 就會把他翻譯成order by 'topicId' (這樣就會報錯) 語句這樣寫... order by $xxx$ ibatis 就會把他翻譯成order by topicId

 

 

假設使用者執行

  select * from product where id = 5    這條語句。其中5是有使用者輸入的。   SQL注入的含義就是,一些搗蛋使用者輸入的不是5,而是       5;  delete  from  orders       那麼原來的SQL語句將會變為,     select * from product where id=5;  delete  from  orders  .   在執行完select後,還將刪除orders表裡的所有記錄。(如果他只刪了這些記錄,已經謝天謝地了,他可能會做更可怕地事情)。       不過慶幸的是,Ibatis使用的是預編譯語句(PreparedStatement s )。   上述語句會被編譯為,     select * from product where id=?    從而有效防止SQL注入。       不過當你使用$佔位符時就要注意了。   例如:動態的選擇列和表     SELECT * FROM $TABLE_NAME$ WHERE $COLUMN_NAME$ = #value#    這時你一定要仔細過濾那些值以避免SQL注入。當然這種情況不只存在Ibatis中。  

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述