pymysql模块

安装

pip install pymysql

一 链接、执行,关闭(游标)

import pymysql

# 链接
conn = pymysql.connect(
    host='127.0.0.1',
    user='root',
    port=3306,
    password='123123',
    db='day36',
    charset='utf8',)
# 游标
# cursor = conn.cursor()  #执行完毕返回的结果默认以元组显示

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# cursor=pymysql.cursors.DictCursor 将查询出来的结果制作成字典的形式返回

# 执行sql语句
sql = "select * from teacher"
res = cursor.execute(sql)  # 执行sql语句,返回sql查询成功的记录数目
# print(cursor.fetchone())   # 只获取查询结果中的一条数据
# print(cursor.fetchmany(2))   #指定获取几条数据,如果数字超了也不会报错
# print(cursor.fetchall()) #获取查询结果的所有数据

#相对移动
# cursor.scroll(2,'relative')  #基于指针所在的位置,往后偏移
# print(cursor.fetchall())
#绝对移动
cursor.scroll(1,'absolute')
print(cursor.fetchall())

cursor.close()
conn.close()


二 excute() 注入

SQL注入是一种注入攻击,可以执行恶意SQL语句

注意:符号 -- 会注释掉它之后的sql,正确的语法: -- 后至少有一个任意字符

根本原理:就根据程序的字符串拼接 name = '%s',我么输入一个xxx - - haha,用我们输入的xxx加'在程序中拼接成一个判断条件name = 'xxx' - -haha

1、sql注入之:用户存在,绕过密码
leti' -– 任意字符

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

import pymysql

# 链接
conn = pymysql.connect(
    host='127.0.0.1',
    user='root',
    port=3306,
    password='123123',
    db='day36',
    charset='utf8',)
# 游标
# cursor = conn.cursor()  #执行完毕返回的结果默认以元组显示
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# cursor=pymysql.cursors.DictCursor 将查询出来的结果制作成字典的形式返回

username = input("username>>>:").strip()
password = input("password>>>:").strip()

# 执行sql语句
sql = "select * from userinfo where name='%s' and password='%s'"%(username,password)
print(sql)
# cursor.execute(sql,(username,password))
cursor.execute(sql,)
res = cursor.fetchall()

if res:
    print(res)
else:
    print('username or password error!')

cursor.close()
conn.close()


解决方法:

# 原来是我们对sql进行字符串拼接
# sql = "select * from userinfo where name='%s' and password='%s'"(username,password)
# print(sql)
# res=cursor.execute(sql)

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql = "select * from userinfo where name=%s and password='%s" #
!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
cursor.execute(sql,(username,password)) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

三 增、删、改:conn.commit()

autocommit = True  #自动提交

# 链接
conn = pymysql.connect(
    host='127.0.0.1',
    user='root',
    port=3306,
    password='123123',
    db='day36',
    charset='utf8',
    autocommit=True)
#增
sql = "insert into userinfo(name,password) values('so','123456');"
res = cursor.execute(sql)
#删
sql = 'delete from userinfo where name="so"'
res = cursor.execute(sql)
#改
sql = 'update userinfo set name="666" where password="123456"'
res = cursor.execute(sql)

针对增 删 改操作 执行重要程度偏高

conn.commit()

 posted on 2019-12-16 18:52  Rannie`  阅读(110)  评论(0编辑  收藏  举报
去除动画
找回动画