#{} 和 ${} 的區別---使用 ${} 會有sql注入的問題


很簡單的一個排序字段,但是因為使用 ${} 占位符的原因,有sql注入的風險,相信大家平時也經常會使用這個占位符,不知道有沒有考慮sql注入的問題,下面簡單介紹下 #{} 和 ${} 的區別以及為什么使用 ${} 會有sql注入的問題。

區別
#{}是一個參數占位符,對於String類型會自動加上"",其他類型不加。由於Mybatis采用預編譯,其后的參數不會再進行SQL編譯,所以一定程度上防止SQL注入。
${}是一個簡單的String替換,字符串是什么,解析就是什么。
類如order by。假如前端傳的參數是id(假設id是String類型),對於order by #{id},對應的sql語句就是 order by “id”;對於order by ${id},對應的sql語句則是order by id。這種情況,當用戶傳參為id && 1=1 的時候,就會產生難以預計的后果。
解決方法
在原實體類里加入一個map
public Map<String,String> indexMap=new HashMap<String,String>(){
{
put("spaceId","space_id"); // key為前端傳的值,value為數據庫對應的列值
put("optTime","opt_time");
}
};
當傳參時,判斷參數是否在map的key中,如果存在的話,就把對應的value作為排序的依賴條件。
if(paramOptLog.getOrderBy()!=null &&Strings.isNullOrEmpty(paramOptLog.getOrderBy())){
OptLog optLog=new OptLog();
paramOptLog.setOrderBy(optLog.indexMap.getOrDefault(paramOptLog.getOrderBy(), "id"));
}
List<OptLog> list = optLogMapper.query4Page(paramOptLog);
}
總結就是通過映射,由程序員來決定 ${} 傳的參數,即將動態sql轉成靜態sql的方式可以解決這個問題,這樣在實際調用的時候就不會有sql注入的風險了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM