最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于mybatis使用${}時(shí)sql注入的問(wèn)題

 更新時(shí)間:2021年12月15日 16:57:57   作者:ZS-Oliver  
這篇文章主要介紹了關(guān)于mybatis使用${}時(shí)sql注入的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

mybatis使用${}時(shí)sql注入的問(wèn)題

最近在上線(xiàn)項(xiàng)目的時(shí)候,代碼審查沒(méi)有通過(guò),提示有sql注入的風(fēng)險(xiǎn)。

ORDER BY ${orderBy}

很簡(jiǎn)單的一個(gè)排序字段,但是因?yàn)槭褂?${} 占位符的原因,有sql注入的風(fēng)險(xiǎn),相信大家平時(shí)也經(jīng)常會(huì)使用這個(gè)占位符,不知道有沒(méi)有考慮sql注入的問(wèn)題,下面簡(jiǎn)單介紹下 #{} 和 ${} 的區(qū)別以及為什么使用 ${} 會(huì)有sql注入的問(wèn)題。

區(qū)別

  • #{}是一個(gè)參數(shù)占位符,對(duì)于String類(lèi)型會(huì)自動(dòng)加上"",其他類(lèi)型不加。由于Mybatis采用預(yù)編譯,其后的參數(shù)不會(huì)再進(jìn)行SQL編譯,所以一定程度上防止SQL注入。
  • ${}是一個(gè)簡(jiǎn)單的String替換,字符串是什么,解析就是什么。
  • 類(lèi)如order by。假如前端傳的參數(shù)是id(假設(shè)id是String類(lèi)型),對(duì)于order by #{id},對(duì)應(yīng)的sql語(yǔ)句就是 order by “id”;對(duì)于order by ${id},對(duì)應(yīng)的sql語(yǔ)句則是order by id。這種情況,當(dāng)用戶(hù)傳參為id && 1=1 的時(shí)候,就會(huì)產(chǎn)生難以預(yù)計(jì)的后果。

解決方法

  • 在原實(shí)體類(lèi)里加入一個(gè)map
 public Map<String,String> indexMap=new HashMap<String,String>(){
        {
            put("spaceId","space_id"); // key為前端傳的值,value為數(shù)據(jù)庫(kù)對(duì)應(yīng)的列值
            put("optTime","opt_time");
        }
    };
  • 當(dāng)傳參時(shí),判斷參數(shù)是否在map的key中,如果存在的話(huà),就把對(duì)應(yīng)的value作為排序的依賴(lài)條件。
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é)就是通過(guò)映射,由程序員來(lái)決定 ${} 傳的參數(shù),即將動(dòng)態(tài)sql轉(zhuǎn)成靜態(tài)sql的方式可以解決這個(gè)問(wèn)題,這樣在實(shí)際調(diào)用的時(shí)候就不會(huì)有sql注入的風(fēng)險(xiǎn)了。

mybatis sql注入問(wèn)題之$與#

在mybatis中使用$符號(hào)

不會(huì)進(jìn)行預(yù)編譯,會(huì)被sql注入

注入方式如下:

密碼隨便輸一個(gè)就可以通過(guò)驗(yàn)證,只要用戶(hù)名正確即可。

這樣輸入后查詢(xún)語(yǔ)句在數(shù)據(jù)庫(kù)中如下:

select id,username,password from userLogin where username='admin' OR 1=1 and password='23'

sql解釋?zhuān)?/strong>AND優(yōu)先級(jí)高于OR 首先判斷后面1=1 and password='23'為false,然后判斷前面username='admin'為true中間

連接為OR即最后為true OR false 最后還是為true,就直接通過(guò)驗(yàn)證,能夠正常登陸admin用戶(hù)。

在mybatis中使用#符號(hào)

這樣會(huì)進(jìn)行預(yù)編譯,能夠防止sql注入。sql注入只有在編譯時(shí)才有效,而預(yù)編譯的時(shí)候是用個(gè)?代替參數(shù),真正執(zhí)行時(shí)才把參數(shù)替換?。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中@requestMappling注解的使用

    java中@requestMappling注解的使用

    本文主要介紹了java中@requestMappling注解的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 談?wù)凥ttpClient使用詳解

    談?wù)凥ttpClient使用詳解

    這篇文章給大家介紹HttpClient使用,httpClient是一個(gè)客戶(hù)端的http通信實(shí)現(xiàn)庫(kù),HttpClient的目標(biāo)是發(fā)送和接收HTTP報(bào)文。本文講解的非常詳細(xì),對(duì)HttpClient使用感興趣的朋友可以參考下
    2015-10-10
  • Java之System.getProperty()的作用及使用說(shuō)明

    Java之System.getProperty()的作用及使用說(shuō)明

    這篇文章主要介紹了Java之System.getProperty()的作用及使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • spring?boot?使用Mybatis-plus查詢(xún)方法解析

    spring?boot?使用Mybatis-plus查詢(xún)方法解析

    這篇文章主要介紹了spring?boot?使用Mybatis-plus查詢(xún)方法解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解Spring事務(wù)回滾的兩種方法

    詳解Spring事務(wù)回滾的兩種方法

    Spring事務(wù)回滾的前提是你當(dāng)前使用的數(shù)據(jù)庫(kù)必須支持事務(wù),比如MySQL的Innodb是支持的,但Mysaim則是不支持事務(wù)的,本文就給大家介紹兩種Spring事務(wù)回滾的方法,需要的朋友可以參考下
    2023-07-07
  • Java通過(guò)IO流輸出文件目錄的實(shí)例代碼

    Java通過(guò)IO流輸出文件目錄的實(shí)例代碼

    這篇文章主要介紹了Java通過(guò)IO流輸出文件目錄,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java實(shí)現(xiàn)堆排序(大根堆)的示例代碼

    Java實(shí)現(xiàn)堆排序(大根堆)的示例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)堆排序(大根堆)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java實(shí)現(xiàn)SHA-1算法實(shí)例

    Java實(shí)現(xiàn)SHA-1算法實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)SHA-1算法,實(shí)例分析了java實(shí)現(xiàn)SHA-1算法的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 詳解spring boot rest例子

    詳解spring boot rest例子

    這篇文章主要介紹了詳解spring boot rest例子,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • java構(gòu)建OAuth2授權(quán)服務(wù)器

    java構(gòu)建OAuth2授權(quán)服務(wù)器

    本文主要介紹了java構(gòu)建OAuth2授權(quán)服務(wù)器,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07

最新評(píng)論

镇宁| 科技| 泰兴市| 黄山市| 乐都县| 涟源市| 翼城县| 石城县| 横山县| 平遥县| 定兴县| 射阳县| 响水县| 庆云县| 岳阳市| 南阳市| 伊川县| 长泰县| 磐安县| 丽水市| 南雄市| 商水县| 十堰市| 常州市| 织金县| 苏尼特左旗| 镇巴县| 广灵县| 前郭尔| 浦北县| 博野县| 德江县| 邳州市| 甘洛县| 寻甸| 吉木萨尔县| 蒙山县| 报价| 水富县| 鄱阳县| 英吉沙县|