SQL注入與防止及MyBatis基本作用
SQL注入
在嵌入式SQL編程中,sql語(yǔ)句通常是以字符串的形式提交給數(shù)據(jù)庫(kù)管理系統(tǒng)的。SQL注入是利用SQL語(yǔ)法將一些惡意代碼加入到該字符串中,從而獲取到非授權(quán)的數(shù)據(jù)。
如:用戶(hù)登錄(假設(shè)用戶(hù)名為admin,密碼為 123456),通常使用以下語(yǔ)句進(jìn)行判斷
select * from user where username=‘a(chǎn)dmin' and password=‘123456'
如果獲取到記錄,則允許登錄,否則提示“用戶(hù)名不存在或密碼錯(cuò)誤”。加入我并不知道用戶(hù)密碼,知道用戶(hù)名為“admin”,在輸入用戶(hù)名時(shí),將用戶(hù)名變?yōu)?admin‘-- ,此時(shí)sql語(yǔ)句變?yōu)?/p>
select * from user where username=‘a(chǎn)dmin'-- and password=‘123456'
則登錄成功。如下圖密碼隨意輸入,如果沒(méi)有做任何防止SQL注入的處理,完全可以登錄成功
假如:用戶(hù)名我輸入的是“admin;drop table user;–”;會(huì)發(fā)生啥結(jié)果?
防止SQL注入的方法
JDBC提供的PreparedStatement可以防止SQL注入;PreparedStatement對(duì)sql預(yù)編譯后,sql語(yǔ)句中的參數(shù)需要用?代替。然后調(diào)用setXX()方法設(shè)置sql語(yǔ)句中的參數(shù)。這樣再傳入特殊值,也不會(huì)出現(xiàn)sql注入的問(wèn)題了,示例代碼如下:
String sql="select * from user where username='?'"+" and password='?'"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1,"admin"); pstmt.setString(2,"123456"); //5、執(zhí)行語(yǔ)句 ResultSet rs=pstmt.executeQuery(sql);
還有另外一種方法,就是把SQL語(yǔ)句寫(xiě)入存儲(chǔ)過(guò)程,通過(guò)存儲(chǔ)過(guò)程完成查詢(xún),同樣可以防止SQL注入。
mybaits中${}和#{}的使用
“$ ”是拼接符;使用“${} ”相當(dāng)于在高級(jí)語(yǔ)言中已經(jīng)將sql語(yǔ)句進(jìn)行拼接,而且對(duì)于變量是不加引號(hào)的,如:用戶(hù)名為admin,參數(shù)變量為 sname
select * from user where username=‘${sname}' --此種情況下,高級(jí)語(yǔ)言交給數(shù)據(jù)庫(kù)的SQL語(yǔ)句是 select * from user where username=‘a(chǎn)dmin'
此種情況下是無(wú)法防止SQL注入的。
#{}是占位符;使用“#{} ”只能在數(shù)據(jù)庫(kù)管理系統(tǒng)中,將#{}中的參數(shù)帶入
select * from user where username=#{sname} --此種情況下,首先經(jīng)過(guò)預(yù)編譯形成如下SQL,再將參數(shù)帶入,此時(shí)給參數(shù)值帶加單引號(hào) select * from user where username=?
此種情況下是可以防止SQL注入的
既然#{}能夠防止SQL注入,"$ {}"不能,為什么mybaits還要提供這么一個(gè)符號(hào)?,當(dāng)然有myBatis的理由,如果SQL語(yǔ)句中數(shù)據(jù)庫(kù)對(duì)象需要傳參進(jìn)去,那只能使用** ${}**。如查詢(xún)用戶(hù)表(user) ,參數(shù)變量為tableName=‘user’,代碼只能是
select * from ${tableName} //轉(zhuǎn)換為SQL語(yǔ)句為 select * from user
在myBatis中變量做為where子句中的參數(shù),一律使用#{},禁止使用“ ” , 以 防 S Q L 注 入 ; S Q L 語(yǔ) 句 中 包 含 了 數(shù) 據(jù) 庫(kù) 對(duì) 象 ( 如 表 、 視 圖 等 ) 才 能 使 用 “ {} ”,以防SQL注入;SQL語(yǔ)句中包含了數(shù)據(jù)庫(kù)對(duì)象(如表、視圖等)才能使用“ ”,以防SQL注入;SQL語(yǔ)句中包含了數(shù)據(jù)庫(kù)對(duì)象(如表、視圖等)才能使用“{} ”,因?yàn)?{},自動(dòng)給變量加上引號(hào),如上例:
select * from #{tableName} //轉(zhuǎn)換為SQL語(yǔ)句為 select * from 'user'
以上就是SQL注入與防止及myBaits基本作用的詳細(xì)內(nèi)容,更多關(guān)于SQL注入與防止及myBaits作用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
附加到SQL2012的數(shù)據(jù)庫(kù)就不能再附加到低于SQL2012的數(shù)據(jù)庫(kù)版本的解決方法
這篇文章主要介紹了附加到SQL2012的數(shù)據(jù)庫(kù)就不能再附加到低于SQL2012的數(shù)據(jù)庫(kù)版本的解決方法,需要的朋友可以參考下2014-02-02配置 SQL Server 2005 以允許遠(yuǎn)程連接的方法
在嘗試從遠(yuǎn)程計(jì)算機(jī)連接到 Microsoft SQL Server 2005 實(shí)例時(shí),可能會(huì)接收到錯(cuò)誤消息。在使用任何程序連接到 SQL Server 時(shí)都可能會(huì)發(fā)生此問(wèn)題。2011-01-01MSSQL差異備份取系統(tǒng)權(quán)限的相關(guān)軟件下載
MSSQL差異備份取系統(tǒng)權(quán)限的相關(guān)軟件下載...2007-11-11SQLSERVER對(duì)索引的利用及非SARG運(yùn)算符認(rèn)識(shí)
SQL對(duì)篩選條件簡(jiǎn)稱(chēng):SARG(search argument/SARG)當(dāng)然這里不是說(shuō)SQLSERVER的where子句,是說(shuō)SQLSERVER對(duì)索引的利用,感興趣的朋友可以了解下,或許本文的知識(shí)點(diǎn)對(duì)你有所幫助哈2013-02-02SQL?Server忘記sa賬號(hào)密碼重新添加新管理賬號(hào)
這篇文章介紹了SQL?Server忘記sa賬號(hào)密碼重新添加新賬號(hào)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04MSSQL批量插入數(shù)據(jù)優(yōu)化詳細(xì)
這篇文章主要為大家分享一下批量插入數(shù)據(jù)的方法,有時(shí)候我們需要插入大量的數(shù)據(jù)那么就需要優(yōu)惠了,要不根本受不了2017-07-07使用xp_cmdshell注銷(xiāo)Windows登錄用戶(hù)(終端服務(wù)器超出最大連接數(shù))
關(guān)于終端服務(wù)器超出最大連接數(shù)的解決方法有很多種,最簡(jiǎn)單的就是下載加強(qiáng)版本客戶(hù)端即可,下面的文章主要是介紹了sqlserver中通過(guò)xp_cmdshell用戶(hù)2012-12-12SQL Server之SELECT INTO 和 INSERT INTO SELECT案例詳解
這篇文章主要介紹了SQL Server之SELECT INTO 和 INSERT INTO SELECT案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08