網站首頁 編程語言 正文
首先#{} 和 ${} 都是參數占位符,其中#{}是預編譯處理,${}是字符直接進行替換。預編譯處理是指:MyBatis 在處理#{}時,會將 SQL 中的 #{} 替換為?號,使? PreparedStatement 的 set ?法來賦值。直接替換是指MyBatis 在處理 ${} 時,就是把 ${} 替換成變量的值。
其中#{}與JDBC中的PreparedStatement的作用類似,都可以防止sql注入問題。
但是在單表查詢中,他們都可能會帶來越權查詢和操作數據等問題。下面詳細列出實例:
使用#{}得到JDBC的代碼如下:【針對int類型的參數】
使用${}得到JDBC的代碼如下:【針對int類型的參數】?
?使用${}得到JDBC的代碼如下:【針對String類型的參數】
不難看出這個時候sql語法報錯了。
使用#{}得到JDBC的代碼如下:【針對String類型的參數】
到這里我們就已經可以看出來一些區別了:
1.定義不同:?#{}是預處理;而${}是直接替換。
2.使用不同:?#{}適用于所有類型的參數匹配;但${}只適用數值類型。
3.安全性不同:?#{}性能高,因為他使用占位符已經預編譯了,并且沒有安全問題;?但${}存在SQL注入的安全問題(下面會給出示例)。
那再談談#{}和${}的各自使用場景:
1.${}的使用場景:(對數據進行排序的時候)
但是如果此時使用#{}就會報sql語法錯誤,因為此時需要傳遞的是SQL關鍵字。?
到這里咱們又可以對#{}和${}做一個小結:
當傳遞的是一個SQI.關鍵字(SQI命令)的時候,只能使用${},此時如果使用#{}就會認為傳遞的為一個普通的值,而非SQL命令,他在替換的時候會自動加上’’號,所以執行就會報錯。
接下來咱們繼續說說剛才在上面總結的那樣,${}存在SQL注入的安全問題。
咱們在實現用戶登錄功能這個場景下,通常需要獲取用戶名和密碼來校驗是否正確,那么這個時候就會出現問題,我們先來正常的查詢:
再繼續看SQL注入的有安全問題:?
?
在sql語法中,1=’1’是正確的,所以這條sql語句也是可以執行的。所以當不得不使用$時,那么一定要在業務代碼中,對傳遞的值進行安全效驗。?
最后再看看like查詢這種場景。
使用#{}:
但是使用${}就可以了:?
但是使用${}還是有安全風險,因為模擬查詢的時候,不知道用戶傳來的是什么數據,我們也不能一一窮舉出來去規避,那么此時使用#{}的時候還有一種方法可以避免安全問題:
?
?
?
原文鏈接:https://blog.csdn.net/crazy_xieyi/article/details/130808533
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-12-17 SpringSecurity 用戶帳號已被鎖定
- 2022-10-13 解析React中useMemo與useCallback的區別_React
- 2022-08-20 Android自定義可控制速度的跑馬燈_Android
- 2022-04-23 如何在String原型上封裝一個時間戳轉日期的方法詳解
- 2022-01-16 1.把字符串轉化為時間戳,再將時間戳轉化為Date對象 /** *@parame time = 2
- 2022-09-26 Transformer模型Encoder和Decoder的Pytorch逐行實現
- 2022-03-01 iview表格中 colums中使用render函數的幾種總結
- 2022-07-28 Redis基本數據類型Set常用操作命令_Redis
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支