Fork me on github

pymysql 模块的用法

介绍mysql模块
首先让py和数据库连接,通过这个模块建立连接
pip install pymysql
'''
import pymysql
conn = (host ='localhost',#服务器ip
port =3306,#服务器端口号
user ='root',#服务器用户名
pwd =None,#服务器密码
database ='db1',服务器中的一个库
charset ='uf8'
)#建立连接

cursor= conn.cursor()#建立游标,返回的结果集是元组形式的数据
#cursor = conn.cursor(pymysql.cursors.DictCursor)#建立游标,结果集是字典形式的数据

执行sql
sql='select * from t1'#(t1 是db2库中已经存在的table)
借助execute来注入
res =cursor.execute(sql) #拼接字符串
print(res)
cursor.close() #关闭游标
conn.close() # 关闭连接
'''


由于execute注入的机制和数据库sql命令的机制
会出现不少bug,如--,or 这些字符的出现

举个例子,db2中有userinfo表 其中内含字段id ,name,pwd 查询时会出现一些漏洞
userinfo表中内含(1,oewn1,123)(2,owen2,456),(3,owen3,789)三条数据
import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip()

#链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
#游标
cursor=conn.cursor()
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)


#执行sql语句
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
print(sql)
res=cursor.execute(sql)
print(res)

cursor.close()
conn.close()

if res:
print('登录成功')
else:
print('登录失败')

#1、sql注入之:用户存在,绕过密码
owen1" -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码
xxx" or 1=1 -- 任意字符

一开始是字符串拼接,我们让这个模块帮我们拼接
#改写为(execute帮我们做字符串拼接,我们无需再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!
res=cursor.execute(sql,[name,pwd])

谈谈CRUD(增删改查)
sql='insert into userinfo(name,password) values("root","123456");'
res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
print(res)
但这只是在内存中做了创建,并没有写到磁盘里面去,增删改都需要提交commit
我们需要在conn.close()之前conn.commit()提交一下方可以写到盘里.

在查的时候并不需要提交commit,用的是fetchone,fetchmany,fetchall,
# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
# cursor.scroll(3,mode='relative') # 相对当前位置移动
#scroll作用指向游标,移动游标位置
print(res1=cursor.fetchone())
print(res2=cursor.fetchone())
posted @ 2019-05-17 16:16  khan369  阅读(205)  评论(0编辑  收藏  举报