Django跨站伪造请求保护措施设置方法
来源:互联网 发布:数据接口开发 编辑:程序博客网 时间:2024/04/30 08:20
注:以下内容转载自 Django跨站伪造请求保护措施设置方法 一文,仅供学习使用。
在 Django 建站中遇到 POST 提交表单提示 403 错误,发现以 POST 方式提交表单会触发 Django 内置的 csrf 保护机制,并且在 403 页面给出了解决方法,根据提示更改后发现问题依旧,网上查阅很多同学的解决方案均不能解决这个问题,所以到官网上查阅了关于csrf部分的具体设置,最后成功解决了这个问题。
官方csrf部分设置翻译:
CSRF设置步骤:
第一步:在 settings.py 中的 MIDDLEWARE_CLASSES 部分添加'django.middleware.csrf.CsrfViewMiddleware',如果使用普通方式创建的 Django 项目,这一项一般都已经存在了不用额外设置。如果你不希望加入 csrf 的中间件,那么可以在 views 中的方法上加上 csrf_protect() 装饰器方法,这一步不是必须设置的,网上有很多人都在启用了中间件的同时也加上了 csrf_protect() 方法,导致问题依旧,官方文档上明确写到了这一步是【Alternatively】。
第二步:在 POST 表单的 template 中加入 csrf_token。这一步很简单,在模板中添加如下代码:
<form action="." method="post">{% csrf_token %}
需要注意的一点是,表单提交路径如果是外部链接则不需要添加 csrf token 。第三步:在请求处理方法中添加 context processor。
这一步有两种方式实现:
方法1:使用 RequestContext,RequestContext 始终都使用了'django.core.context_processors.csrf'。If you are using generic views or contrib apps, you are covered already, since these apps use RequestContext throughout.(这一段还没搞明白,大致意思猜想是普通views或内置的contrib下的应用时,那么已经使用了这种方式来处理 csrf 请求了,不需要额外处理了)
方法2:手动添加 csrf 处理(我使用的这一种能成功访问)。示例代码如下:
from django.core.context_processors import csrf from django.shortcuts import render_to_response def my_view(request): c = {} c.update(csrf(request)) # ... view code here return render_to_response("a_template.html", c)
在第一次按照自己的设想将如上代码加入到 view 中时,发现问题依旧,后来将前两行代码放置在方法开始位置后,成功解决问题,由此推测该示例代码的前两行只能放在第一次使用 request 对象之前。
Django 中使用 Ajax 请求的 CSRF 设置:
将官方文档上的 ajax 设置照搬下来:
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ crossDomain: false, // obviates need for sameOrigin test beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type)) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });
这里使用的是 jQuery,于是可以使用 jQuery 来正常发送 ajax 请求,如:
$(document).ready(function(){ $("#postBtn").click(function(){ $.post('/ajax/aPost/', {id:'0001'}, function(data){ alert(data); }) }); } );
GET 请求就不赘述了,同理,本文主要问题在于设置 csrf 说明,使用 Django版本为1.4.3,jQuery版本为1.8.0
- Django跨站伪造请求保护措施设置方法
- Django框架全面讲解 -- 跨站请求伪造(csrf)
- 跨站请求伪造CSRF防护方法
- 跨站请求伪造-CSRF防护方法
- 跨站请求伪造CSRF防护方法
- 跨站请求伪造CSRF防护方法
- 跨站请求伪造CSRF防护方法
- 跨站请求伪造CSRF防护方法
- 跨站请求伪造CSRF防护方法
- 跨站请求伪造CSRF防护方法
- 跨站请求伪造
- XSRF 跨站请求伪造
- CRSF 跨站请求伪造
- 跨站请求伪造CSRF
- 跨站请求伪造CSRF
- 跨站请求伪造(CSRF)
- 跨站请求伪造CSRF
- 跨站请求伪造CSRF
- Android实现输入手机号时自动添加空格
- macbook 装win 心得
- UFT工具 飞机订票系统订单 价格测试脚本
- Android Dialog的十种类型汇总
- opencv3累计概率霍夫变换-HoughLinesP函数
- Django跨站伪造请求保护措施设置方法
- 面向对象的三个特征
- opencv3实现多种重映射
- poj 1006 && hdoj 1370 Biorhythms 【CRT】
- Android lint 自动检测并删除无用资源
- opencv3实现重映射-remap函数
- 在Unity3D中加载外部图片的两种方法
- 程序员的发展之道---海贼王(山治)
- 10月16日