这些token如何理解?

有一段post请求数据的代码,框架如下:

import requests
payload = {
    "__RequestVerificationToken":"KTgvZfYMkeEYsQ6vXRPiqLsx_zHPxqq-W5CJaAE_FyuHJtnG2BjSTqKWq1UKbp0SbmfdEUyrDwWuUlQbXTJ8-UkHDd_CdJN-KUZJ7PUW1-41",
}
url = 'xxxxxxxxxxxxxxxx'
headers = {
    "Cookie":"ASP.NET_SessionId=l0xlhfpf44mccf22gpgn2inh; __RequestVerificationToken=kiBIZ235_pftbshMvd7XbBHTVXkRoXPB3Ipr3w7wa9oqqm1qNfQIQygGOZwmMEnT15eSO57lm3qx5xupyXLnaoJDToZP7ajijC2EKgX90S81; 
    "X-Requested-With":"XMLHttpRequest",
}
data = requests.post(url, headers=headers, data=payload,verify=False)

1.payload和headers的cookie里面都有个__RequestVerificationToken,我觉得headers里面的cookie有这个值就可以了,实际情况是两者都一个不能少(测试过,一个都不能少,否则取不到数据)。
2.两个__RequestVerificationToken,取值还不一样。

请解释一下,谢谢

阅读 3.1k
2 个回答

目测是 ASP.NET MVC 技术栈,用的 AntiForgeryToken() 来防止 CSRF 的。

本来就是俩字段,一个由 AntiforgeryOptions.FormFieldName 决定,一个由 AntiforgeryOptions.Cookie 决定。只是恰好它们的默认值都是 __RequestVerificationToken 而已,而你爬的这个网站开发者又没有修改过这个参数。

具体原理不展开了,自己读 MSDN 吧:

https://learn.microsoft.com/en-us/aspnet/core/security/anti-r...

这段代码的主要功能是向指定的 URL 发送一个 POST 请求,以获取数据。在这里,__RequestVerificationToken 和 headers 中的 Cookie 扮演了重要角色。根据您的描述,这两个值都是必须的,不能缺少。

首先,我们需要了解 __RequestVerificationToken 的作用。它通常用于防止跨站请求伪造(CSRF)攻击。服务器端会生成这个 token,并将其嵌入到 HTML 表单中。当客户端(例如 Web 浏览器)提交表单时,会将 token 作为 POST 数据发送回服务器。服务器会检查提交的 token 是否与预期的 token 匹配。如果匹配,说明请求是合法的;如果不匹配,则表明可能是 CSRF 攻击。

在这段代码中,__RequestVerificationToken 出现在两个地方:

payload 字典中:这是作为 POST 数据发送的 token。服务器会检查这个值与期望的 token 是否匹配。
headers 字典中的 Cookie:这是作为请求头的一部分发送的 token。在某些情况下,服务器可能需要检查请求头中的 token 与预期的 token 是否匹配。
虽然这两个值的名称相同,但它们的作用和用途可能不同。payload 中的 token 用于验证 POST 请求的有效性,而 headers 中的 token 可能用于验证客户端的身份(例如,确保客户端具有足够的权限访问资源)。

实际情况可能因应用程序的实现细节而有所不同。在这个例子中,服务器可能同时要求提供两个 token,以确保请求是合法的。如果缺少任何一个 token,服务器可能会拒绝处理请求,导致无法获取数据。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进