美文网首页
Python学习

Python学习

作者: 逛逛_堆栈 | 来源:发表于2021-04-14 13:15 被阅读0次

第二十一天

SQL注入

1、概念

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

2、SQL注入实现

2.1、数据准备

简单准备一个user表并加入数据

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `pass` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

2.2、SQL注入

以用户登陆为例,检测SQL注入:

import pymysql
#创建连接
db = pymysql.connect(host='localhost',port=3306,user='root',
                     passwd='root',database='python_db')

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
#控制台输入用户名和密码
username = input('请输入用户名')
password = input('请输入用户密码')
#创建SQL语句 cursor.execute执行
sql = 'select * from users where name = "%s" and pass = "%s"' %(username,password)
print('-------->%s<----------' %(sql))
count = cursor.execute(sql) # count 查询的同时 返回行数
data = cursor.fetchall()
if data:
    for row in data:
        id = int(row[0])
        username = row[1]
        password = row[2]
        print('编号:%d,姓名:%s,密码:%s' %(id,username,password))
# 关闭游标与数据库连接
cursor.close()
db.close()

我们正常输入用户名和密码,肯定是没有问题的,但是如果我们输入

请输入用户名 " or 1 = 1 or " 1
请输入用户密码 " or 1 = 1 or " 1

依然没有输入用户名和密码,就获得了数据,相当于进入系统,上述这个过程其实就是SQL注入。

2.3、预防SQL注入

SQL注入的发生,都是因为程序接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分,所以对于来自客户端的参数,坚信外部数据不可信任的原则,从参数的检测、过滤、验证下手,确保参数是合法的正常的。

# 防止SQL注入
import pymysql
#创建连接
db = pymysql.connect(host='localhost',port=3306,user='root',
                     passwd='root',database='python_db')

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
#控制台输入用户名和密码
username = input('请输入用户名')
password = input('请输入用户密码')
params = [username,password]
#创建SQL语句 cursor.execute执行
count = cursor.execute('select * from users where name = %s and pass = %s',params)
data = cursor.fetchall()
if data:
    for row in data:
        id = int(row[0])
        username = row[1]
        password = row[2]
        print('编号:%d,姓名:%s,密码:%s' %(id,username,password))
# 关闭游标与数据库连接
cursor.close()
db.close()

python并不支持mysql预编译语句,不能够像Java那样预编译。可以利用参数化来预防SQL注入,传入一个列表之后,MySQLdb模块内部会将列表序列化成一个元组。所以我们在写应用的时候,应该尽可能的避免字符串SQL拼接,如果要拼接,也需要对客户端传递来的参数进行筛选、过滤。添加、删除、修改参数化同查询。

相关文章

网友评论

      本文标题:Python学习

      本文链接:https://www.haomeiwen.com/subject/sojwkltx.html