一.項(xiàng)目背景
本項(xiàng)目主要是通過SQL注入案例來讓大家了解如何防范SQL攻擊,希望對大家有所幫助
二.實(shí)現(xiàn)過程
》》創(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ù)庫中總共有兩條數(shù)據(jù)
》》SQL注入
import mysql.connector
#配置數(shù)據(jù)庫參數(shù)
config={
"host":"localhost",
"port":3306,
"user":"root",
"password":"253611",
"database":"gzh",
"auth_plugin":"mysql_native_password"
}
#初始化connect對象
con=mysql.connector.connect(**config)
#定義username
username="1 OR 1=1"
#定義password
password="1 OR 1=1"
#書寫sql語句,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語句,字符串拼接生成
cursor.execute(sql%(username,password))
#輸出數(shù)據(jù)
print("全部數(shù)據(jù)條數(shù)為:",cursor.fetchone()[0])
#關(guān)閉鏈接
con.close()
總結(jié):
》》cursor.execute(sql%(username,password))通過字符串拼接生成SQL語句
》》由下圖可知,我們SQL注入已經(jīng)成功,設(shè)想如果是delete語句會(huì)帶來巨大風(fēng)險(xiǎn)
》》原因:SQL語句是解釋性語言,在拼接SQL語句時(shí),容易被注入惡意的SQL語句
三.防范SQL注入
預(yù)編譯機(jī)制
》》解釋:預(yù)編譯SQL語句就是數(shù)據(jù)庫提前把SQL語句編譯成二進(jìn)制,這樣反復(fù)執(zhí)行同一條SQL語句的效率會(huì)提升
》》原理:SQL語句編譯過程中,關(guān)鍵字已經(jīng)被解析過了,所以向編譯后的SQL語句傳入?yún)?shù),都會(huì)被當(dāng)作字符串
處理,數(shù)據(jù)庫不會(huì)解析其中注入的SQL語句
執(zhí)行過程圖
import mysql.connector
config={
"host":"localhost",
"port":3306,
"user":"root",
"password":"253611",
"database":"gzh",
"auth_plugin":"mysql_native_password"
}
#初始化connect對象
con=mysql.connector.connect(**config)
#定義username
username="1 OR 1=1"
#定義password
password="1 OR 1=1"
#書寫sql語句
sql="SELECT COUNT(*) FROM t_user WHERE username=%s "
"AND AES_DECRYPT(UNHEX(password),'HelloWorld')=%s";
#初始化游標(biāo)
cursor=con.cursor()
#執(zhí)行SQL語句,這里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))通過預(yù)編譯后二進(jìn)制執(zhí)行
》》由下圖可知,我們防范SQL注入已經(jīng)成功
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
SQL
+關(guān)注
關(guān)注
1文章
753瀏覽量
44032 -
防范
+關(guān)注
關(guān)注
0文章
4瀏覽量
7093
發(fā)布評論請先 登錄
相關(guān)推薦
python實(shí)戰(zhàn)數(shù)據(jù)庫MySQL---4操作MySQL
變量沒有默認(rèn)值,所以,每個(gè)空都要填寫。實(shí)現(xiàn)數(shù)據(jù)庫之前,需要實(shí)現(xiàn)數(shù)據(jù)MySQL的安裝配置,這些網(wǎng)上到處是例程,大家自行參考。還有要先創(chuàng)建數(shù)據(jù)庫“test”,可以用
發(fā)表于 01-09 21:21
MySQL數(shù)據(jù)庫的python模塊安裝
ORM:orm(Object Relation Mapping 對象關(guān)系映射) 定義:把對象模型映射到MySQL數(shù)據(jù)庫中
發(fā)表于 08-05 08:41
python數(shù)據(jù)分析之安裝mysql數(shù)據(jù)庫
python 數(shù)據(jù)分析基礎(chǔ) day11-mysql安裝
發(fā)表于 03-20 11:18
Python連接MySQL數(shù)據(jù)庫及模塊封裝
python連接mysql與sql server數(shù)據(jù)庫及相應(yīng)的模塊封裝
發(fā)表于 05-01 16:06
如何使用Python操作MySQL數(shù)據(jù)庫
使用Python進(jìn)行MySQL的庫主要有三個(gè),Python-MySQL(更熟悉的名字可能是MySQLdb),PyMySQL和SQLAlchemy。
PHP與MYSQL數(shù)據(jù)庫如何進(jìn)行交互詳細(xì)方法實(shí)驗(yàn)說明
本文檔的主要內(nèi)容詳細(xì)介紹的是PHP與MYSQL數(shù)據(jù)庫如何進(jìn)行交互詳細(xì)方法實(shí)驗(yàn)說明。一、【實(shí)驗(yàn)?zāi)康摹?. 掌握PHP提供的各種函數(shù)與MYSQL數(shù)據(jù)庫
發(fā)表于 06-13 16:58
?13次下載
華為云數(shù)據(jù)庫-RDS for MySQL數(shù)據(jù)庫
華為云數(shù)據(jù)庫-RDS for MySQL數(shù)據(jù)庫 華為云數(shù)據(jù)庫作為華為云的一款數(shù)據(jù)庫產(chǎn)品,它主要是以MyS
python讀取數(shù)據(jù)庫數(shù)據(jù) python查詢數(shù)據(jù)庫 python數(shù)據(jù)庫連接
使用第三方庫,包括MySQLDB、sqlite3、psycopg2等庫。其中MySQLDB是Python連接MySQL數(shù)據(jù)庫的一個(gè)重要
MySQL數(shù)據(jù)庫管理與應(yīng)用
MySQL數(shù)據(jù)庫管理與應(yīng)用 MySQL是一種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),被認(rèn)為是最流行和最常見的開源數(shù)據(jù)庫之一。它可以被用于多種不同的應(yīng)
MySQL數(shù)據(jù)庫基礎(chǔ)知識
MySQL 是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它是目前最流行的數(shù)據(jù)庫之一。MySQL 提供了一種結(jié)構(gòu)化的方法來管理大量的數(shù)據(jù),并且具有高效、
mysql數(shù)據(jù)庫基礎(chǔ)命令
MySQL是一個(gè)流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),經(jīng)常用于存儲、管理和操作數(shù)據(jù)。在本文中,我們將詳細(xì)介紹MySQL的基礎(chǔ)命令,并提供與每個(gè)命令相關(guān)的詳細(xì)解釋。 登錄
評論