中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mybatis對SQL注入的方法是什么

發布時間:2021-12-16 10:37:54 來源:億速云 閱讀:495 作者:iii 欄目:開發技術

本篇內容介紹了“Mybatis對SQL注入的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    Mybatis聊聊對SQL注入的見解

    1.sql注入是什么

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

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

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

    2.sql注入實例

    我寫了個簡單的登錄程序,框架是Spring+SpringMVC+Mybatis。表結構如下:

    Mybatis對SQL注入的方法是什么

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

    Mybatis對SQL注入的方法是什么

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

    Mybatis對SQL注入的方法是什么

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

    Mybatis對SQL注入的方法是什么

    而這個對系統來說是很危險的漏洞。

    (2)sql語句的注入

    Mybatis對SQL注入的方法是什么

    當輸入正確的賬號密碼的時候,可以看到執行時成功的。

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

    Mybatis對SQL注入的方法是什么

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

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

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

    Mybatis對SQL注入的方法是什么

    看一下最后執行的sql語句:

    Mybatis對SQL注入的方法是什么

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

    類似的還有:'or''=' 不僅能執行成功,同時還有查詢多全部的數據。

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

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

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

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

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

    因為${}是拼接sql字符實現沒有預編譯的查詢,因為是無法防御sql注入,而#{}則需要進行預編譯,可以很大程度上防止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循環:

    Mybatis對SQL注入的方法是什么

    c) order by

    不要直接使用:拼接排序

    如:

    select *from Users order by ${id}

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

    Mybatis對SQL注入的方法是什么

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

    (2)對用戶輸入的數據進行sql注入校驗

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

    (3)要對用戶的權限進行區分

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

    (4)更高級別的驗證

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

    一種常見的Mybatis的SQL注入

    一、場景重現

    現在有一張名為student的表,表結構如下:

    Mybatis對SQL注入的方法是什么

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

    目前表里面有6條數據:

    Mybatis對SQL注入的方法是什么

    二、代碼展示

    使用mybatis框架實現根據美術成績查找相應的記錄,在mapper.xml文件里,代碼大概會這么寫:

     <!--通過美術成績作為篩選條件查詢-->
        <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>

    當然也可以這么寫:

     <!--通過美術成績作為篩選條件查詢-->
        <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>

    這兩種寫法的區別在于對傳入參數的接收方式不同,前者是#{property},后者是${property}。

    三、模擬請求&回應結果

    想查詢美術成績為70的記錄,使用postman進行請求,傳入參數json為:

    {

    "artGrade":"70"

    }

    測試結果兩者均為:

    Mybatis對SQL注入的方法是什么

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

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

    {

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

    }

    結果就完全不同啦!

    使用#{property}返回的結果為空:

    Mybatis對SQL注入的方法是什么

    通過日志,發現實際執行的SQL為:

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

    使用${property}返回的結果為一條:

    Mybatis對SQL注入的方法是什么

    通過日志,發現實際執行的SQL為:

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

    “Mybatis對SQL注入的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    阳泉市| 泰安市| 常山县| 正阳县| 伊春市| 武山县| 陆丰市| 宕昌县| 台南市| 宁国市| 广水市| 吉安市| 饶平县| 温州市| 岳西县| 永宁县| 迁西县| 昌乐县| 安龙县| 高安市| 汉中市| 兴山县| 家居| 汝南县| 五大连池市| 宣威市| 霍林郭勒市| 陇南市| 庆安县| 茌平县| 德庆县| 桃园县| 宁强县| 宾阳县| 吴旗县| 宝兴县| 铁岭市| 克山县| 黔东| 汶川县| 休宁县|