Django:CSRF 与 AJAX

发布于 2024-12-07 20:46:06 字数 308 浏览 0 评论 0原文

我发现问题/错误了吗?在 AJAX 中使用 CSRF。我根本不使用 {% csrf_token %} 。我只使用 AJAX 表单,因此 - 没有为 csrf 设置 cookie。在这种情况下 - 在此处输入链接描述是无用的:( 我可以使用 get_token 来生成它,但我必须将它放在我的所有网站中,所以它没有任何意义。

如何在不使用 csrf 标签的情况下制作 cookie?

I have a problem/bug found? in AJAX with CSRF. I don't use {% csrf_token %} at all. I use only AJAX forms so - there is no cookie set for csrf. In taht case - enter link description here is useless :(
I can use get_token to generate it, but I have to put it in all my sites so it has no sense.

How can I make that cookie without using csrf tag?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

坏尐絯 2024-12-14 20:46:06

任何随机 32 位字母数字字符串都将用作令牌。只需将其保存在名为“csrftoken”的 cookie 中,然后将其与您的帖子一起提交即可。

这将自动生成一个令牌或重新使用现有的令牌。它将处理页面上的所有表单提交。如果您有场外表单,您需要确保它们不会运行此代码。

<script>
$(document).on('submit', 'form[method=post]', function(){
  if(!document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')){
    for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
    document.cookie = 'csrftoken=' + c + '; path=/'
  }
  if(!this.csrfmiddlewaretoken) $(this).append('<input type="hidden" name="csrfmiddlewaretoken">')
  $(this.csrfmiddlewaretoken).val(document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')[1])
})
</script>

需要 jQuery 1.7+

Any random 32-digit alphanumeric string will work as the token. Simply save it in a cookie named "csrftoken", and then submit it with your post.

This will auto generate a token or re-use an existing one. It will handle all form submits on the page. If you have off-site forms you'll need to make sure they don't run this code.

<script>
$(document).on('submit', 'form[method=post]', function(){
  if(!document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')){
    for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
    document.cookie = 'csrftoken=' + c + '; path=/'
  }
  if(!this.csrfmiddlewaretoken) $(this).append('<input type="hidden" name="csrfmiddlewaretoken">')
  $(this.csrfmiddlewaretoken).val(document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')[1])
})
</script>

requires jQuery 1.7+

谎言 2024-12-14 20:46:06

如果您将 csrf 令牌压印到服务器端的某个 JS 变量中,那么稍后您可以发送将被 Django 识别的自定义 HTTP 标头

X-CSRFToken: {{ csrf_token }}}

,另请参阅 Q&A: Django CSRF仅在 Opera 上的 ajax post 请求失败

工作请求示例:

POST /main/uploadpage/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Content-Length: 505853
Origin: http://127.0.0.1:8000
X-File-Name: Screen Shot 2013-05-12 at 5.13.34 PM (2).png
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31
Content-Type: image/png
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
X-CSRFToken: 1kCcyDzpHIxicSzCqvuXUMbpGaXvFpCZ
Accept: */*
Referer: http://127.0.0.1:8000/main/uploadpage/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

If you imprint csrf token into some JS variable on server side, then later you can send custom HTTP header that will be recognized by Django

X-CSRFToken: {{ csrf_token }}}

also see that Q&A: Django CSRF failure on ajax post requests on Opera only

Example of working request:

POST /main/uploadpage/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Content-Length: 505853
Origin: http://127.0.0.1:8000
X-File-Name: Screen Shot 2013-05-12 at 5.13.34 PM (2).png
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31
Content-Type: image/png
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
X-CSRFToken: 1kCcyDzpHIxicSzCqvuXUMbpGaXvFpCZ
Accept: */*
Referer: http://127.0.0.1:8000/main/uploadpage/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
∞琼窗梦回ˉ 2024-12-14 20:46:06

你有考虑过禁用CSRF吗?

为此,只需删除中间件:'django.middleware.csrf.CsrfViewMiddleware',

have u consider disabling CSRF at all?

to do that just remove the middleware : 'django.middleware.csrf.CsrfViewMiddleware',

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文