一 安装
pip3 install pymysql
二 操作(连接,游标,执行,注入的bug)
import pymysql
# 先要创建用户
# grant all on *.* to "root"@"localhost" identified by "123"; # 创建账户加授权
# flush privileges; # 刷新
user = input("Username:").strip()
password = input("Password:").strip()
# 建立链接
conn = pymysql.connect(
host="localhost",
user="root",
password="123",
database="user",
charset="utf8"
)
# 游标
cursor = conn.cursor() # 以元组显示结果
# cursor = conn.cursor(pymysql.cursor.DictCursor) # 以字典形式显示
# 执行
sql = 'select * from userinfo where name="%s" and password="%s"' % (user, password) # 注意%s需要加引号
print(sql)
res = cursor.execute(sql) # 执行sql语句,返回sql查询成功的记录数目
print(res)
cursor.close() # 关闭游标
conn.close() # 关闭链接
Note:在注入execute来执行时存在bug。
根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha' # -- 在mysql表示注释,后面的不会被执行。
#1、sql注入之:用户存在,绕过密码
egon' -- 任意字符
#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符
解决方法:
不再自己拼接字符串,让pymysql的内置模块来实现。
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
三 增,删,改
sql='insert into userinfo(name,password) values("root","123456");'
res=cursor.execute(sql)
print(res)
sql = 'insert into userinfo(name,password) values(%s,%s);'
res = cursor.execute(sql, ("root", "123456"))
print(res)
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) # 可插入多条记录
print(res)
conn.commit() # 提交后才发现表中插入记录成功
四 查
sql='select * from userinfo;'
rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
# cursor.scroll(3,mode='relative') # 相对当前位置移动
res1=cursor.fetchone()
res2=cursor.fetchone()
res3=cursor.fetchone()
res4=cursor.fetchmany(2)
res5=cursor.fetchall()
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print('%s rows in set (0.00 sec)' %rows)
五 关于自增id的查看
sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) #在插入语句后查看
查看的是插入或删除前的最近id号。