Python如何防止sql注入
前言
web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻击问题。那么在Python web开发的过程中sql注入是怎么出现的呢,又是怎么去解决这个问题的?
当然,我这里并不想讨论其他语言是如何避免sql注入的,网上关于PHP防注入的各种方法都有,Python的方法其实类似,这里我就举例来说说。
起因
漏洞产生的原因最常见的就是字符串拼接了,当然,sql注入并不只是拼接一种情况,还有像宽字节注入,特殊字符转义等等很多种,这里就说说最常见的字符串拼接,这也是初级程序员最容易犯的错误。
首先咱们定义一个类来处理mysql的操作
class Database:hostname = '127.0.0.1'user = 'root'password = 'root'db = 'pythontab'charset = 'utf8'def __init__(self):self.connection = MySQLdb.connect(self.hostname, self.user, self.password, self.db, charset=self.charset)self.cursor = self.connection.cursor()def insert(self, query):try:self.cursor.execute(query)self.connection.commit()except Exception, e:print eself.connection.rollback()def query(self, query):cursor = self.connection.cursor(MySQLdb.cursors.DictCursor)cursor.execute(query)return cursor.fetchall()def __del__(self):self.connection.close()
这个类有问题吗?
答案是:有!
这个类是有缺陷的,很容易造成sql注入,下面就说说为何会产生sql注入。
为了验证问题的真实性,这里就写一个方法来调用上面的那个类里面的方法,如果出现错误会直接抛出异常。
def test_query(testUrl):mysql = Database()try:querySql = "SELECT * FROM `article` WHERE url='" + testUrl + "'"chanels = mysql.query(querySql)return chanelsexcept Exception, e:print e
这个方法非常简单,一个最常见的select查询语句,也使用了最简单的字符串拼接组成sql语句,很明显传入的参数 testUrl 可控,要想进行注入测试,只需要在testUrl的值后面加上单引号即可进行sql注入测试,这个不多说,肯定是存在注入漏洞的,脚本跑一遍,看啥结果
(1064, “You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘t.tips’’’ at line 1”)
回显报错,很眼熟的错误,这里我传入的测试参数是
t.tips’
下面再说一种导致注入的情况,对上面的方法进行稍微修改后
def test_query(testUrl):mysql = Database()try:querySql = ("SELECT * FROM `article` WHERE url='%s'" % testUrl)chanels = mysql.query(querySql)return chanelsexcept Exception, e:print e
这个方法里面没有直接使用字符串拼接,而是使用了 %s 来代替要传入的参数,看起来是不是非常像预编译的sql?那这种写法能不能防止sql注入呢?测试一下便知道,回显如下
(1064, “You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘t.tips’’’ at line 1”)
和上面的测试结果一样,所以这种方法也是不行的,而且这种方法并不是预编译sql语句,那么怎么做才能防止sql注入呢?
解决
两种方案
1> 对传入的参数进行编码转义
2> 使用Python的MySQLdb模块自带的方法
第一种方案其实在很多PHP的防注入方法里面都有,对特殊字符进行转义或者过滤。
第二种方案就是使用内部方法,类似于PHP里面的PDO,这里对上面的数据库类进行简单的修改即可。
修改后的代码
class Database:hostname = '127.0.0.1'user = 'root'password = 'root'db = 'pythontab'charset = 'utf8'def __init__(self):self.connection = MySQLdb.connect(self.hostname, self.user, self.password, self.db, charset=self.charset)self.cursor = self.connection.cursor()def insert(self, query, params):try:self.cursor.execute(query, params)self.connection.commit()except Exception, e:print eself.connection.rollback()def query(self, query, params):cursor = self.connection.cursor(MySQLdb.cursors.DictCursor)cursor.execute(query, params)return cursor.fetchall()def __del__(self):self.connection.close()
这里 execute 执行的时候传入两个参数,第一个是参数化的sql语句,第二个是对应的实际的参数值,函数内部会对传入的参数值进行相应的处理防止sql注入,实际使用的方法如下
preUpdateSql = “UPDATE article
SET title=%s,date=%s,mainbody=%s WHERE id=%s”
mysql.insert(preUpdateSql, [title, date, content, aid])
这样就可以防止sql注入,传入一个列表之后,MySQLdb模块内部会将列表序列化成一个元组,然后进行escape操作。
Python如何防止sql注入相关推荐
- Sqlmap速查表/功能移植/Python批量检测SQL注入
title: Sqlmap速查表与Python进行功能移植 copyright: true top: 0 date: 2021-02-27 11:59:00 tags: [扫描注入,注入,sqlmap ...
- python 打造一个sql注入脚本 (一)
0x00前言: 昨天刚刚看完小迪老师的sql注入篇的第一章 所以有了新的笔记. 0x01笔记: sql注入原理: 网站数据传输中,接受变量传递的值未进行过滤,导致直接带入数据库查询执行的操作. sql ...
- 逆袭之路——python 操作数据库、SQL注入问题、索引与慢查询优化【day49】
今日内容概要 python操作MySQL SQL注入问题 修改表SQL语句补充 视图.触发器.存储过程 事务 流程控制.函数 索引与慢查询优化 今日内容详细 一.python操作MySQL pytho ...
- python sql注入如何防止_Python如何防止sql注入
Python如何防止sql注入.web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻击问题. 那么在Python web开发的过程中sql ...
- java持久层框架mybatis如何防止sql注入
2019独角兽企业重金招聘Python工程师标准>>> sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or ...
- 126disk网盘sql注入漏洞
2019独角兽企业重金招聘Python工程师标准>>> sql注入点有很多,有用户登录注入,如万能密码 admin' or 1=1-- :还有Web程序中的一些交互注入,如查询之类. ...
- python防止源码泄露_Pyhton中防止SQL注入的方法
c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHER ...
- python mysql倒序_day40:MySQL:python操作mysql:pymysql模块SQL注入攻击
目录 part1:用python连接mysql 1.用python连接mysql的基本语法 创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标 ...
- python编写sql注入工具-利用Python实现SQL注入 - Python黑客编程入门系列 - 8
{getUnitName} {getLessonName} 敬请期待 免费 {getTaskName} 剩余观看时长:{watchLimitRemaining} 回放 {activityStartTi ...
最新文章
- 终于!有本书把我从“看完就忘、死记硬背”的学习困境中拯救出来了!
- android studio修改项目包名
- 第二次作业(个人项目实践)
- Linux内核中工作队列的使用work_struct,delayed_work
- idea conf文件_JavaWe商品项目保姆级解析IDEA版(配置篇)
- jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?
- Mybatis框架(待完善)
- 求递归算法时间复杂度:递归树
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
- Mac技巧,更改Mac桌面图片
- tableau free public免费版
- 即时通信聊天工具的原理与设计
- Dosbox安装Windows 95图文教学
- 智能卡APDU的命令及其解析
- 在线编辑Word——插入图片、图形
- ARM汇编 BIC和ORR指令
- fits文件读取代码
- 【转】凡事事必躬亲 是一种恶习
- PNN模型理论和实践
- 普通代码块和构造代码块
热门文章
- java基本语法——常量、变量、数据类型
- IntelliJ IDEA14 配置 SVN
- git 忽略文件 .gitignore 以及规则
- [ZJOI2010]数字计数
- POJ-1845 Sumdiv 逆元,特殊情况
- ADO.NET Entity Framework 深入分析, Part 5
- java如何保证mq一定被消费_消费端如何保证消息队列MQ的有序消费
- Java:数列排序 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
- 按钮的android程序闪退,Android实例化控件有什么特殊要求吗??怎么程序加了这一段之后就闪退。。...
- Docker入坑指南之RUN