一.项目背景
本项目主要是通过SQL注入案例来让大家了解如何防范SQL攻击,希望对大家有所帮助
二.实现过程
》》创建数据表
》》插入数据
》》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)
注:数据库中总共有两条数据
》》SQL注入
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语句,AES_DECRYPT为解密函数
sql="SELECT COUNT(*) FROM t_user WHERE username=%s "
"AND AES_DECRYPT(UNHEX(password),'HelloWorld')=%s";
#初始化游标
cursor=con.cursor()
#执行SQL语句,字符串拼接生成
cursor.execute(sql%(username,password))
#输出数据
print("全部数据条数为:",cursor.fetchone()[0])
#关闭链接
con.close()
总结:
》》cursor.execute(sql%(username,password))通过字符串拼接生成SQL语句
》》由下图可知,我们SQL注入已经成功,设想如果是delete语句会带来巨大风险
》》原因:SQL语句是解释性语言,在拼接SQL语句时,容易被注入恶意的SQL语句
三.防范SQL注入
预编译机制
》》解释:预编译SQL语句就是数据库提前把SQL语句编译成二进制,这样反复执行同一条SQL语句的效率会提升
》》原理:SQL语句编译过程中,关键字已经被解析过了,所以向编译后的SQL语句传入参数,都会被当作字符串
处理,数据库不会解析其中注入的SQL语句
执行过程图
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";
#初始化游标
cursor=con.cursor()
#执行SQL语句,这里sql为预编译后的语句
cursor.execute(sql,(username,password))
#输出数据
print("全部数据条数为:",cursor.fetchone()[0])
#关闭链接
con.close()
总结:
》》cursor.execute(sql,(username,password))通过预编译后二进制执行
》》由下图可知,我们防范SQL注入已经成功
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
SQL
+关注
关注
1文章
764浏览量
44152 -
防范
+关注
关注
0文章
4浏览量
7129
发布评论请先 登录
相关推荐
python实战数据库MySQL---4操作MySQL
变量没有默认值,所以,每个空都要填写。实现数据库之前,需要实现数据MySQL的安装配置,这些网上到处是例程,大家自行参考。还有要先创建数据库“test”,可以用
发表于 01-09 21:21
如何使用Python操作MySQL数据库
使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能是MySQLdb),PyMySQL和SQLAlchemy。
PHP与MYSQL数据库如何进行交互详细方法实验说明
本文档的主要内容详细介绍的是PHP与MYSQL数据库如何进行交互详细方法实验说明。一、【实验目的】1. 掌握PHP提供的各种函数与MYSQL数据库
发表于 06-13 16:58
•13次下载
华为云数据库-RDS for MySQL数据库
华为云数据库-RDS for MySQL数据库 华为云数据库作为华为云的一款数据库产品,它主要是以MyS
python读取数据库数据 python查询数据库 python数据库连接
使用第三方库,包括MySQLDB、sqlite3、psycopg2等库。其中MySQLDB是Python连接MySQL数据库的一个重要
MySQL数据库管理与应用
MySQL数据库管理与应用 MySQL是一种广泛使用的关系型数据库管理系统,被认为是最流行和最常见的开源数据库之一。它可以被用于多种不同的应
MySQL数据库基础知识
MySQL 是一种开源的关系型数据库管理系统,它是目前最流行的数据库之一。MySQL 提供了一种结构化的方法来管理大量的数据,并且具有高效、
mysql数据库基础命令
MySQL是一个流行的关系型数据库管理系统,经常用于存储、管理和操作数据。在本文中,我们将详细介绍MySQL的基础命令,并提供与每个命令相关的详细解释。 登录
评论