MySQL-pymysql模块

本文介绍了如何使用Python的pymysql模块安装及连接MySQL数据库,展示了用户登录的代码实现,并详细讨论了SQL注入的概念、攻击思路及实例。同时,给出了防止SQL注入的方法,强调了使用参数化语句的重要性。此外,还展示了pymysql的增删改查操作。
摘要由CSDN通过智能技术生成

1 pymysql模块安装

pymysql安装:

pip3 install pymysql -i https://pypi.douban.com/simple

在这里插入图片描述

安装成功!
检查是否安装成功,即在python环境下import pymysql,不报错就安装成功!

2 Python实现用户登录

代码实现:

import pymysql

username = input("输入你的用户名:")
password = input("请输入你的密码:")

conn = pymysql.connect(host="localhost", user='root', password='', database="pymysql")  # 连接数据库
cursor = conn.cursor()    # 打开游标
sql = "select * from userinfo where username=%s and password=%s" 
cursor.execute(sql, [username, password])  # 这句话的返回值是的操作的行数
result = cursor.fetchone()  # fetchone表示只拿第一个数据
cursor.close() # 关闭游标
conn.close()   # 关闭数据库

if result:
    print("登录成功")
else:
    print("用户名密码不正确")

在这里插入图片描述
如果含中文,应在pymysql.connect中添加charset=‘utf8’
如下:
在这里插入图片描述

3 SQL注入

一、SQL注入简介

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

二、SQL注入攻击的总体思路

1.寻找到SQL注入的位置
2.判断服务器类型和后台数据库类型
3.针对不通的服务器和数据库特点进行SQL注入攻击

三、SQL注入攻击实例

import pymysql

username = input("输入你的用户名:")
password = input("请输入你的密码:")

conn = pymysql.connect(host="localhost", user='root', password='', database="pymysql")
cursor = conn.cursor()
sql = "select * from userinfo where username='%s' and password='%s'" % (username, password)
cursor.execute(sql)
result = cursor.fetchone()
cursor.close()
conn.close()

if result:
    print("登录成功")
else:
    print("用户名密码不正确")

当用户名输入:'or 1=1-- (前面是个空格)的时候会产生SQL注入
这句SQL语句就变成了:
select * from userinfo where username=''or 1=1 -- ' and password='%s'
解释:or 后面有1=1 是永远成立的 然后-- 表示sql语句中的注释,因此会登录成功
在这里插入图片描述

四、解决方法

使用pymysql提供的参数化语句防止注入

import pymysql

username = input("输入你的用户名:")
password = input("请输入你的密码:")

conn = pymysql.connect(host="localhost", user='root', password='', database="pymysql")
cursor = conn.cursor()
sql = "select * from userinfo where username='%s' and password='%s'"
cursor.execute(sql, [username, password])        # 将参数写到execute函数里面
# cursor.execute(sql,user,pwd)                           # 直接写到后面
# cursor.execute(sql,{'u':username,'p':password})				 #使用字典
result = cursor.fetchone()
cursor.close()
conn.close()

if result:
    print("登录成功")
else:
    print("用户名密码不正确")

excute执行SQL语句的时候,必须使用参数化的方式,否则必然产生SQL注入漏洞。

4 pymysql其它函数

增删改属于一类,查属于一类

# 插入单条数据
import pymysql

username = 'admin'
password = '123'

conn = pymysql.connect(host="localhost", user='root', password='', database="pymysql")  # 连接数据库
cursor = conn.cursor()    # 打开游标
sql = "insert into userinfo(username,password) values(%s, %s)"
r = cursor.execute(sql, [username, password])  # 插入数据,execute执行会有个返回值。即受影响的行数(这里可令r等于其)
conn.commit() # 如果进行插入操作,需要进行提交。否则会没有插入成功
cursor.close() # 关闭游标
conn.close()   # 关闭数据库


在这里插入图片描述

# 插入多条数据
import pymysql

conn = pymysql.connect(host="localhost", user='root', password='', database="pymysql")  # 连接数据库
cursor = conn.cursor()    # 打开游标
sql = "insert into userinfo(username,password) values(%s, %s)"
r = cursor.executemany(sql, [('laoyao','123'), ('egon','113')])  # 插入多条数据,executemany执行会有个返回值。即受影响的行数(这里可令r等于其)
conn.commit() # 如果进行插入操作,需要进行提交。否则会没有插入成功
cursor.close() # 关闭游标
conn.close()   # 关闭数据库

在这里插入图片描述

# 查数据
# conn = pymysql.connect(host="localhost",user='root',password='',database="pymysql")
# cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)       #这句话,会让操作的结果返回字典,而不是元组
# sql = "select * from userinfo"
# cursor.execute(sql)

# cursor.scroll(1,mode='relative')  # 游标相对当前位置移动
# cursor.scroll(2,mode='absolute')  # 游标相对绝对位置移动
# result = cursor.fetchone()        # 获取一行数据
# print(result)
# result = cursor.fetchone()
# print(result)
# result = cursor.fetchone()
# print(result)
# result = cursor.fetchall()        # 获取所有的数据
# print(result)


# result = cursor.fetchmany(4)      # 获取多行数据
# print(result)
# cursor.close()
# conn.close()
# 新插入数据的自增ID: cursor.lastrowid
# import pymysql
#
# conn = pymysql.connect(host="localhost",user='root',password='123',database="pymsql")
# cursor = conn.cursor()
# sql = "insert into userinfo(username,password) values('asdfasdf','123123')"
# cursor.execute(sql)
# conn.commit()
# print(cursor.lastrowid) # 获得新增数据的自增ID,也是前面操作的主键的行数
# cursor.close()
# conn.close()

返回的元组:
(1, ‘alex’, ‘123’)
返回字典:
{‘uid’: 1, ‘username’: ‘alex’, ‘password’: ‘123’}

其他参考:
https://www.cnblogs.com/wupeiqi/articles/5713330.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值