【Java后端】MyBatis 與 MyBatis-Plus 如何防止 SQL 注入?從原理到實戰

在日常開發中,SQL 注入是一種常見但危害巨大的安全漏洞。如果你正在使用 MyBatis 或 MyBatis-Plus 進行數據庫操作,這篇文章將帶你系統了解:這兩個框架是如何防止 SQL 注入的,我們又該如何寫出安全的代碼。


什么是 SQL 注入?

SQL 注入(SQL Injection)是指攻擊者通過輸入惡意 SQL 語句,干擾原本正常的數據庫查詢,從而達到繞過登錄、獲取數據、甚至刪除數據庫的目的。

舉個例子:

SELECT * FROM user WHERE name = 'admin' AND password = '123456' OR '1'='1'

如果我們將用戶輸入直接拼接到 SQL 中,攻擊者就可能利用 OR '1'='1' 這樣的語句,繞過身份驗證。


MyBatis 如何防止 SQL 注入?

使用 #{} 占位符(參數綁定)

MyBatis 的推薦做法是:使用 #{} 進行參數綁定。這是最有效的 SQL 注入防范方式。

<select id="selectUserByName" resultType="User">SELECT * FROM user WHERE name = #{name}
</select>
  • #{name} 會被轉換為 JDBC 的 PreparedStatement 參數,占位符 ?
  • 由 MyBatis 自動將變量安全注入,避免注入風險。

避免 ${} 動態拼接

<select id="selectUserByName" resultType="User">SELECT * FROM user WHERE name = '${name}'
</select>
  • ${} 會直接將用戶輸入拼接到 SQL 字符串中。
  • 攻擊者可以輸入 ' OR 1=1 -- 這樣的語句,造成嚴重后果。

總結

  • 使用 #{}:安全
  • 避免使用 ${}:易受攻擊

MyBatis-Plus 如何防止 SQL 注入?

MyBatis-Plus 是 MyBatis 的增強工具,大量簡化了開發。它默認使用參數綁定機制,在大多數情況下天然具備防注入能力

條件構造器安全性

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", userName);
userMapper.selectList(wrapper);
  • .eq("name", userName) 會使用 PreparedStatement 自動綁定參數。
  • 比手寫 SQL 更簡潔也更安全。

apply 使用注意事項

有時候你可能需要執行一些復雜的 SQL 片段,比如使用 SQL 函數:

wrapper.apply("DATE_FORMAT(create_time,'%Y-%m-%d') = {0}", dateStr);
  • 使用 {0} 綁定參數,是安全的。
  • 直接拼接字符串不安全:
wrapper.apply("DATE_FORMAT(create_time,'%Y-%m-%d') = '" + dateStr + "'");

實戰建議

  1. 優先使用 MyBatis-Plus 提供的 API,如 Wrapper、LambdaQueryWrapper
  2. MyBatis XML 中,禁止使用 ${},一律使用 #{}
  3. 自定義 SQL 時,確保參數使用綁定方式
  4. 開啟 SQL 日志,排查拼接風險
  5. 可選:配合 SQL 審計工具做自動掃描

如果你覺得這篇文章對你有幫助,不妨點個贊

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據分析案例:醫療健康數據分析

目錄 數據分析案例:醫療健康數據分析1. 項目背景2. 數據加載與預處理2.1 加載數據2.2 數據清洗3. 探索性數據分析(EDA)3.1 再入院率概覽3.2 按年齡分組的再入院率3.3 住院時長與再入院4. 特征工程與可視化5. 模型構建與評估5.1 數據劃分5.2 訓練邏輯回歸5.3 模型評估6. 業務…

3臺CentOS虛擬機部署 StarRocks 1 FE+ 3 BE集群

背景&#xff1a;公司最近業務數據量上去了&#xff0c;需要做一個漏斗分析功能&#xff0c;實時性要求較高&#xff0c;mysql已經已經不在適用&#xff0c;做了個大數據技術棧選型調研后&#xff0c;決定使用StarRocks StarRocks官網&#xff1a;StarRocks | A High-Performa…

軟件設計師/系統架構師---計算機網絡

概要 什么是計算機網絡&#xff1f; 計算機網絡是指將多臺計算機和其他設備通過通信線路互聯&#xff0c;以便共享資源和信息的系統。計算機網絡可以有不同的規模&#xff0c;從家庭網絡到全球互聯網。它們可以通過有線&#xff08;如以太網&#xff09;或無線&#xff08;如W…

1.5軟考系統架構設計師:架構師的角色與能力要求 - 超簡記憶要點、知識體系全解、考點深度解析、真題訓練附答案及解析

超簡記憶要點 角色職責 需求規劃→架構設計→質量保障 能力要求 技術&#xff08;架構模式/性能優化&#xff09; 業務&#xff08;模型抽象→技術方案&#xff09; 管理&#xff08;團隊協作/風險控制&#xff09; 知識體系 基礎&#xff1a;CAP/設計模式/網絡協議案例&am…

基于STM32的汽車主門電動窗開關系統設計方案

芯片和功能模塊選型 主控芯片 STM32F103C8T6:基于 ARM Cortex - M3 內核,有豐富的 GPIO 接口用于連接各類外設,具備 ADC 模塊可用于電流檢測,還有 CAN 控制器方便實現 CAN 總線通信。它資源豐富、成本低,適合學生進行 DIY 項目開發。按鍵模塊 輕觸按鍵:用于控制車窗的自…

第十三屆藍橋杯 2022 C/C++組 修剪灌木

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P8781 [藍橋杯 2022 省 B] 修…

6.學習筆記-SpringMVC-攔截器(P71-P74)

1.攔截器簡介 攔截器的底層思想是AOP思想 2.攔截器入門案例 &#xff08;一&#xff09;制作攔截器的功能類 一般情況下&#xff0c;攔截器都是給表現層用的&#xff0c;所以創建在controller下。 &#xff08;二&#xff09;配置攔截器的執行位置 在projectinterceptor.…

GAIA-2:用于自動駕駛的可控多視圖生成世界模型

25年3月來自英國創業公司 Wayze 的論文“GAIA-2: A Controllable Multi-View Generative World Model for Autonomous Driving”。&#xff08;注&#xff1a;23年9月其發布GAIA-1&#xff09; 生成模型為模擬復雜環境提供一種可擴展且靈活的范例&#xff0c;但目前的方法不足…

《算法筆記》10.4小節——圖算法專題->最短路徑 問題 D: 最短路徑

題目描述 有n個城市m條道路&#xff08;n<1000, m<10000)&#xff0c;每條道路有個長度&#xff0c;請找到從起點s到終點t的最短距離和經過的城市名。 輸入 輸入包含多組測試數據。 每組第一行輸入四個數&#xff0c;分別為n&#xff0c;m&#xff0c;s&#xff0c;t…

深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret

目錄 深度解析 Kubernetes 配置管理&#xff1a;如何安全使用 ConfigMap 和 Secret一、目錄結構二、ConfigMap 和 Secret 的創建1. 創建 ConfigMapconfig/app-config.yaml&#xff1a;config/db-config.yaml&#xff1a; 2. 創建 Secretsecrets/db-credentials.yaml&#xff1a…

數據庫之mysql優化

1.引擎&#xff1a; 1.1查看引擎&#xff1a; mysql> show engines; mysql> SHOW VARIABLES LIKE %storage_engine%; mysql> show create table t1; ---查看建表信息1.2 臨時指定引擎&#xff1a; mysql> create table innodb1(id int)engineinnodb; 1.3修改…

【Yii2】Yii2框架的一次BUG排查

因為項目需要&#xff0c;最近學習了使用Yii2框架的使用。但畢竟剛上手&#xff0c;好多地方都不清楚。所以就有了這個博客。 1、需求 有這么一個需求&#xff1a; 后臺需要訪問用戶的一個界面。為了界面不出問題&#xff0c;需要傳遞一個真實存在的Token。但對這個Token沒有…

卡爾曼濾波解釋及示例

卡爾曼濾波的本質是用數學方法平衡預測與觀測的可信度 &#xff0c;通過不斷迭代逼近真實狀態。其高效性和魯棒性&#xff0c;通常在導航定位中&#xff0c;需要融合GPS、加速度計、陀螺儀、激光雷達或攝像頭數據&#xff0c;來提高位置精度。簡單講&#xff0c;卡爾曼濾波就是…

Python 學習路線與筆記跳轉(持續更新筆記鏈接)

這里寫目錄標題 Python 學習路線與筆記Python 簡介學習路線第一階段&#xff1a;Python 基礎第二階段&#xff1a;Python 進階第三階段&#xff1a;實用庫與框架第四階段&#xff1a;DevOps 與 Python第五階段&#xff1a;最佳實踐與高級技巧 學習資源官方資源在線學習平臺書籍…

決策衛生問題:考公考編考研能補救高考選取職業的錯誤嗎

對于決策者來說&#xff0c;“認識你自己”是一個永恒的主題&#xff1b;警惕認知中的缺陷&#xff0c;比什么都重要。在判斷與決策問題上&#xff0c;管理者和專業人士往往都非常自信。人類遠遠不如我們想象的那么理性&#xff0c;人類的判斷也遠遠不如我們想象的那么完美。在…

React19源碼閱讀之commitRoot

commitRoot入口 在finishConcurrentRender函數&#xff0c;commitRootWhenReady函數&#xff0c;commitRoot函數。 commitRoot流程圖 commitRoot函數 commitRoot 函數是 React 渲染流程中用于提交根節點的關鍵函數。它的主要作用是設置相關的優先級和狀態&#xff0c;然后調…

利用Python爬蟲實現百度圖片搜索的PNG圖片下載

在圖像識別、訓練數據集構建等場景中&#xff0c;我們經常需要從互聯網上批量下載圖片素材。百度圖片是中文搜索中最常用的來源之一。本文將介紹如何使用Python構建一個穩定、可擴展的百度圖片爬蟲&#xff0c;專門用于下載并保存高清PNG格式圖片。 一、項目目標 本項目的目標…

Axure復選框組件的深度定制:實現自定義大小、顏色與全選功能

在產品設計中&#xff0c;復選框作為用戶與界面交互的重要元素&#xff0c;其靈活性直接影響到用戶體驗。本文將介紹如何利用Axure RP工具&#xff0c;通過高級技巧實現復選框組件的自定義大小、顏色調整&#xff0c;以及全選功能的集成&#xff0c;為產品原型設計增添更多可能…

深度理解spring——BeanFactory的實現

BeanFactory Spring之BeanFactory什么是BeanFactoryApplicationContext相對BeanFactory實現的功能性擴展1. MessageSource2. ResourcePatternResolver3. ApplicationEventPublisher4. EnvironmentCapable通用ApplicationContext實踐實現BeanFactoryBeanFactory后處理器排序讓誰…

跑MPS產生委外采購申請(成品)

問題&#xff1a;跑MPS產生委外采購申請&#xff08;成品&#xff09;&#xff0c;更改BOM和跑MRP&#xff0c;但物料需求清單中無新增物料復合膜的需求。截圖如下&#xff1a; 解決方法&#xff1a;更改委外采購申請的批準日期為BOM的生效日和重新展開bom。 重新展開后&#x…