国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

SQL注入與防止及myBaits基本作用

2021-10-15 14:37:38 459

SQL注入

在嵌入式SQL編程中,sql語(yǔ)句通常是以字符串的形式提交給數據庫管理系統的。SQL注入是利用SQL語(yǔ)法將一些惡意代碼加入到該字符串中,從而獲取到非授權的數據。
如:用戶(hù)登錄(假設用戶(hù)名為admin,密碼為 123456),通常使用以下語(yǔ)句進(jìn)行判斷


select * from user where username=‘a(chǎn)dmin' and password=‘123456'

如果獲取到記錄,則允許登錄,否則提示“用戶(hù)名不存在或密碼錯誤”。加入我并不知道用戶(hù)密碼,知道用戶(hù)名為“admin”,在輸入用戶(hù)名時(shí),將用戶(hù)名變?yōu)?admin‘-- ,此時(shí)sql語(yǔ)句變?yōu)?/span>

select * from user where username=‘a(chǎn)dmin'-- and password=‘123456'

則登錄成功。如下圖密碼隨意輸入,如果沒(méi)有做任何防止SQL注入的處理,完全可以登錄成功


假如:用戶(hù)名我輸入的是“admin;drop table user;–”;會(huì )發(fā)生啥結果?


防止SQL注入的方法

JDBC提供的PreparedStatement可以防止SQL注入;PreparedStatement對sql預編譯后,sql語(yǔ)句中的參數需要用?代替。然后調用setXX()方法設置sql語(yǔ)句中的參數。這樣再傳入特殊值,也不會(huì )出現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、執行語(yǔ)句
ResultSet rs=pstmt.executeQuery(sql);

還有另外一種方法,就是把SQL語(yǔ)句寫(xiě)入存儲過(guò)程,通過(guò)存儲過(guò)程完成查詢(xún),同樣可以防止SQL注入。

mybaits中${}和#{}的使用

“$ ”是拼接符;使用“${} ”相當于在高級語(yǔ)言中已經(jīng)將sql語(yǔ)句進(jìn)行拼接,而且對于變量是不加引號的,如:用戶(hù)名為admin,參數變量為 sname

select * from user where username=‘${sname}'
--此種情況下,高級語(yǔ)言交給數據庫的SQL語(yǔ)句是
select * from user where username=‘a(chǎn)dmin'

此種情況下是無(wú)法防止SQL注入的。

#{}是占位符;使用“#{} ”只能在數據庫管理系統中,將#{}中的參數帶入

select * from user where username=#{sname}
--此種情況下,首先經(jīng)過(guò)預編譯形成如下SQL,再將參數帶入,此時(shí)給參數值帶加單引號
select * from user where username=?

此種情況下是可以防止SQL注入的

既然#{}能夠防止SQL注入,"$ {}"不能,為什么mybaits還要提供這么一個(gè)符號?,當然有myBatis的理由,如果SQL語(yǔ)句中數據庫對象需要傳參進(jìn)去,那只能使用** ${}**。如查詢(xún)用戶(hù)表(user) ,參數變量為tableName=‘user',代碼只能是

select * from ${tableName}
//轉換為SQL語(yǔ)句為
select * from user

在myBatis中變量做為where子句中的參數,一律使用#{},禁止使用“ ” , 以 防 S Q L 注 入 ; S Q L 語(yǔ) 句 中 包 含 了 數 據 庫 對 象 ( 如 表 、 視 圖 等 ) 才 能 使 用 “ {} ”,以防SQL注入;SQL語(yǔ)句中包含了數據庫對象(如表、視圖等)才能使用“ ”,以防SQL注入;SQL語(yǔ)句中包含了數據庫對象(如表、視圖等)才能使用“{} ”,因為#{},自動(dòng)給變量加上引號,如上例:

select * from #{tableName}
//轉換為SQL語(yǔ)句為
select * from 'user'  

以上就是SQL注入與防止及myBaits基本作用的詳細內容.


提交成功!非常感謝您的反饋,我們會(huì )繼續努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題:
-->