day36

pymsql 模块

1. pymsql的使用

import pymysql  # 导入 pymysql 模块

# 链接数据库
conn = pymysql.connect(host = 'IP', user = '用户名', password = '密码', database = '数据库名称', charset = 'utf8')

# 游标
cursor = conn.cursor()  # 执行完毕后返回的结果默认以元祖的形式展现
# cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # 执行完毕后返回的结果以字典的形式展现,推荐使用

# 执行 SQL 指令
sql = 'SQL指令'   # 若是须要传入参数,在指令里面使用占位符,在下面的 cursor.execute(sql) 函数中,将参数按顺序写在 sql 后面  
res = cursor.execute(sql,(参数...))   # 执行 SQL指令,返回查询成功的记录

conn.commit()   # 若是对数据库里的数据作改动,必须加这一行

# 断开数据库的链接
cursor.close()
conn.close()

1.1 增

import pymysql  # 导入 pymysql 模块

# 链接数据库
conn = pymysql.connect(host = 'IP', user = '用户名', password = '密码', database = '数据库名称', charset = 'utf8')

# 游标
 # cursor = conn.cursor()   # 执行完毕后返回的结果默认以元祖的形式展现
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 执行完毕后返回的结果以字典的形式展现

'''
1.增长一条数据
# 执行 SQL 指令
sql = 'insert into user (name,password) values (%s, %s)'    # 添加数据的 SQL指令   
res = cursor.execute(sql,('tom','123')) # 将 SQL指令和数据发给 mysql,执行后拿到结果

conn.commit()   # 提交

2.增长多条数据
# 准备要添加的数据
data = [
    ('name1','password1'),
    ('name1','password1'),
    ('name1','password1')
    ]

sql = 'insert into user (name,password) values (%s, %s)'    # 添加数据的 SQL指令   

res = executemany(sql, data)    # 将 SQL指令和数据发给 mysql,执行后拿到结果

conn.commit()
'''

# 断开数据库的链接
cursor.close()
conn.close()

1.2 改

import pymysql  # 导入 pymysql 模块

# 链接数据库
conn = pymysql.connect(host = 'IP', user = '用户名', password = '密码', database = '数据库名称', charset = 'utf8')

# 游标
# cursor = conn.cursor()    # 执行完毕后返回的结果默认以元祖的形式展现
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 执行完毕后返回的结果以字典的形式展现

# 执行 SQL 指令
sql = 'update user set name=%s where id=%s' # 修改数据的 SQL指令
res = cursor.execute(sql,('jack',2))    # 将 SQL指令和数据发给 mysql,执行后拿到结果

conn.commit()   # 若是对数据库里的数据作改动,必须加这一行

# 断开数据库的链接
cursor.close()
conn.close()

1.3 删

import pymysql  # 导入 pymysql 模块

# 链接数据库
conn = pymysql.connect(host = 'IP', user = '用户名', password = '密码', database = '数据库名称', charset = 'utf8')

# 游标
# cursor = conn.cursor()    # 执行完毕后返回的结果默认以元祖的形式展现
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 执行完毕后返回的结果以字典的形式展现

# 执行 SQL 指令
sql = 'delete from t3 where id=%s'  # 删除数据的 SQL指令
res = cursor.execute(sql,(1,))  # 将 SQL指令和数据发给 mysql,执行后拿到结果

conn.commit()   # 若是对数据库里的数据作改动,必须加这一行

# 断开数据库的链接
cursor.close()
conn.close()

1.4 查

import pymysql  # 导入 pymysql 模块

# 链接数据库
conn = pymysql.connect(host = 'IP', user = '用户名', password = '密码', database = '数据库名称', charset = 'utf8')

# 游标
# cursor = conn.cursor()    # 执行完毕后返回的结果默认以元祖的形式展现
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)   # 执行完毕后返回的结果以字典的形式展现

# 执行 SQL 指令
sql = 'delete from t3 where id=%s'  # 查询数据的 SQL指令

cursor.execute(sql,(1,))    # 将 SQL指令和数据发给 mysql,执行后拿到结果

res = cursor.fetchone()         # 取出查询结果的一条数据,字典
res = cursor.fetchall()         # 取出查询结果的全部数据,列表套字典
res = cursor.fetchmany(size)     # 指定取出查询结果的数量,列表套字典

print(res)  # 打印查询结果

# 断开数据库的链接
cursor.close()
conn.close()

2. pymysql的注入攻击

为何在编写 SQL指令时,参数须要使用 execute() 函数传入,而不是直接在 SQL指令里面构造好,就是为了防止 SQL注入攻击。python

2.1 原理

经过构建特殊的输入值做为参数,从而完成欺骗 MySQL ,进而执行恶意的 SQL指令。mysql

若是将 SQL指令写成以下形式:
sql = "select * from user where name='%s' and password='%s'" % (user, pwd)  # (user,pwd)由用户输入
咱们将 user 和 pwd 输入“admin' or '1” 咱们就能意外的进入到登陆页面以后了

当用户输入
select * from [users] where username= 'admin' or '1' and password='admin' or '1'
根据SQL中逻辑运算的优先级,or低于and,最后的or ‘1’永远成立,因此该条件表达式结果为True,
此语句同等于select * from [users]

2.2 防范的方法

  1. 不要相信用户的输入,对用户输入的信息作校验,好比特殊字符等...
  2. 使用 pymsql 提供的 execute() 函数传入用户输入的参数,这个函数会自动对用户输入的信息进行校验
  3. 对重要数据进行加密处理
相关文章
相关标签/搜索