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’}