作者:手机用户2502906377 | 来源:互联网 | 2023-05-25 09:32
前面博文写到用pymysql连接MySQL数据库:#!usrbinenvpython#-*-coding:utf-8-*-importpymysql#创建连接c
前面博文写到用pymysql连接MySQL数据库:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql # 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 创建游标(游标是用来帮你获取数据的)
cursor = conn.cursor() # 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'") # 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
#effect_row = cursor.execute("select username from user_info where username = '%s' password = '%s'" % (name,pwd)) # 执行SQL,并返回受影响行数(插入多个数据)
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)]) # 提交,不然无法保存新建或者修改的数据
conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close()
pymysql使用的是cuosor.execute来执行SQL语句,我们可能会使用字符串拼接的方式来执行SQL语句,例如:
temp = "select name from user_info where username = '%s' password = '%s' " % (username,password)effect_row = cursor.execute(temp)#但是如此使用就会引起SQL注入,例如在用户提交表单时,在用户名这一栏填入anything ' or 1=1 -- d ,那么就可以登录到系统,因为单引号被识别为账号这个字符串的
#结束,那么又写入了一个或的条件判定,1恒等于1,必定成立。--在SQL中是注释,注释掉了账号之后的所有信息,所以能够‘骗’过系统,登录成功。更严重的是甚至可以通
#过SQL注入对数据库进行各种操作,后果不堪设想。
解决方法:使用pymysql自身的字符串拼接功能,不要自行拼接
需要注意的是,使用excute进行字符串的拼接,%s不要带引号
cursor.execute("INSERT INTO interface(name,ip,mask,gateway,status) VALUE (%s,%s,%s,%s,%s)",(i['name'], i['IP'], i['NETMASK'], i['GATEWAY'], i['STATUS']))