1.5.x 非网页发送的 form 如何通过 csrf 验证?

2014-02-21 12:41:10 +08:00
 magine
Use of the CsrfResponseMiddleware is not recommended because of the performance hit it imposes, and because of a potential security problem (see below). It can be used as an interim measure until applications have been updated to use the csrf_token tag. It is deprecated and will be removed in Django 1.4.

jango在1.4以后的版本移除了'django.middleware.csrf.CsrfResponseMiddleware' 也就是说必须要在模板的form中加入{% csrf_token %} 。

那么请问如果这个form是从非网页post过来的(例如移动设备登陆时post用户名和密码)该怎么办?
4112 次点击
所在节点    Django
10 条回复
Archangel_SDY
2014-02-21 13:16:32 +08:00
要么你先下发一个token给客户端,要么你就干脆禁掉这个View的CSRF:
https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt
tamamaxox
2014-02-21 13:23:25 +08:00
求解,Ajax需要csrf吗
Shieffan
2014-02-21 13:26:26 +08:00
@tamamaxox 不需要吧。
tamamaxox
2014-02-21 13:30:17 +08:00
@Shieffan 那不会被跨域吗
Shieffan
2014-02-21 13:33:40 +08:00
@tamamaxox 怎么跨域,你服务器没配置CORS的情况下,哪个能在其它网站上向你的站发起ajax请求
magine
2014-02-21 16:25:19 +08:00
@Archangel_SDY 额……在stackoverflow上找到的文档页面和你一样,太感谢了。
zhwei
2014-02-21 16:32:29 +08:00
magine
2014-02-21 16:40:50 +08:00
@Archangel_SDY
setting.py的MIDDLEWARE_CLASSES中加上
django.middleware.csrf.CsrfViewMiddleware

view.py中对应的视图函数前加装饰器 @csrf_exempt
otakustay
2014-02-21 21:01:41 +08:00
CSRF和ajax有必然联系吗,都说了是Request Forgery,请求肯定是伪造的,要伪造就不一定是通过AJAX这么单纯的一个手段了,什么浏览器的沙箱都挡不了
ericls
2014-02-22 01:23:38 +08:00
刚刚我也在弄这个
对于ajax(jquery)
需要在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);
}
}
});

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/101203

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX