mysql中#{}和${}的區(qū)別詳解
#{}會將傳入的數(shù)據(jù)當(dāng)成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號
order by #{userId}
這里假如userId = 111,那么解析成sql時會變成 order by "111"
這里如果userId = idStr,那么解析成sql時會變成 order by "idStr"
${}會將傳入的數(shù)據(jù)直接顯示生成在sql中
order by #{userId}
這里假如userId = 111,那么解析成sql時會變成 order by 111
這里如果userId = idStr,那么解析成sql時會變成 order by idStr
#方式能夠很大程度防止sql注入;$方式無法防止Sql注入。
$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名。
一般能用#的就別用$。MyBatis排序時使用order by 動態(tài)參數(shù)時需要注意,用$而不是#。
默認(rèn)情況下,使用#{}格式的語法會導(dǎo)致MyBatis創(chuàng)建預(yù)處理語句屬性并以它為背景設(shè)置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在SQL語句中插入一個不改變的字符串。比如,像ORDER BY,你可以這樣來使用:
ORDER BY ${columnName}; 這里MyBatis不會修改或轉(zhuǎn)義字符串。
例子:
在沒有做防Sql注入的時候,我們的Sql語句可能是這么寫的:
<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = '${value}' </select>
但如果我們對傳入的姓名參數(shù)做一些更改,比如改成anything’ OR ‘x’='x,那么拼接而成的Sql就變成了
SELECT id,name,age FROM student WHERE name = 'anything' OR 'x'='x'

庫里面所有的學(xué)生信息都被拉了出來,是不是很可怕。原因就是傳入的anything’ OR ‘x’='x和原有的單引號,正好組成了 ‘anything’ OR ‘x’='x’,而OR后面恒等于1,所以等于對這個庫執(zhí)行了查所有的操作。
防范Sql注入的話,就是要把整個anything’ OR ‘x’='x中的單引號作為參數(shù)的一部分,而不是和Sql中的單引號進(jìn)行拼接
使用了#即可在Mybatis中對參數(shù)進(jìn)行轉(zhuǎn)義
<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = #{name} </select>我們看一下發(fā)送到數(shù)據(jù)庫端的Sql語句長什么樣子。
SELECT id,name,age FROM student WHERE name = 'anything\' OR \'x\'=\'x'
到此這篇關(guān)于mysql中#{}和${}的區(qū)別的文章就介紹到這了,更多相關(guān)mysql中#{}和${}的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中開啟和使用通用查詢?nèi)罩镜膶?shí)例教程
這篇文章主要介紹了MySQL中開啟和使用通用查詢?nèi)罩镜膶?shí)例教程,包括其備份和關(guān)閉等基礎(chǔ)操作的例子講解,需要的朋友可以參考下2015-12-12
MySQL SHOW PROCESSLIST協(xié)助故障診斷全過程
這篇文章主要給大家介紹了關(guān)于MySQL SHOW PROCESSLIST協(xié)助故障診斷的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
MySQL數(shù)據(jù)庫InnoDB數(shù)據(jù)恢復(fù)工具的使用小結(jié)詳解
本篇文章是對MySQL數(shù)據(jù)庫InnoDB數(shù)據(jù)恢復(fù)工具的使用進(jìn)行了詳細(xì)的總結(jié)與分析,需要的朋友參考下2013-06-06
Mysql中關(guān)于Incorrect string value的解決方案
在對mysql數(shù)據(jù)庫中插入數(shù)據(jù)的時候,直接插入中文是沒有問題的!但是用預(yù)編譯語句時,用流對數(shù)據(jù)進(jìn)行處理總報(bào)incorrect string value這個異常。本篇文章教給你解決方法2021-09-09

