python操作MySQL

# 导入第三方模块
import pymysql

# 链接服务端
db = pymysql.connect(
    host='127.0.0.1',  # MySQL服务的IP地址
    port=3306,  # MySQL默认PORT端口号
    user='root',  # 用户名
    password='',  # 密码(简写:passwd)
    database='test',  # 数据库名称(简写:db)
    charset='utf8'  # 字符编码
      # autocommit=True  # 自动二次确认
)

# 产生获取命令的游标对象
cursor = db.cursor(
    cursor=pymysql.cursors.DictCursor
)  # 括号内不写参数,数据是元组要元组 不够精确 添加参数则会将数据处理成字典

sql = 'show tables'

# 执行SQL语句,并返回受影响的行数
affect_row = cursor.execute(sql)
print(affect_row)

# 注意:insert、update、delete 等修改数据的语句需要二次确认
conn_obj.commit()  # 手动二次确认


# 获取SQL语句执行后的结果
res = cursor.fetchall()
print(res)

查询数据

  • fetchall() :获取查询结果的所有行。将所有行作为元组列表返回。如果没有要获取的记录,则返回一个空列表。
  • fetchmany(size):返回参数指定的行数size。当重复调用时,此方法获取查询结果的下一组行并返回元组列表。如果没有更多行可用,则返回一个空列表
  • fetchone():该方法返回单个行记录,如果没有更多行可用,则返回 None

游标控制

  • cursor.scroll(1, 'relative'):相对于当前位置游标往后移动一个单位
  • cursor.scroll(1, 'absolute'):相对于起始位置游标往后移动一个单位

事务处理

  • 开启事务 db.begin()
  • 提交修改 db.commit()
  • 回滚事务 db.rollback()

SQL注入问题

准备数据

create table admin(username varchar(32),password varchar(32));
insert into admin (username,password) values('kevin','123');

注入问题

import pymysql

db = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='',
    database='test',
    charset='utf8'
)

cursor = db.cursor(
    cursor=pymysql.cursors.DictCursor
)

username = input("请输入用户名>>>").strip()
password = input("请输入密码>>>").strip()

sql = "select username,password from admin where username = '%s' and password = '%s'" % (username, password)

affect_row = cursor.execute(sql)
res = cursor.fetchall()
if res:
    print("登录成功")
else:
    print("用户名或密码错误")

这样会导致如果用户输入' or 1=1 #恶意字符串,拼接在SQL语句也会登录成功

select username,password from admin where username = '' or 1=1 #' and password = ''

解决办法

解决SQL注入的问题其实也很简单就是过滤掉特殊符号,execute方法自带校验SQL注入问题 自动处理特殊符号

  ssql = "select username,password from admin where username = %s and password = %s"
    cursor.execute(sql, (username, password))

补充:以后涉及到敏感数据的拼接全部交给execute方法就好了

Last modification:May 15, 2022
如果觉得我的文章对你有用,请随意赞赏