MySQL数据库-SQL注入和pymysql模块防止SQL注入

SQL注入就是通过SQL语句绕开程序判断,获取到数据库的内容

下面以一个简单的程序登录SQL注入举例:

正常登录

1、数据库有一张会员表

2、用户输入账号和密码,到数据库查找此用户是否存在,存在登录成功,不存在登录失败

#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
import pymysql #导入数据库模块 class khdHandler(tornado.web.RequestHandler):
def get(self):
self.render("khd.html")
def post(self):
yhm = self.get_argument('yhm') #接收用户名
mim = self.get_argument('mim') #接收密码 #连接数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='cshi',charset='utf8')
# 创建游标
cursor = conn.cursor() temp = "select yhm from yhxx where yhm='%s' and mim='%s'"%(yhm,mim) #字符串拼接SQL查询语句
print(temp) # 执行SQL,并返回收影响行数
effect_row = cursor.execute(temp) shuju = cursor.fetchall() # 获取游标里的数据
print(shuju)
# 提交,不然无法保存新建或者修改的数据
# conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close() if shuju: #判断数据库存在用户
self.write('登录成功') #登录成功
else: #数据库不存在用户
self.write('登录失败') #登录失败 settings = { #html文件归类配置,设置一个字典
"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称
"static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称
} #路由映射
application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法
(r"/khd", khdHandler),
],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__":
#内部socket运行起来
application.listen(8002) #设置端口
tornado.ioloop.IOLoop.instance().start()

3、正常登录

#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
import pymysql #导入数据库模块 class khdHandler(tornado.web.RequestHandler):
def get(self):
self.render("khd.html")
def post(self):
yhm = self.get_argument('yhm') #接收用户名
mim = self.get_argument('mim') #接收密码 #连接数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='cshi',charset='utf8')
# 创建游标
cursor = conn.cursor() temp = "select yhm from yhxx where yhm='%s' and mim='%s'"%(yhm,mim) #字符串拼接SQL查询语句
print(temp) # 执行SQL,并返回收影响行数
effect_row = cursor.execute(temp) shuju = cursor.fetchall() # 获取游标里的数据
print(shuju)
# 提交,不然无法保存新建或者修改的数据
# conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close() if shuju: #判断数据库存在用户
self.write('登录成功') #登录成功
else: #数据库不存在用户
self.write('登录失败') #登录失败 settings = { #html文件归类配置,设置一个字典
"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称
"static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称
} #路由映射
application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法
(r"/khd", khdHandler),
],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__":
#内部socket运行起来
application.listen(8002) #设置端口
tornado.ioloop.IOLoop.instance().start()

实际SQL查询语句

select yhm from yhxx where yhm='张三' and mim=''

数据库返回

(('张三',),)    返回了元祖类型的数据库查到的数据

SQL注入绕开密码

实际SQL查询语句

select yhm from yhxx where yhm='张三' -- j' and mim='789'

可以看到实际用户密码已经被注释了,也就不起作用了,只要用户名存在就可以登录,对于密码已经失效

SQL注入绕开用户名和密码

实际SQL查询语句

-- 查询yhxx表的yhm字典等于张飞,或者 1 = 1,即使yhm字段没有张飞,也能查询到所有数据
select yhm from yhxx where yhm='张飞' or 1 = 1 -- d' and mim='789'

可以看到实际SQL查询语句,已经绕开了用户名和密码,直接获取了全部数据

pymysql模块防止SQL注入

pymysql模块的execute()方法,的参数2 字符串占位符变量,在参数2格式化SQL语句字符串,会自动调用pymysql模块里的mogrify()方法,将第二个参数的字符串里含有'号转化成\号,这样就防止了SQL注入

#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
import pymysql #导入数据库模块 class khdHandler(tornado.web.RequestHandler):
def get(self):
self.render("khd.html")
def post(self):
yhm = self.get_argument('yhm') #接收用户名
mim = self.get_argument('mim') #接收密码 #连接数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='cshi',charset='utf8')
# 创建游标
cursor = conn.cursor() #查看execute()方法调用的mogrify()方法,将接收到的数据,会把有'转换成\
quer = cursor.mogrify("select yhm from yhxx where yhm=%s and mim=%s",(yhm,mim))
print(quer) # 执行SQL,并返回收影响行数
effect_row = cursor.execute("select yhm from yhxx where yhm=%s and mim=%s",(yhm,mim))

shuju = cursor.fetchall() # 获取游标里的数据
print(shuju)
# 提交,不然无法保存新建或者修改的数据
# conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close() if shuju: #判断数据库存在用户
self.write('登录成功') #登录成功
else: #数据库不存在用户
self.write('登录失败') #登录失败 settings = { #html文件归类配置,设置一个字典
"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称
"static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称
} #路由映射
application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法
(r"/khd", khdHandler),
],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__":
#内部socket运行起来
application.listen(8002) #设置端口
tornado.ioloop.IOLoop.instance().start()

被mogrify()方法,转换后的实际SQL语句

select yhm from yhxx where yhm='张飞\' or 1 = 1 -- d' and mim='123456'

可以看到用户输入的'已经被转换成了\了,这样就防止了SQL注入

第二百八十一节,MySQL数据库-SQL注入和pymysql模块防止SQL注入的更多相关文章

  1. 第二百八十二节,MySQL数据库-MySQL视图

    MySQL数据库-MySQL视图 1.视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 2.也 ...

  2. 第三百八十一节,Django+Xadmin打造上线标准的在线教育平台—xadmin全局配置

    第三百八十一节,Django+Xadmin打造上线标准的在线教育平台—xadmin全局配置 1.xadmin主题设置 要使用xadmin主题,需要在一个app下的adminx.py后台注册文件里,写一 ...

  3. 第二百八十七节,MySQL数据库-条件语句、循环语句、动态执行SQL语句

    MySQL数据库-条件语句.循环语句.动态执行SQL语句 1.if条件语句 delimiter \\ CREATE PROCEDURE proc_if () BEGIN ; THEN ; ELSEIF ...

  4. 第二百八十节,MySQL数据库-外键链表之一对多,多对多

    MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...

  5. SQL语句,pymysql模块,sql注入问题

    一.完整版SQL语句的查询 select distinct post,avg(salary) from table where id > 1 group by post` having avg( ...

  6. 第一百八十一节,jQuery-UI,知问前端--自动补全 UI--邮箱自动补全

    jQuery-UI,知问前端--自动补全 UI--邮箱自动补全 学习要点: 1.调用 autocomplete()方法 2.修改 autocomplete()样式 3.autocomplete()方法 ...

  7. 第二百七十一节,Tornado框架-CSRF防止跨站post请求伪造

    Tornado框架-CSRF防止跨站post请求伪造 CSRF是什么 CSRF是用来在post请求时做请求验证的,防止跨站post请求伪造 当用户访问一个表单页面时,会自动在表单添加一个隐藏的inpu ...

  8. 第二百六十一节,Tornado框架模板引擎本质

    Tornado框架模板引擎本质 只需要了解一下即可 本篇就来详细的剖析模板处理的整个过程. 上图是返回给用户一个html文件的整个流程,较之前的Demo多了绿色流线的步骤,其实就是把[self.wri ...

  9. 第二百三十一节,Bootstrap 介绍

    Bootstrap 介绍 学习要点: 1.Bootstrap 概述 2.Bootstrap 特点 3.Bootstrap 结构 4.创建第一个页面 5.学习的各项准备 本节课我们主要了解一下 Boos ...

随机推荐

  1. 虚拟机chrome os 没有可用网络错误

    从http://chromeos.hexxeh.net/ 下载了一个chrome os的VM版本的,在VM9上打开运行,一直提示没有可用网络 解决方案 查看虚拟机的网络设置设置为 NAT方式 查看主机 ...

  2. es5 - array - unshift

    /** * 描述:该unshift()方法从数组中添加单个或多个元素,并且返回长度 * 语法:arr.unshift(element1 [,... [,elementN ]]) * 参数:要添加到数组 ...

  3. UNIX网络编程读书笔记:图解TCP端口号和并发服务器

               图1 TCP服务器在端口21上执行被动打开                                                          图2 客户对服务器的 ...

  4. python发送邮件实例1

    文件形式的邮件 #!/usr/bin/env python3 #coding: utf-8 import smtplib from email.mime.text import MIMEText fr ...

  5. TP框架中ajax post请求时提示404

    ajax post请求时提示404错误 TP框架中ajax post请求时提示404 找了半天是 控制器中方法有错误! 下次再遇到去控制器方法中找一步一步找,肯定能找到,我是单词拼错了!

  6. jedis使用线程池封装redis基本操作

    redisclient jedis 经常使用的 操作 key value hash list set zset 的基本操作 package cn.zto.util; import java.util. ...

  7. 31、Arrays数组排序(续)——自定义排序

    自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让 ...

  8. Cookie的介绍

    Cookie是某些站点为了辨别用户身份而存在用户本地终端上的数据.Cookie总是保存在client中,可分为内存 Cookie和硬盘Cookie,而依照时间划分.又能够分为非持久Cookie和持久C ...

  9. Ant—怎样Windows操作系统中搭建Apache Ant环境

    介绍一下怎样在Windows操作系统中搭建Apache Ant环境: 一.下载Apache Ant压缩文件:http://download.csdn.net/detail/wangshuxuncom/ ...

  10. IO多路复用之poll

    1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...