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

結(jié)合Mybatis聊聊對SQL注入的見解

 更新時間:2021年12月15日 09:26:40   作者:夢已醒花未落  
這篇文章主要介紹了結(jié)合Mybatis聊聊對SQL注入的見解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Mybatis聊聊對SQL注入的見解

1.sql注入是什么

sql注入見名思意,是指一些非法用戶通過將一些特殊字符或者sql語句插入到要提交的表單之中,從而讓服務(wù)器在不知情的情況下執(zhí)行惡意的sql命令,從而引發(fā)一系列的安全隱患。

講的通俗一點就是說,用戶利用sql語法將一些sql語句加在某些字段后面,提交表單的時候,服務(wù)器執(zhí)行sql命令并未達(dá)到想要的結(jié)果反而引發(fā)異常和數(shù)據(jù)泄露。

這就是典型的系統(tǒng)漏洞,因此sql注入對系統(tǒng)的危害是非常大的,做好防止sql注入也是系統(tǒng)必須完善的。

2.sql注入實例

我寫了個簡單的登錄程序,框架是Spring+SpringMVC+Mybatis。表結(jié)構(gòu)如下:

(1)特殊符號,如 ' 和 .等

可以看到當(dāng)我輸入一個特殊符號,而后臺未經(jīng)過過濾的時候,便會拋出sql異常:

并且如果沒有進(jìn)行全局異常處理,用戶便可以通過瀏覽器的開發(fā)者模式中獲取到數(shù)據(jù)庫和查詢語句的相關(guān)信息。

而這個對系統(tǒng)來說是很危險的漏洞。

(2)sql語句的注入

當(dāng)輸入正確的賬號密碼的時候,可以看到執(zhí)行時成功的。

但是如果加上這么一句sql語句在表單,我們可以看到結(jié)果依然可以執(zhí)行成功

非法用戶可以通過這個來測試數(shù)據(jù)庫的表名字、該表的其他字段名、數(shù)據(jù)的量級等等。

舉個例子:嘗試獲取到該表的其他字段名

只需要將剛才的表單中的“1=1”替換成測試sql語句即可,如果執(zhí)行成功則代表該表中有這個字段存在。

看一下最后執(zhí)行的sql語句:

就一目了然了。這通用是因為注入引起的。

類似的還有:'or''=' 不僅能執(zhí)行成功,同時還有查詢多全部的數(shù)據(jù)。

(3)通過sql語句的in和order by進(jìn)行注入

以上的三點主要是因為在mybatis中使用了${}, sql語句沒有執(zhí)行預(yù)編譯,無法防止sql注入。

3.mybatis框架下如何解決sql注入問題

mybatis框架本身就有防止sql注入的特性,這就要求我們必須在寫sql語句時候遵循框架的書寫規(guī)范。

(1)用#{param}替換所有的${param}

因為${}是拼接sql字符實現(xiàn)沒有預(yù)編譯的查詢,因為是無法防御sql注入,而#{}則需要進(jìn)行預(yù)編譯,可以很大程度上防止sql注入。

在一些#{}使用時候會報錯的地方,如like 查詢、in 查詢、order by排序等,

a) like:

select * from Users where username like '%${username}%'

替換成:

select * from Users where username like concat('%', #{username}, '%')

b) in

select * from Users where id in (${id})

替換成mybatis框架自帶的foreach循環(huán):

c) order by

不要直接使用:拼接排序

如:

select *from Users order by ${id}

而是在java層面做映射,然后用<if>來做判斷

其他的類似的情況請按照相同的處理方式進(jìn)行處理即可。

(2)對用戶輸入的數(shù)據(jù)進(jìn)行sql注入校驗

SqlServer本身的防sql注入機(jī)制,利用存儲過程可以避免sql注入。應(yīng)該禁止用戶輸入一些關(guān)鍵的特殊符號,如分號、分隔符、單引號等,同時對于一些關(guān)鍵位置進(jìn)行sql關(guān)鍵字的屏蔽,如or、and等。必須對用戶輸入的內(nèi)容的類型、長度、格式、范圍進(jìn)行校驗。

(3)要對用戶的權(quán)限進(jìn)行區(qū)分

普通用戶的權(quán)限和管理員的權(quán)限之間,必須嚴(yán)格區(qū)分開來,對管理員實現(xiàn)安全級別更高的驗證,從而防止人為獲取到更高權(quán)限時候的sql注入攻擊。

(4)更高級別的驗證

在后端代碼和數(shù)據(jù)庫中都開啟對sql注入的驗證,同時用專業(yè)的注入工具查找本系統(tǒng)的漏洞進(jìn)行修復(fù),也可以進(jìn)行賬號誘騙,將一些如“admin”之類的容易受到攻擊的用戶設(shè)置上千位的密碼,讓攻擊者的軟件因為解析量大而負(fù)載過大,從而耗盡資源而宕機(jī)。

一種常見的Mybatis的SQL注入

1.場景重現(xiàn)

現(xiàn)在有一張名為student的表,表結(jié)構(gòu)如下:

在這里插入圖片描述

其中id為自增主鍵,余下字段分別為英語成績、數(shù)學(xué)成績、美術(shù)成績、學(xué)生的學(xué)號、學(xué)生的姓名、學(xué)生的電話。

目前表里面有6條數(shù)據(jù):

在這里插入圖片描述

2.代碼展示

使用mybatis框架實現(xiàn)根據(jù)美術(shù)成績查找相應(yīng)的記錄,在mapper.xml文件里,代碼大概會這么寫:

 <!--通過美術(shù)成績作為篩選條件查詢-->
    <select id="queryByArtGrade" resultMap="StudentMap">
        select
        id, english_grade, math_grade, art_grade, number, name, telephone
        from student
        <where>
            <if test="artGrade != null">
                and art_grade = #{artGrade}
            </if>
        </where>
    </select>

當(dāng)然也可以這么寫:

 <!--通過美術(shù)成績作為篩選條件查詢-->
    <select id="queryByArtGrade" resultMap="StudentMap">
        select
        id, english_grade, math_grade, art_grade, number, name, telephone
        from student
        <where>
            <if test="artGrade != null">
                and art_grade = ${artGrade}
            </if>
        </where>
    </select>

這兩種寫法的區(qū)別在于對傳入?yún)?shù)的接收方式不同,前者是#{property},后者是${property}。

3.模擬請求&回應(yīng)結(jié)果

想查詢美術(shù)成績?yōu)?0的記錄,使用postman進(jìn)行請求,傳入?yún)?shù)json為:

{

"artGrade":"70"

}

測試結(jié)果兩者均為:

在這里插入圖片描述

看起來好像是一樣的結(jié)果,兩種寫法都正確。

但是我把參數(shù)改成下面的這個樣子:

{

"artGrade":"'70' and id='4'"

}

結(jié)果就完全不同啦!

使用#{property}返回的結(jié)果為空:

在這里插入圖片描述

通過日志,發(fā)現(xiàn)實際執(zhí)行的SQL為:

select id, english_grade, math_grade, art_grade, number, name, telephone from classroom.student WHERE art_grade = "'70' and id='4'"

使用${property}返回的結(jié)果為一條:

在這里插入圖片描述

通過日志,發(fā)現(xiàn)實際執(zhí)行的SQL為:

select id, english_grade, math_grade, art_grade, number, name, telephone from classroom.student WHERE art_grade = '70' and id='4'

4.小結(jié)一下

這就是常見的sql注入了,因為后端接收傳入?yún)?shù)的時候沒有經(jīng)過任何處理,直接到了mybatis層,而mybatis層接收參數(shù)的時候又使用了${property}這種方式,導(dǎo)致參數(shù)被直接拼接至預(yù)執(zhí)行的SQL中,最后返回了一些惡意請求者需要的信息。

所以,mapper中盡量避免使用${property}來接收參數(shù),因為你不知道上一層傳進(jìn)來的東西到底是什么。

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

相關(guān)文章

  • JAVA 日常開發(fā)中Websocket示例詳解

    JAVA 日常開發(fā)中Websocket示例詳解

    JAVA |日常開發(fā)中Websocket詳解,WebSocket是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議,它在Web應(yīng)用中實現(xiàn)了客戶端與服務(wù)器之間的實時數(shù)據(jù)傳輸,本文將詳細(xì)介紹Java開發(fā)中WebSocket的使用,包括基本概念、Java API、使用示例以及注意事項,感興趣的朋友一起看看吧
    2024-12-12
  • SpringBoot解決BigDecimal傳到前端后精度丟失問題

    SpringBoot解決BigDecimal傳到前端后精度丟失問題

    這篇文章將通過示例詳細(xì)為大家介紹SpringBoot如何解決BigDecimal傳到前端后精度丟失問題,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-06-06
  • 基于Ajax用戶名驗證、服務(wù)條款加載、驗證碼生成的實現(xiàn)方法

    基于Ajax用戶名驗證、服務(wù)條款加載、驗證碼生成的實現(xiàn)方法

    本篇文章對Ajax用戶名驗證、服務(wù)條款加載、驗證碼生成的實現(xiàn)方法,進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • Java全面解析string類型的xml字符串

    Java全面解析string類型的xml字符串

    這篇文章主要介紹了Java全面解析string類型的xml字符串,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中四種訪問控制權(quán)限解析(private、default、protected、public)

    Java中四種訪問控制權(quán)限解析(private、default、protected、public)

    java當(dāng)中有4種訪問修飾限定符privat、default(默認(rèn)訪問權(quán)限),protected以及public,本文就詳細(xì)的介紹一下這四種方法的具體使用,感興趣的可以了解一下
    2023-05-05
  • Java8?lambda表達(dá)式的10個實例講解

    Java8?lambda表達(dá)式的10個實例講解

    這篇文章主要介紹了Java8?lambda表達(dá)式的10個實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java的SimpleDateFormat線程不安全的幾種解決方案

    java的SimpleDateFormat線程不安全的幾種解決方案

    但我們知道SimpleDateFormat是線程不安全的,處理時要特別小心,要加鎖或者不能定義為static,要在方法內(nèi)new出對象,再進(jìn)行格式化,本文就介紹了幾種方法,感興趣的可以了解一下
    2021-08-08
  • Java如何去掉指定字符串的開頭的指定字符

    Java如何去掉指定字符串的開頭的指定字符

    這篇文章主要介紹了Java去掉指定字符串的開頭的指定字符操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用Spring的注解方式實現(xiàn)AOP實例

    使用Spring的注解方式實現(xiàn)AOP實例

    本篇文章主要介紹了使用Spring的注解方式實現(xiàn)AOP實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Guava本地緩存的使用過程

    Guava本地緩存的使用過程

    文章介紹了使用Guava和Redis實現(xiàn)二級緩存的原因,以及如何通過Guava作為一級緩存,Redis作為二級緩存來減少數(shù)據(jù)庫壓力,提高緩存的可靠性,同時,通過一個具體示例說明了如何在微服務(wù)場景中使用Guava和Redis進(jìn)行二級緩存,最后,總結(jié)了Guava的參數(shù)機(jī)制
    2025-01-01

最新評論

崇仁县| 西华县| 翁源县| 翁源县| 集安市| 略阳县| 江川县| 焦作市| 新竹县| 施秉县| 临泉县| 尉犁县| 永嘉县| 贵定县| 隆尧县| 城固县| 花垣县| 太仓市| 三河市| 如东县| 顺义区| 潞城市| 涟水县| 长武县| 五峰| 彩票| 灵石县| 奉节县| 葫芦岛市| 固原市| 新宾| 和静县| 福泉市| 陵川县| 哈密市| 安福县| 吉木乃县| 塘沽区| 革吉县| 剑川县| 邵武市|