您好,登錄后才能下訂單哦!
這篇文章給大家介紹mybatis使用${}時(shí)sql注入的問題怎么解決,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
最近在上線項(xiàng)目的時(shí)候,代碼審查沒有通過,提示有sql注入的風(fēng)險(xiǎn)。
ORDER BY ${orderBy}
很簡單的一個(gè)排序字段,但是因?yàn)槭褂?${} 占位符的原因,有sql注入的風(fēng)險(xiǎn),相信大家平時(shí)也經(jīng)常會使用這個(gè)占位符,不知道有沒有考慮sql注入的問題,下面簡單介紹下 #{} 和 ${} 的區(qū)別以及為什么使用 ${} 會有sql注入的問題。
#{}是一個(gè)參數(shù)占位符,對于String類型會自動(dòng)加上"",其他類型不加。由于Mybatis采用預(yù)編譯,其后的參數(shù)不會再進(jìn)行SQL編譯,所以一定程度上防止SQL注入。
${}是一個(gè)簡單的String替換,字符串是什么,解析就是什么。
類如order by。假如前端傳的參數(shù)是id(假設(shè)id是String類型),對于order by #{id},對應(yīng)的sql語句就是 order by “id”;對于order by ${id},對應(yīng)的sql語句則是order by id。這種情況,當(dāng)用戶傳參為id && 1=1 的時(shí)候,就會產(chǎn)生難以預(yù)計(jì)的后果。
在原實(shí)體類里加入一個(gè)map
public Map<String,String> indexMap=new HashMap<String,String>(){ { put("spaceId","space_id"); // key為前端傳的值,value為數(shù)據(jù)庫對應(yīng)的列值 put("optTime","opt_time"); } };
當(dāng)傳參時(shí),判斷參數(shù)是否在map的key中,如果存在的話,就把對應(yīng)的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); }
總結(jié)就是通過映射,由程序員來決定 ${} 傳的參數(shù),即將動(dòng)態(tài)sql轉(zhuǎn)成靜態(tài)sql的方式可以解決這個(gè)問題,這樣在實(shí)際調(diào)用的時(shí)候就不會有sql注入的風(fēng)險(xiǎn)了。
不會進(jìn)行預(yù)編譯,會被sql注入
注入方式如下:
密碼隨便輸一個(gè)就可以通過驗(yàn)證,只要用戶名正確即可。
這樣輸入后查詢語句在數(shù)據(jù)庫中如下:
select id,username,password from userLogin where username='admin' OR 1=1 and password='23'
sql解釋:AND優(yōu)先級高于OR 首先判斷后面1=1 and password='23'為false,然后判斷前面username='admin'為true中間
連接為OR即最后為true OR false 最后還是為true,就直接通過驗(yàn)證,能夠正常登陸admin用戶。
這樣會進(jìn)行預(yù)編譯,能夠防止sql注入。sql注入只有在編譯時(shí)才有效,而預(yù)編譯的時(shí)候是用個(gè)?代替參數(shù),真正執(zhí)行時(shí)才把參數(shù)替換?。
關(guān)于mybatis使用${}時(shí)sql注入的問題怎么解決就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。