前言

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注入相关推荐

  1. Sqlmap速查表/功能移植/Python批量检测SQL注入

    title: Sqlmap速查表与Python进行功能移植 copyright: true top: 0 date: 2021-02-27 11:59:00 tags: [扫描注入,注入,sqlmap ...

  2. python 打造一个sql注入脚本 (一)

    0x00前言: 昨天刚刚看完小迪老师的sql注入篇的第一章 所以有了新的笔记. 0x01笔记: sql注入原理: 网站数据传输中,接受变量传递的值未进行过滤,导致直接带入数据库查询执行的操作. sql ...

  3. 逆袭之路——python 操作数据库、SQL注入问题、索引与慢查询优化【day49】

    今日内容概要 python操作MySQL SQL注入问题 修改表SQL语句补充 视图.触发器.存储过程 事务 流程控制.函数 索引与慢查询优化 今日内容详细 一.python操作MySQL pytho ...

  4. python sql注入如何防止_Python如何防止sql注入

    Python如何防止sql注入.web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻击问题. 那么在Python web开发的过程中sql ...

  5. java持久层框架mybatis如何防止sql注入

    2019独角兽企业重金招聘Python工程师标准>>> sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or ...

  6. 126disk网盘sql注入漏洞

    2019独角兽企业重金招聘Python工程师标准>>> sql注入点有很多,有用户登录注入,如万能密码 admin' or 1=1-- :还有Web程序中的一些交互注入,如查询之类. ...

  7. python防止源码泄露_Pyhton中防止SQL注入的方法

    c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHER ...

  8. python mysql倒序_day40:MySQL:python操作mysql:pymysql模块SQL注入攻击

    目录 part1:用python连接mysql 1.用python连接mysql的基本语法 创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标 ...

  9. python编写sql注入工具-利用Python实现SQL注入 - Python黑客编程入门系列 - 8

    {getUnitName} {getLessonName} 敬请期待 免费 {getTaskName} 剩余观看时长:{watchLimitRemaining} 回放 {activityStartTi ...

最新文章

  1. 终于!有本书把我从“看完就忘、死记硬背”的学习困境中拯救出来了!
  2. android studio修改项目包名
  3. 第二次作业(个人项目实践)
  4. Linux内核中工作队列的使用work_struct,delayed_work
  5. idea conf文件_JavaWe商品项目保姆级解析IDEA版(配置篇)
  6. jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?
  7. Mybatis框架(待完善)
  8. 求递归算法时间复杂度:递归树
  9. 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
  10. Mac技巧,更改Mac桌面图片
  11. tableau free public免费版
  12. 即时通信聊天工具的原理与设计
  13. Dosbox安装Windows 95图文教学
  14. 智能卡APDU的命令及其解析
  15. 在线编辑Word——插入图片、图形
  16. ARM汇编 BIC和ORR指令
  17. fits文件读取代码
  18. 【转】凡事事必躬亲 是一种恶习
  19. PNN模型理论和实践
  20. 普通代码块和构造代码块

热门文章

  1. java基本语法——常量、变量、数据类型
  2. IntelliJ IDEA14 配置 SVN
  3. git 忽略文件 .gitignore 以及规则
  4. [ZJOI2010]数字计数
  5. POJ-1845 Sumdiv 逆元,特殊情况
  6. ADO.NET Entity Framework 深入分析, Part 5
  7. java如何保证mq一定被消费_消费端如何保证消息队列MQ的有序消费
  8. Java:数列排序 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
  9. 按钮的android程序闪退,Android实例化控件有什么特殊要求吗??怎么程序加了这一段之后就闪退。。...
  10. Docker入坑指南之RUN