gpt4 book ai didi

c# - 所需的防伪 cookie "__RequestVerificationToken"不存在

转载 作者:IT王子 更新时间:2023-10-29 04:26:38 32 4
gpt4 key购买 nike

我的网站每天大约出现 20 次此异常,通常表单工作正常,但有时会出现此问题,我不知道为什么如此随机。

这是 elmah 记录的异常

500 HttpAntiForgery The required anti-forgery cookie __RequestVerificationToken" is not present.

但是它发送 token 的形式如 elmah 的 XML 日志所示

<form>
<item name="__RequestVerificationToken">
<value string="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41"/>
</item>
<item name="toPhone">
<value string="XXXXXX"/>
</item>
<item name="smsMessage">
<value string="xxxxxxxx"/>
</item>
</form>

这是我在 Controller 上使用数据属性检查 token 是否有效的方法

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<JsonResult> Send(SMSModel model)
{
// my code goes here
}

这是我在 View 上的表单

@using (Html.BeginForm("Send", "SMS", FormMethod.Post, new { @class = "form-sms", autocomplete = "off" }))
{
@Html.AntiForgeryToken()
<div class="row">
<div class="col-md-12">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">+53</div>
@Html.TextBoxFor(m => m.toPhone, new { @class = "form-control", placeholder = "teléfono", required = "required", type = "tel", maxlength = 8 })
</div>
</div>
</div>
</div>
<div class="form-group" style="position:relative">
<label class="sr-only" for="exampleInputEmail3">Message (up to 135 characters)</label>
@Html.TextAreaFor(m => m.smsMessage, new { rows = 4, @class = "form-control", placeholder = "escriba aquí su mensaje", required = "required", maxlength = "135" })
<span class="char-count">135</span>
</div>
if (ViewBag.Sent == true)
{
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<strong>Su mensaje ha sido enviado <span class="hidden-xs">satisfactoriamente</span></strong>
</div>
}
if (ViewBag.Error == true)
{
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<strong>Error:</strong> Por favor revise el número de teléfono.
</div>
}
<div class="errorToMany"></div>
<button type="submit" class="btn btn-default btn-block">Enviar SMS</button>
}

这就是我使用 AJAX 发布数据的方式

$('form.form-sms').submit(function (event) {
$.ajax({
url: $(this).attr("action"),
type: "POST",
data: $(this).serializeArray(),
beforeSend: function (xhr) {
$('.btn-default').attr("disabled", true);
$('.btn-default').html("Enviando...")
},
success: function (data, textStatus, jqXHR) {
if (data[0] == false && data[1] == "1") {
some code
} else {
location.reload();
}
},
error: function (jqXHR, textStatus, errorThrown) { }
});
return false;
});

该表单大部分时间都运行良好,但此错误不断发生,我不知道为什么,我已经检查了 Stack Overflow 上的其他问题,但对我没有任何作用。

有关我如何发布数据的进一步说明。

这个发送 SMS 的表单有 ToNumber 和 Message 字段。当用户单击提交按钮时,AJAX 函数将控制并发布它序列化表单的字段数据,当我在 Controller 中的函数完成并返回表明一切顺利的 JSON 结果时,AJAX 方法重新加载页面显示用户成功消息。

任何可能导致此问题的想法。

最佳答案

听起来好像一切都在按预期进行。

防伪助手 @Html.AntiForgeryToken() 的工作方式是在页面中注入(inject)一个名为 __RequestVerificationToken 的隐藏表单字段,并且它还在浏览器。

当表单被回发时,将两者进行比较,如果它们不匹配或 cookie 丢失,则会抛出错误。

因此,Elmah 记录表单正在发送 __RequestVerificationToken 并不重要。它总是会的,即使在 CSRF 攻击的情况下,因为这只是隐藏的表单字段。

<input name="__RequestVerificationToken" type="hidden" value="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41" />

另一方面,错误消息说相应的 COOKIE 没有被发送:

500 HttpAntiForgery The required anti-forgery cookie __RequestVerificationToken" is not present.

所以基本上某人/某事正在重播表单帖子而没有发出获取 cookie 的原始请求。因此他们有隐藏的表单字段__RequestVerificationToken 但不是验证它的 cookie。

看来一切都在按预期进行。检查您的日志:IP 号码和引荐来源网址等。您可能受到攻击,或者在重定向表单内容时可能正在做一些奇怪或错误的事情。如上所述,referrers 是此类错误的良好起点,前提是这没有被欺骗。

另请注意,根据 MDN

location.reload();

The Location.reload() method reloads the resource from the current URL. Its optional unique parameter is a Boolean, which, when it is true, causes the page to always be reloaded from the server. If it is false or not specified, the browser may reload the page from its cache.

如果是,有时从缓存加载,那么您可能会得到一个具有旧页面 token 但没有 cookie 的 POST

所以尝试:

location.reload(true);

关于c# - 所需的防伪 cookie "__RequestVerificationToken"不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33306859/

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