视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
django如何避免sql注入
2020-11-27 14:11:02 责编:小采
文档
 什么是SQL注入?

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

比如现在数据库中有一个front_user表,表结构如下:

class User(models.Model): telephone = models.CharField(max_length=11) username = models.CharField(max_length=100)
 password = models.CharField(max_length=100)

然后我们使用原生sql语句实现以下需求:

1. 实现一个根据用户id获取用户详情的视图。示例代码如下:

def index(request): user_id = request.GET.get('user_id') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where id=%s' % user_id) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

这样表面上看起来没有问题。但是如果用户传的user_id是等于1 or 1=1,那么以上拼接后的sql语句为:

select id,username from front_user where id=1 or 1=1

以上sql语句的条件是id=1 or 1=1,只要id=1或者是1=1两个有一个成立,那么整个条件就成立。毫无疑问1=1

是肯定成立的。因此执行完以上sql语句后,会将front_user表中所有的数据都提取出来。

2. 实现一个根据用户的username提取用户的视图。示例代码如下:

def index(request): username = request.GET.get('username') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where username='%s'' % username) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

这样表面上看起来也没有问题。但是如果用户传的username是zhiliao' or '1=1,那么以上拼接后的sql语句为:

select id,username from front_user where username='zhiliao' or '1=1'

以上sql语句的条件是username='zhiliao'或者是一个字符串,毫无疑问,字符串的判断是肯定成立的。因此会将front_user表中所有的数据都提取出来。

sql注入防御,归类起来主要有以下几点:

以上便是sql注入的原理。他通过传递一些恶意的参数来破坏原有的sql语句以便达到自己的目的。当然sql注入远远没有这么简单,我们现在讲到的只是冰山一角。那么如何防御sql注入呢?

1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或长度;对单引号和 双'-'进行转换等。

2. 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。比如:

def index(request): user_id = '1 or 1=1' cursor = connection.cursor() cursor.execute('select id,username from 
front_user where id=%s',(user_id,)) rows = cursor.fetchall() for row in rows: print(row) return HttpResponse('success')

3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

总结:

1. 在网页中利用sql语句进行注入攻击,网页获取用户输入参数,但有些恶意用户利用特殊sql语句上传参数,后端获取参数若不对其正确性合法性进行判断,则有可能对数据库造成危害

2. get和post上传数据的时候,做好对参数的检查

3. 利用Dajngo的ORM可有效避免sql注入,因为Django已经对特殊字符进行转义

下载本文
显示全文
专题