從程序被SQL注入來MyBatis 再談 #{} 與 ${} 的區別

緣由

最近在的一個項目上面,發現有人在給我搞 SQL 注入,我真的想說我那么點資源測試用的阿里云服務器,個人估計哈,估計能抗住他的請求。狗頭.png

系統上面的截圖
系統上面的截圖

數據庫截圖
數據庫截圖

說句實在的,看到這個之后我立馬就是在想啊,現在我們都是用的成熟的ORM 框架,一般調用 ORM 框架的方法操作數據庫是不會有問題的。

后面又讓我想起來了,#{}${} 的區別,這里總結下,說一句通俗易懂的話:使用 #{} 可以防止SQL注入,使用 ${} 就會出現 SQL 注入。

代碼理解

咱們都是程序員,都喜歡說,別給我說那么多廢話,show me the code,那么我們直接看代碼把,我們通過偽代碼來理解下:

 public void test(String name, String id){String sql = "update orders set name = "+name+" where id = ?";}

這里我為了方便與說明,就是使用上面的一個SQL 來解析,從上面的 SQL 可以看到兩點信息:

  • name: 是直接使用了拼接字符串的方式,這里就是類似于 ${} 做的事情
  • id:使用了 ? 做為占位符,做了一次預處理,先去編譯SQL,后面再來做參數化操作,這個是 #{} 的具體原理

如果是 name 被惡意傳入了 SQL 代碼,比如:

") OR (SELECT*FROM(SELECT(SLEEP(3)))hnao) limit 1#
-- 或者
" union select 1-- 

那么解析出來的 SQL 就會變成:


update orders set name = ) OR (SELECT*FROM(SELECT(SLEEP(3)))hnao) limit 1update orders set name = union select 1

雖然上面比較難看,因為我這里舉例是 update,如果是查詢呢:

select name from orders  union select 1-- 

那這樣子是不是就出問題了?其實只要他成功一次,那么就可能竊取到我們數據庫的信息了。

#{}${} 的區別

這里我也去百度了下,然后整理一下大致的區別,在 MyBatis 中,#{}${} 都是用于在 SQL 語句中插入參數的占位符,但它們之間有著顯著的區別。

  1. 預編譯與安全性

    • #{}:這是一個預編譯(PreparedStatement)的占位符。當 MyBatis 在解析 XML 映射文件或注解中的 SQL 時,它會為 #{} 中的參數生成一個 PreparedStatement,并使用 ? 作為占位符。這意味著 SQL 語句會被預編譯,并且在執行時會使用參數化查詢,這樣可以防止 SQL 注入攻擊。
    • ${}:這是一個簡單的字符串替換。MyBatis 會直接替換 ${} 中的內容為 SQL 語句中的相應部分。這意味著 SQL 語句不會被預編譯,而是會動態地構建和執行。這可能會導致 SQL 注入攻擊,因為它允許不受限制的字符串替換。
  2. 用法

    • #{}:通常用于插入參數值,例如列值、條件值等。
    • ${}:通常用于插入 SQL 片段,如表名、列名、動態 SQL 語句等。
  3. 動態 SQL

    • 在 MyBatis 中,${} 更多地用于構建動態 SQL,因為它允許直接替換 SQL 語句中的任何部分。然而,由于這種靈活性,它也增加了 SQL 注入的風險。
    • #{} 在動態 SQL 中通常用于插入參數值,以確保安全性。
  4. 類型處理器

    • 對于 #{} 插入的參數,MyBatis 會使用相應的類型處理器(Type Handler)來確保參數與數據庫中的列類型匹配,并進行必要的類型轉換。
    • 而對于 ${},由于它直接替換 SQL 語句中的部分,因此不會使用類型處理器。
  5. 注意事項

    • 盡可能使用 #{} 來插入參數值,以確保 SQL 語句的安全性和性能。
    • 如果確實需要使用 ${}(例如,插入表名或列名),請確保傳入的字符串是安全的,并且不包含任何來自不受信任的來源的內容。
    • 在使用動態 SQL 時,要特別注意 SQL 注入的風險,并采取相應的預防措施。

總之,#{}${} 在 MyBatis 中各有其用途,但 #{} 通常更安全、更可靠,并應優先使用。

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

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

相關文章

游戲找不到d3dcompiler_43.dll怎么辦,教你5種可靠的修復方法

在電腦使用過程中,我們經常會遇到一些錯誤提示,其中之一就是“找不到d3dcompiler43.dll”。這個問題通常出現在游戲或者圖形處理軟件中,它會導致程序無法正常運行。為了解決這個問題,我經過多次嘗試和總結,找到了以下五…

idea2023的git從dev分支合并到主分支master

1.本地項目切換到主分支master 右鍵項目-git-Branches 依次點擊項目-Remote-Origin-master-CheckOut 現在你的idea中的這個項目就是遠程master分支的代碼了。 2.合并dev分支到master 右擊項目-git-Merge 選擇origin-dev 點擊Merge按鈕,此時只是合并到本地的maste…

每日一題---有效的括號問題

文章目錄 前言1.題目以及分析2.參考代碼 前言 前面我們學習了棧的相關操作,現在我們做一道題,進行鞏固 Leetcode—有效的括號 1.題目以及分析 這道題就可以使用棧進行操作,因為把最左邊的括號當成棧底,最右邊的是棧頂&#xff0c…

【每日刷題】Day49

【每日刷題】Day49 🥕個人主頁:開敲🍉 🔥所屬專欄:每日刷題🍍 🌼文章目錄🌼 1. 110. 平衡二叉樹 - 力扣(LeetCode) 2. 501. 二叉搜索樹中的眾數 - 力扣&…

基于YOLOv8的車牌檢測與識別(CCPD2020數據集)

前言 本篇博客主要記錄在autodl服務器中基于yolov8實現車牌檢測與識別,以下記錄實現全過程~ yolov8源碼:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite 一、環境配置 …

python學習:基礎語句

目錄 條件語句 循環語句 for 循環 while 循環 break continue 條件語句 Python提供了 if、elif、else 來進行邏輯判斷。格式如下: Pythonif 判斷條件1: 執行語句1... elif 判斷條件2: 執行語句2... elif 判斷條件3: 執行語句3... else: 執行語句4…

C# 集合(六) —— 自定義集合Collection類

總目錄 C# 語法總目錄 集合六 Collection 1. 自定義集合Collection其他 1. 自定義集合Collection Collection可以對添加刪除元素或者添加刪除屬性進行事件響應。 class Person {public string name;public int age;public Person(){this.name "";this.age 0;}pub…

ubuntu 硬盤轉移

我插了兩個 文件系統: ubuntu 硬盤轉移: sudo dd if/dev/sdX1 of/dev/sdY1 bs128K convnoerror,sync statusprogressdd 的意思是DiskToDisk,if 是輸入文件系統,of是輸出文件系統。 bs是每次傳遞的數據大小。 注意:接…

mysql-主從同步原理

AB復制(重點) 一、什么是主從復制? 1、主從同步也叫AB復制,是用來建立一個和主數據庫完全一樣的數據庫環境,稱為從數據庫;主數據庫一般是準實時的業務數據庫。 2、主從復制的作用 1.做數據的熱備,作為后備數據庫,…

如何用MySQL的SQL語句來讀寫硬盤目錄文件

1.先確保創建表,例如起名Temp CREATE TABLE temp ( id int(11) NOT NULL AUTO_INCREMENT, image mediumblob, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8; 注意這里的image字段用mediumblog,就可以避免出現data too …

27【Aseprite 作圖】盆栽——拆解

1 橘子畫法拆解 (1)淺色3 1 0;深色0 2 3 就可以構成一個橘子 (2)淺色 2 1;深色1 0 (小個橘子) (3)淺色 2 1 0;深色1 2 3 2 樹根部分 (1)底部畫一條橫線 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…

省市區(輸入code) 轉相應省市區工具類(兩種方式)

方式一 通過調用接口(時間高達1s) package cn.iocoder.yudao.module.supplier.utils;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element;import java.io.BufferedReader; import java.io.InputStreamReader; i…

Java 泛型基礎

目錄 1. 為什么使用泛型 2. 泛型的使用方式 2.1. 泛型類 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符號 3.1. 類型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符?的區別。 4. 泛型不變性 5. 泛型編譯時擦除 1. 為什么使用泛型 Java 為…

基于深度學習的入侵檢測系統綜述文獻概述

好長時間不發博客了,不是因為我擺爛了,是我換研究方向了,以后我就要搞科研了。使用博客記錄我的科研故事,邀諸君共同見證我的科研之路。 1、研究方向的背景是什么? (1)互聯網發展迅速&#xff…

Android firebase消息推送集成 FCM消息處理

FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一個服務,用于處理來自 Firebase 服務器的消息。它有幾個關鍵的方法,你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解釋這些方法的作用和用…

在 C++ 中,p->name 和 p.name 的效果并不相同。它們用于不同的情況,取決于你是否通過指針訪問結構體成員。

p->name&#xff1a;這是指針訪問運算符&#xff08;箭頭運算符&#xff09;。當 p 是一個指向結構體的指針時&#xff0c;用 p->name 來訪問結構體的成員。 student* p &stu; // p 是一個指向 student 類型的指針 cout << p->name << endl; // 通過…

基于ssm的蛋糕商城系統java項目jsp項目javaweb

文章目錄 蛋糕商城系統一、項目演示二、項目介紹三、系統部分功能截圖四、部分代碼展示五、底部獲取項目源碼&#xff08;9.9&#xffe5;帶走&#xff09; 蛋糕商城系統 一、項目演示 蛋糕商城管理系統 二、項目介紹 系統角色 : 管理員、用戶 一&#xff0c;管理員 管理員有…

PICO VR眼鏡定制播放器使用說明文檔videoplayerlib-ToB.apk

安裝高級定制播放器 高級定制播放器下載地址:https://download.csdn.net/download/ahphong/89360454 僅限用于PICO G2、G3、G4、NEO系列VR眼鏡上使用, 用途:用于第三方APP(開發者)調用定制播放器播放2D、3D、180、360全景視頻。 VR眼鏡系統請升級到最新版,可在官網下載,…

Mixed-precision計算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】選擇排序以及需要注意的問題

選擇排序的基本思想&#xff1a;每一次從待排序的數據元素中選出最小&#xff08;或最大&#xff09;的一個元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的數據元素排完 。 第一種實現方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…