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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...