Mybatis檢查SQL註入

来源:https://www.cnblogs.com/mysticbinary/archive/2020/04/01/12613243.html
-Advertisement-
Play Games

Mybatis 的 Mapper.xml 語句中 parameterType 向SQL語句傳參有兩種方式:\ { } 和 ${ }。 使用\ { }是來防止SQL註入,使用${ }是用來動態拼接參數。 如何排查出 1. 檢查是否有\$號 如果你使用的是ide代碼編輯器,那麼可以通過全局搜索 , 快速 ...


Mybatis 的 Mapper.xml 語句中 parameterType 向SQL語句傳參有兩種方式:#{ } 和 ${ }。

使用#{ }是來防止SQL註入,使用${ }是用來動態拼接參數。


如何排查出

1. 檢查是否有$號

如果你使用的是ide代碼編輯器,那麼可以通過全局搜索${ , 快速定位到使用${ }拼接SQL的語句,在去找到外部傳入參數的入口,閉合sql證明即可。

2. 檢查是否有order by語句

同樣的在搜索是否使用order by排序語句,如果有一步一步追蹤是否有外部參數,未過濾就直接傳遞到order by語句裡面來。


為什麼#{ }就安全

#{ } 就類似JDBC的預編譯,所以安全。類似如下SQL語句:(JDBC預編譯的原理,希望後面能專門去研究一下,並寫博文)

  • 使用 ${ }效果是:
select * from testtable where id="1" or true or id  # 1後面就是被攻擊者惡意構造的字元

  • 而使用#{ } 的效果是:
select * from testtable where id="1\" or true or id\""         # 1後面就是被攻擊者惡意構造的字元


什麼情況下用不了#{}

答案是:在order by 排序語句的情況下不行,為什麼?

先複習一下order by的用法

order by就是一個排序的工具。

# 這個1就是指第一個列索引,也可以寫id (列索引)
select * from testtable ORDER BY 1 ASC #ASC表示按升序排序,DESC表示按降序排序

# 兩個代碼是一樣的
select * from testtable ORDER BY id ASC #ASC表示按升序排序,DESC表示按降序排序


對於order by 我們是用不了#{}的,因為用了這個就會被自動轉換成字元串,自動加引號,這樣語句就不生效了。

<select id="selectStudentsByName" resultType="Student">
    select id,name,age,score from student order by #{column}
</select>

<!--編譯出來的結果如下:-->
select * from table order by 'column'

會發現加上“” 雙引號符號後,就沒法正常排序了。


如何解決:
使用${},MyBatis就不會修改或轉義改字元串。但是這樣又不安全,會導致潛在的SQL註入攻擊。所以我們需要自己去限制,不允許用戶輸入一些非法欄位,通常只使用白名單方式校驗。


總結

即使是安全的sql預編譯技術,也是有適用範圍的,一些應用場景也是不適用的。當我們在做黑盒或者審計的時候,碰到了預編譯處理不了的場景,比如說排序功能的時候就得格外註意了,不然被人order by註入就悲劇了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天推薦一下那些大神平常使用的電腦軟體和工具類網站,讓你秒變大神。 下麵的整理前面部分是基礎的軟體,做不做技術都需要安裝的一些,後面部分是對程式猿推薦的一些開發軟體和插件。 操作系統 1、微軟正版win10系統安裝:bai度搜索 下載Windows10(訪問這裡 "下載windows10" ) 2、 ...
  • 昨天,老師課後給出了一道題: 統計/etc/passwd中有多少個sbin 菜雞如我,沒想到怎麼做。只能在今天上課的時候認真聽聽老師講的方法。 grep o grep命令有一個參數 ,可以逐行輸出匹配的內容,有多少個匹配就有多少行。所以這道題可以這麼做: wc l 用來統計行數 另一種思路 老師還講 ...
  • 工作中,對於文本文件的編輯我們經常有這樣的需求: 多次重覆輸入一段相同文本; 生成一段序列化的文本; 每行文本插入一句相同的文本。 除此之外,還有很多需要重覆操作的動作。對於這些需求,如果我們人工去操作的話,肯定是非常枯燥乏味,並且要浪費很多時間精力。 這時, Vim 巨集就派上用場了,它可以通過一些 ...
  • 隨著互聯網的高速發展,傳統的關係資料庫(如MySQL、Microsoft SQL Server等)已不能滿足日益增長的業務需求,如商品秒殺、搶購等及時性非常強的功能,隨著應用高併發的訪問,會造成系統資料庫崩潰,為瞭解決此種情況,需要引用一個緩存中間件,市面上比較常用的緩存中間件有Redis 和 Me... ...
  • 鏈接:https://blog.csdn.net/qq_41059374/article/details/80695581?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.no ...
  • 一個字元類型的、一個int類型的,查詢的時候到底會不會走索引,其實很多工作了幾年的開發人員有時也會暈,下麵就用具體事例來測試一下。 1. 準備工作 先準備2張表,以備後續測試使用。 表1:創建表test1,總共3列,其中id 是主鍵(int),c_no 為int型,且有索引,c_2為普通欄位 /*創 ...
  • 鏈接1:https://blog.csdn.net/u012453843/article/details/70878117 鏈接2:https://www.cnblogs.com/niunafei/p/11294560.html ...
  • 事情的起因呢,是因為朋友問我的。幾經周折,自己粗心大意了很多細節,不廢話,直接開始 一、redis的安裝我就略過了, 二、修改redis的配置文件 redis.conf 1. bind 設置為 0.0.0.0 2. protected-mode 設置為no (也就是關閉保護模式) 3. daemon ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...