一.項(xiàng)目背景
本項(xiàng)目主要是通過(guò)SQL注入案例來(lái)讓大家了解如何防范SQL攻擊,希望對(duì)大家有所幫助
![pYYBAGP4W5KAYojtAADHKBDi0M4599.png](https://file.elecfans.com/web2/M00/94/27/pYYBAGP4W5KAYojtAADHKBDi0M4599.png)
二.實(shí)現(xiàn)過(guò)程
》》創(chuàng)建數(shù)據(jù)表
》》插入數(shù)據(jù)
》》SQL注入
》》分析原因
mysql> use gzh;
Database changed
mysql> create table t_user(
-> username varchar(120),
-> password varchar(200))
-> engine=innodb default charset=utf8;
Query OK, 0 rows affected, 1 warning (0.13 sec)
mysql> insert into t_user(username,password) values('Tom','1234acd'),('Alice','opqw362');
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t_user;
+----------+----------+
| username | password |
+----------+----------+
| Tom | 1234acd |
| Alice | opqw362 |
+----------+----------+
2 rows in set (0.00 sec)
注:數(shù)據(jù)庫(kù)中總共有兩條數(shù)據(jù)
![pYYBAGP4W8SATC6DAACgt2l3BIM715.png](https://file.elecfans.com/web2/M00/94/27/pYYBAGP4W8SATC6DAACgt2l3BIM715.png)
》》SQL注入
import mysql.connector
#配置數(shù)據(jù)庫(kù)參數(shù)
config={
"host":"localhost",
"port":3306,
"user":"root",
"password":"253611",
"database":"gzh",
"auth_plugin":"mysql_native_password"
}
#初始化connect對(duì)象
con=mysql.connector.connect(**config)
#定義username
username="1 OR 1=1"
#定義password
password="1 OR 1=1"
#書(shū)寫(xiě)sql語(yǔ)句,AES_DECRYPT為解密函數(shù)
sql="SELECT COUNT(*) FROM t_user WHERE username=%s "
"AND AES_DECRYPT(UNHEX(password),'HelloWorld')=%s";
#初始化游標(biāo)
cursor=con.cursor()
#執(zhí)行SQL語(yǔ)句,字符串拼接生成
cursor.execute(sql%(username,password))
#輸出數(shù)據(jù)
print("全部數(shù)據(jù)條數(shù)為:",cursor.fetchone()[0])
#關(guān)閉鏈接
con.close()
總結(jié):
》》cursor.execute(sql%(username,password))通過(guò)字符串拼接生成SQL語(yǔ)句
》》由下圖可知,我們SQL注入已經(jīng)成功,設(shè)想如果是delete語(yǔ)句會(huì)帶來(lái)巨大風(fēng)險(xiǎn)
》》原因:SQL語(yǔ)句是解釋性語(yǔ)言,在拼接SQL語(yǔ)句時(shí),容易被注入惡意的SQL語(yǔ)句
![poYBAGP4W-OAbaRkAABSjilYVrk181.png](https://file.elecfans.com/web2/M00/93/A6/poYBAGP4W-OAbaRkAABSjilYVrk181.png)
三.防范SQL注入
預(yù)編譯機(jī)制
》》解釋?zhuān)侯A(yù)編譯SQL語(yǔ)句就是數(shù)據(jù)庫(kù)提前把SQL語(yǔ)句編譯成二進(jìn)制,這樣反復(fù)執(zhí)行同一條SQL語(yǔ)句的效率會(huì)提升
》》原理:SQL語(yǔ)句編譯過(guò)程中,關(guān)鍵字已經(jīng)被解析過(guò)了,所以向編譯后的SQL語(yǔ)句傳入?yún)?shù),都會(huì)被當(dāng)作字符串
處理,數(shù)據(jù)庫(kù)不會(huì)解析其中注入的SQL語(yǔ)句
執(zhí)行過(guò)程圖
![poYBAGP4W_6AXddPAAAu21zl4hQ698.png](https://file.elecfans.com/web2/M00/93/A6/poYBAGP4W_6AXddPAAAu21zl4hQ698.png)
import mysql.connector
config={
"host":"localhost",
"port":3306,
"user":"root",
"password":"253611",
"database":"gzh",
"auth_plugin":"mysql_native_password"
}
#初始化connect對(duì)象
con=mysql.connector.connect(**config)
#定義username
username="1 OR 1=1"
#定義password
password="1 OR 1=1"
#書(shū)寫(xiě)sql語(yǔ)句
sql="SELECT COUNT(*) FROM t_user WHERE username=%s "
"AND AES_DECRYPT(UNHEX(password),'HelloWorld')=%s";
#初始化游標(biāo)
cursor=con.cursor()
#執(zhí)行SQL語(yǔ)句,這里sql為預(yù)編譯后的語(yǔ)句
cursor.execute(sql,(username,password))
#輸出數(shù)據(jù)
print("全部數(shù)據(jù)條數(shù)為:",cursor.fetchone()[0])
#關(guān)閉鏈接
con.close()
總結(jié):
》》cursor.execute(sql,(username,password))通過(guò)預(yù)編譯后二進(jìn)制執(zhí)行
》》由下圖可知,我們防范SQL注入已經(jīng)成功
![poYBAGP4XBeAbJWiAABcs0eTZGo703.png](https://file.elecfans.com/web2/M00/93/A6/poYBAGP4XBeAbJWiAABcs0eTZGo703.png)
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
SQL
+關(guān)注
關(guān)注
1文章
775瀏覽量
44254 -
防范
+關(guān)注
關(guān)注
0文章
4瀏覽量
7143
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
python實(shí)戰(zhàn)數(shù)據(jù)庫(kù)MySQL---4操作MySQL
變量沒(méi)有默認(rèn)值,所以,每個(gè)空都要填寫(xiě)。實(shí)現(xiàn)數(shù)據(jù)庫(kù)之前,需要實(shí)現(xiàn)數(shù)據(jù)MySQL的安裝配置,這些網(wǎng)上到處是例程,大家自行參考。還有要先創(chuàng)建數(shù)據(jù)庫(kù)“test”,可以用
發(fā)表于 01-09 21:21
MySQL數(shù)據(jù)庫(kù)的python模塊安裝
ORM:orm(Object Relation Mapping 對(duì)象關(guān)系映射) 定義:把對(duì)象模型映射到MySQL數(shù)據(jù)庫(kù)中
發(fā)表于 08-05 08:41
Python操作Mysql實(shí)現(xiàn)數(shù)據(jù)庫(kù)腳本的方法概述
Python操作Mysql數(shù)據(jù)庫(kù)腳本(cmd)
發(fā)表于 10-08 10:44
Python連接MySQL數(shù)據(jù)庫(kù)及模塊封裝
python連接mysql與sql server數(shù)據(jù)庫(kù)及相應(yīng)的模塊封裝
發(fā)表于 05-01 16:06
python如何連接MySql數(shù)據(jù)庫(kù)
Python入門(mén)(python連接MySql數(shù)據(jù)庫(kù))還能怎么記,大開(kāi)眼界!
發(fā)表于 06-14 07:48
如何使用Python操作MySQL數(shù)據(jù)庫(kù)
使用Python進(jìn)行MySQL的庫(kù)主要有三個(gè),Python-MySQL(更熟悉的名字可能是MySQLdb),PyMySQL和SQLAlchemy。
PHP與MYSQL數(shù)據(jù)庫(kù)如何進(jìn)行交互詳細(xì)方法實(shí)驗(yàn)說(shuō)明
本文檔的主要內(nèi)容詳細(xì)介紹的是PHP與MYSQL數(shù)據(jù)庫(kù)如何進(jìn)行交互詳細(xì)方法實(shí)驗(yàn)說(shuō)明。一、【實(shí)驗(yàn)?zāi)康摹?. 掌握PHP提供的各種函數(shù)與MYSQL數(shù)據(jù)庫(kù)
發(fā)表于 06-13 16:58
?13次下載
華為云數(shù)據(jù)庫(kù)-RDS for MySQL數(shù)據(jù)庫(kù)
華為云數(shù)據(jù)庫(kù)-RDS for MySQL數(shù)據(jù)庫(kù) 華為云數(shù)據(jù)庫(kù)作為華為云的一款數(shù)據(jù)庫(kù)產(chǎn)品,它主要是以MyS
python讀取數(shù)據(jù)庫(kù)數(shù)據(jù) python查詢(xún)數(shù)據(jù)庫(kù) python數(shù)據(jù)庫(kù)連接
使用第三方庫(kù),包括MySQLDB、sqlite3、psycopg2等庫(kù)。其中MySQLDB是Python連接MySQL數(shù)據(jù)庫(kù)的一個(gè)重要
MySQL數(shù)據(jù)庫(kù)管理與應(yīng)用
MySQL數(shù)據(jù)庫(kù)管理與應(yīng)用 MySQL是一種廣泛使用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),被認(rèn)為是最流行和最常見(jiàn)的開(kāi)源數(shù)據(jù)庫(kù)之一。它可以被用于多種不同的應(yīng)
mysql數(shù)據(jù)庫(kù)基礎(chǔ)命令
MySQL是一個(gè)流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),經(jīng)常用于存儲(chǔ)、管理和操作數(shù)據(jù)。在本文中,我們將詳細(xì)介紹MySQL的基礎(chǔ)命令,并提供與每個(gè)命令相關(guān)的詳細(xì)解釋。 登錄
MySQL數(shù)據(jù)庫(kù)的安裝
MySQL數(shù)據(jù)庫(kù)的安裝 【一】各種數(shù)據(jù)庫(kù)的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django :8000 flask :5000 【二】
![<b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)庫(kù)</b>的安裝](https://file1.elecfans.com/web3/M00/05/E2/wKgZPGeF2XWAe83fAAAW9lhgvGk652.jpg)
適用于MySQL和MariaDB的Python連接器:可靠的MySQL數(shù)據(jù)連接器和數(shù)據(jù)庫(kù)
和 Linux 的 wheel 包分發(fā)。 直接連接 該解決方案使您能夠通過(guò) TCP/IP 建立與 MySQL 或者 MariaDB 數(shù)據(jù)庫(kù)服務(wù)器的直接連接,而無(wú)需數(shù)據(jù)庫(kù)客戶(hù)端庫(kù)。另外
![適用于<b class='flag-5'>MySQL</b>和MariaDB的<b class='flag-5'>Python</b>連接器:可靠的<b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)</b>連接器和<b class='flag-5'>數(shù)據(jù)庫(kù)</b>](https://file1.elecfans.com/web3/M00/06/57/wKgZPGeJ2kmAcWpWAAAh1ecL_LM122.png)
評(píng)論