sql注入ibatis
① IBatis如何防範sql 注入攻擊
UnSafeBean b = (UnSafeBean)sqlMap.queryForObject(」value」, request.getParameter(」name」));
漏洞1 說明:
其中sqlmap方式是把$*$ 替換,假設用戶輸入 『;drop table admin–
那麼翻譯為本地SQL為
select * from table where name like 『%』;drop table admin–%』
修補方法:
採用 #*# 的方式 sqlmap是採用 預編譯方式處理
把轉義操作交給資料庫本身!
② ibatis可以動態注入sql嗎
<typeAlias alias="author" type="com.ibatis.Author"/>
<resultMap id="authorResult" class="author">
<result property="id" column="ID"/>
<result property="name" column="NAME"/>
<result property="address" column="ADDRESS"/>
<result property="gender" column="GENDER"/>
<result property="age" column="AGE"/>
</resultMap>
<select id="getAllAuthor" resultMap="accountResult" >
select $fieldname$ from author
</select>
再檢查com.ibatis.Author是否屬性都對應上了。
③ hibernate能否防止sql注入
struts2不涉及sql,要防止sql注入,只需要你在持久層創建Statement對象時,調用Connection對象的prepareStatement方法創建出PreparedStatement對象,用該對象來發送sql語句即可。該對象發送的sql是預編譯的,所以可以防止sql注入。另外如果你用了Hibernate或者ibatis的話,就不用糾結這個問題了
④ mybatis在傳參時,為什麼#能夠有效的防止sql注入
因為在mybatis中,」${xxx}」這樣格式的參數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用「${xxx}」這樣的參數格式,所以,這樣的參數需要程序開發者在代碼中手工進行處理來防止注入。
#xxx# 代表xxx是屬性值,map裡面的key或者是你的pojo對象裡面的屬性, ibatis會自動在它的外面加上引號,表現在sql語句是這樣的 where xxx = 'xxx' ;
$xxx$ 則是把xxx作為字元串拼接到sql語句中, 比如 order by topicId , 語句這樣寫 ... order by #xxx# ibatis 就會翻譯成order by 'topicId' (這樣就會報錯) 語句這樣寫 ... order by $xxx$ ibatis 就會翻譯成 order by topicId
#將傳入的數據都當成一個字元串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麼解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".
2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那麼解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id
所以說#方式能夠很大程度防止sql注入。
⑤ struts2怎麼防止sql注入
sql注入大家都不陌生,是一種常見的攻擊方式,攻擊者在界面的表單信息或url上輸入一些奇怪的sql片段,例如「or 『1』=』1』」這樣的語句,有可能入侵參數校驗不足的應用程序。所以在我們的應用中需要做一些工作,來防備這樣的攻擊方式。在一些安全性很高的應用中,比如銀行軟體,經常使用將sql語句全部替換為存儲過程這樣的方式,來防止sql注入,這當然是一種很安全的方式,但我們平時開發中,可能不需要這種死板的方式。
一起jquery,17jquery
mybatis框架作為一款半自動化的持久層框架,其sql語句都要我們自己來手動編寫,這個時候當然需要防止sql注入。其實Mybatis的sql是一個具有「輸入+輸出」功能,類似於函數的結構,如下:
一起jquery,17jquery
<</span>select id="getBlogById" resultType="Blog" parameterType=」int」>
17jquery.com
select id,title,author,content 內容來自17jquery
from blog where id=#{id} 一起jquery,17jquery
</</span>select> 內容來自17jquery
這里,parameterType標示了輸入的參數類型,resultType標示了輸出的參數類型。回應上文,如果我們想防止sql注入,理所當然地要在輸入參數上下功夫。上面代碼中高亮部分即輸入參數在sql中拼接的部分,傳入參數後,列印出執行的sql語句,會看到sql是這樣的:
內容來自17jquery
select id,title,author,content from blog where id = ?
一起jquery,17jquery
不管輸入什麼參數,列印出的sql都是這樣的。這是因為mybatis啟用了預編譯功能,在sql執行前,會先將上面的sql發送給資料庫進行編譯,執行時,直接使用編譯好的sql,替換佔位符「?」就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。
一起jquery,17jquery
mybatis是如何做到sql預編譯的呢?其實在框架底層,是jdbc中的PreparedStatement類在起作用,PreparedStatement是我們很熟悉的Statement的子類,它的對象包含了編譯好的sql語句。這種「准備好」的方式不僅能提高安全性,而且在多次執行一個sql時,能夠提高效率,原因是sql已編譯好,再次執行時無需再編譯。 一起jquery,17jquery
話說回來,是否我們使用mybatis就一定可以防止sql注入呢?當然不是,請看下面的代碼:
17jquery.com
<</span>select id="orderBlog" resultType="Blog" parameterType=」map」>
17jquery.com
select id,title,author,content 一起jquery,17jquery
from blog order by ${orderParam}
17jquery.com
</</span>select>
內容來自17jquery
仔細觀察,內聯參數的格式由「#{xxx}」變為了${xxx}。如果我們給參數「orderParam」賦值為」id」,將sql列印出來,是這樣的:
內容來自17jquery
select id,title,author,content from blog order by id
一起jquery,17jquery
顯然,這樣是無法阻止sql注入的。在mybatis中,」${xxx}」這樣格式的參數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用「${xxx}」這樣的參數格式,所以,這樣的參數需要我們在代碼中手工進行處理來防止注入。 一起jquery,17jquery
結論:在編寫mybatis的映射語句時,盡量採用「#{xxx}」這樣的格式。若不得不使用「${xxx}」這樣的參數,要手工地做好過濾工作,來防止sql注入攻擊。
⑥ ibatis中使用like時怎麼避過sql注入
ibatis中使用like時如何避過sql注入
普通的拼寫方式為:
<if test="remark != null and remark != ''">and remark like '%'+#{remark}+'%'</if>
如果遇到變數名剛好是資料庫的關鍵字,拼寫方式如下所示:
<if test="action != null and action != ''">
<![CDATA[
and action like '%'+#{action}+'%'
]]>
</if>
⑦ 如何從根本上防止 SQL 注入
sql注入漏洞常見於用戶輸入時,如輸入賬戶時。處理辦法一般有:
1、使用強類型開發語言,如java\c\c++\c#等;
2、使用OWASP API等工具插件對輸入的參數進行轉碼;
3、使用PrepareStatement介面來取代Statement來封裝帶入的參數(set方法);
4、使用成熟的持久層框架,如ibatis來處理數據存儲;
5、對用戶輸入的字元串進行後台校驗,禁止關鍵字(SELECT\DELETE\INSERT\OR\=\--等)
6、盡可能少用字元串拼接形成sql語句;
7、關鍵條件語句寫在帶入參數的前面,含有帶入參數的部分用括弧括起來,如"select *from table where if_important='Y' and (user_name="+userName+")";
⑧ Ibatis裡面用in寫SQL語句,問什麼報下面的錯
ibatis sql in 操作(iterate屬性)
1、使用iterate屬性,status為數組。
<isNotNull property="status">
<![CDATA[ status in ]]>
<iterate property="status" conjunction="," open="(" close=")">
#status[]#
</iterate>
</isNotNull>
2、使用$,但這種寫法存在一定的風險,可能會引起sql注入。
SELECT * FROM test WHERE status in ($status$);