有一段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,取值还不一样。
请解释一下,谢谢
目测是 ASP.NET MVC 技术栈,用的
AntiForgeryToken()
来防止 CSRF 的。本来就是俩字段,一个由
AntiforgeryOptions.FormFieldName
决定,一个由AntiforgeryOptions.Cookie
决定。只是恰好它们的默认值都是__RequestVerificationToken
而已,而你爬的这个网站开发者又没有修改过这个参数。具体原理不展开了,自己读 MSDN 吧: