SQL注入
什么是SQL注入呢?首先SQL注入是一種攻擊手段,一種使用構造惡意的SQL語句,欺騙服務器執行SQL命令,讓后台的數據庫去解析,從而達到入侵目標網絡,獲取敏感信息的攻擊手段。
MyBatis如何防止SQL注入
SQL中#和$區別
# | $ |
相當於對數據加上雙引號 | 相當於直接顯示數據 |
很大程度上防止SQL注入 | 無法防止SQL注入 |
#{xxx},使用的是PreparedStatement,會有類型轉換,比較安全 | ${xxx},使用字符串拼接,容易SQL注入 |
簡單的說就是#{}是經過預編譯的,是安全的,${}是未經過預編譯的,僅僅是取變量的值,是非安全的,存在SQL注入。
例子
1 <select id="selectBackGoodsDetail" resultType="java.util.Map"> 2 SELECT sum(a.item_num) backGoodsNum,a.item_price backGoodsPrice, 3 sum(a.item_num * a.item_price) backGoodsSumPrice, 4 b.barcode,b.name itemName,b.weight,c.name itemCategoryName 5 FROM back_goods_detail a 6 LEFT JOIN item b ON a.item_id=b.id 7 LEFT JOIN item_category c ON b.item_category_id =c.id 8 <where> 9 <if test="backGoodsId!=null"> 10 a.back_goods_id = #{backGoodsId} 11 </if> 12 <if test="itemCategoryId!=null"> 13 AND b.item_category_id = #{itemCategoryId} 14 </if> 15 <if test="searchKey!= null"> 16 AND (b.sequence LIKE CONCAT('%', #{searchKey}, '%') 17 OR b.name LIKE CONCAT('%', #{searchKey}, '%') 18 OR b.barcode LIKE CONCAT('%',#{searchKey},'%')) 19 </if> 20 </where> 21 GROUP BY a.item_id 22 LIMIT #{pageStart},#{pageNum} 23 </select>