Django CSRF跨站请求伪造防护过程解析

作者:Tanglaoer 时间:2021-04-15 03:00:50 

前言

CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF。

攻击原理

1、用户访问正常的网站A,浏览器就会保存网站A的cookies。

2、用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数。

3、恶意网站B的自动化请求,执行就是在用户A的同一个浏览器上,因此在访问网站A的时候,浏览器会自动带上网站A的cookies。

4、所以网站A在接收到请求之后,可判断当前用户登录状态,所以根据用户的权限做具体的操作逻辑。

防范措施

1、在指定表单或者请求头的里面添加一个随机值做为参数。

2、在响应的cookie里面也设置该随机值。

3、用户正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面的随机值,那么服务器下次接受到请求之后就可以取出两个值进行校验。

4、对于网站B来说网站B在提交表单的时候不知道该随机值是什么,所以就形成不了攻击。

Django中CSRF中间件

django在创建项目的时候,默认就会有添加中间进行CSRF的保护,在MIDDLEWARE可以看到加载了 django.middleware.csrf.CsrfViewMiddleware 的中间件,这里是全局设置,也可以局部设置。

全局保护:直接启用中间件就可以了。

局部保护: from django.views.decorators.csrf import csrf_exempt,csrf_protect ,使用装饰器进行验证。

csrf_protect :为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件;

csrf_exempt :取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

验证

在POST请求提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会返回403没有权限访问。

表单验证

在form表单里面需要添加{%csrf_token%},Django会自动渲染隐藏的input输入框:


<input type="hidden" name="csrfmiddlewaretoken" value="2Sb0DQwDVgOQ8i3n1BaG1MUPLEYr6ZGaCLYa14maOQM0Ami5ddQOR6hfXuD2mrmA">

在表单提交的时候,中间件会验证csrfmiddlewaretoken。

通过ajax提交

通过cookies获取到csrftoken,


function getCookie(name) {
 var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
 return r ? r[1] : undefined;
}
$.ajax({
 url:"/api/v1.0/orders",
 type:"POST",
 data: JSON.stringify(data),
 contentType: "application/json",
 dataType: "json",
 headers:{
   "X-CSRFtoken":getCookie("csrf_token"),
 },

局部禁用或者启用

1、如果是函数视图,可以直接在函数加上装饰器即可:


from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def login(request):
 if request.method == 'GET':
   return render(request,'login.html')
 else:
   return HttpResponse('ok')

2、如果是类视图,需要使用方法装饰器进行封装


from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views.generic import TemplateView

@method_decorator(csrf_exempt)
class LoginView(TemplateView):
 template_name = 'login.html'
 def post():
   return HttpResponse('ok')

3、直接装饰as_view()方式,在URLconf里面设置。


from django.views.decorators.csrf import csrf_exempt,csrf_protect
urlpatterns = [
 path('login/', csrf_exempt(LoginView.as_view()),name="login"),
]

来源:https://www.cnblogs.com/tangkaishou/p/10284001.html

标签:django,csrf,跨站,请求,伪造防护
0
投稿

猜你喜欢

  • IE在DOM操作有表单控件时的bug

    2008-08-21 13:00:00
  • ASP 根据用户权限判断显示的列标题

    2011-03-29 11:01:00
  • 浅谈Golang Slice切片如何扩容的实现

    2024-04-29 13:06:28
  • 能让Python提速超40倍的神器Cython详解

    2023-11-12 07:11:11
  • Python利用Scrapy框架爬取豆瓣电影示例

    2022-04-30 15:16:17
  • python自然语言处理之字典树知识总结

    2023-12-29 01:01:21
  • MySQL数据库的双向加密方式

    2009-11-18 11:07:00
  • python交互模式下输入换行/输入多行命令的方法

    2022-06-08 07:18:37
  • 对Python中plt的画图函数详解

    2023-08-16 08:49:07
  • Python入门教程(七)Python数字类型

    2022-05-29 22:40:00
  • Python CNN卷积神经网络实战教程深入讲解

    2023-09-28 19:51:12
  • 下拉列表两级连动的新方法(二)

    2009-06-04 18:22:00
  • tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法

    2021-08-11 11:43:55
  • Windows下MySQL日志基本的查看以及导入导出用法教程

    2024-01-22 13:11:20
  • Pytorch中的gather使用方法

    2021-11-22 06:11:49
  • GO语言实现简单的目录复制功能

    2024-04-26 17:21:39
  • Python 浪漫烟花实现代码全解

    2023-11-16 01:24:56
  • MYSQL实现连续签到功能断签一天从头开始(sql语句)

    2024-01-22 16:35:11
  • Python3.5 Pandas模块之DataFrame用法实例分析

    2022-12-22 20:45:16
  • Appium自动化测试中获取Toast信息操作

    2022-05-12 07:10:48
  • asp之家 网络编程 m.aspxhome.com