gpt4 book ai didi

jquery - Django + jQuery : Why CSRF verification fails on multiple simultaneous requests

转载 作者:行者123 更新时间:2023-12-01 00:32:13 26 4
gpt4 key购买 nike

我遇到了以下情况(使用 Django1.4 和 jQuery 1.7.1),我想了解一下:我通过 jQuery“ajax”函数提交表单,在此请求完成之前,我单击另一个提交相同表单但使用 jQuery“提交”函数的元素。我得到的响应 - 403,CSRF 验证失败。当然,现在为了防止此错误,只需禁用多个同时提交(它们本身就可以正常工作),但这无助于理解特定错误的来源。

谁能解释一下这个吗? csrf token 在每个 session 中生成一次,因此它不会与后一个请求存在某种 csrf 不匹配。这与 jQuery 处理请求的方式有关吗?

最佳答案

我认为你的代码有问题。只需阅读 django 代码

<小时/>

在此 block 中捕获错误。

if not constant_time_compare(request_csrf_token, csrf_token):
logger.warning('Forbidden (%s): %s',
REASON_BAD_TOKEN, request.path,
extra={
'status_code': 403,
'request': request,
}
)
return self._reject(request, REASON_BAD_TOKEN)

所以你前端脚本发送的csrf_token和cookie(发送浏览器)不相等

<小时/>

接下来的代码工作

tpl

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>

<a href="javascript:" class="req1">req1</a>
<a href="javascript:" class="req2">req2</a>
<br>

<form id="foo" action="" method="POST">{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){

$('.req2').click(function(){
var form1 = $.post( '', $('#foo').serialize(), function(data){console.log(data)} );
})

$('.req1').click(function(){
var form1 = $.post( '', $('#foo').serialize(), function(data){console.log(data)} );
})
})
</script>
</body>
</html>

查看

from django import forms
from django.http import HttpResponse

from django.shortcuts import render
from django.views.decorators.csrf import csrf_protect


class TestForm(forms.Form):
test_field = forms.CharField()


@csrf_protect
def home(request):
if request.method == 'POST':
form = TestForm(request.POST)
if form.is_valid():
return HttpResponse('all ok')
else: form = TestForm()

return render(request,
'page.html',
{
'form': form,
},
)

关于jquery - Django + jQuery : Why CSRF verification fails on multiple simultaneous requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11542059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com