使用Python requests向ASP.NET站点POST请求返回原页面如何排查
排查思路
1. 校验请求头差异
- 对比浏览器F12网络面板中对应POST请求的全部请求头,和requests发送的请求头,优先补全
User-Agent、Accept、Accept-Language、Referer、Origin这几个ASP.NET站点常用校验的字段,注意ASP.NET会校验Referer是否属于同站可信来源,缺失或者不符大概率会直接返回原页面 - 重点检查
X-Requested-With字段,部分ASP.NET站点会判断是否为AJAX请求,如果浏览器请求带这个头而requests没带,会返回异常 - 确认是否遗漏了
Content-Type字段,POST提交表单要对应设置为application/x-www-form-urlencoded,提交JSON的话要设置为application/json,和浏览器请求保持完全一致
2. 校验表单参数完整性
- ASP.NET站点通常会带
__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION这几个动态隐藏参数,每次访问原页面都会生成新的值,提交POST的时候必须带上当前页面返回的最新值,不能硬编码或者用之前缓存的旧值 - 检查是否遗漏了站点自定义的动态参数,比如隐藏的token字段、用户身份相关的标识参数,所有参数名和值都要和浏览器提交的完全对齐,参数顺序部分场景下也会影响校验结果
- 如果提交的是表单文件,要确保
multipart/form-data的分隔符、字段顺序和浏览器完全一致
3. 校验身份凭证有效性
- 确认requests的会话
Session()对象是否正确携带了所有Cookie,包括登录后的身份Cookie、ASP.NET生成的ASP.NET_SessionId、防CSRF的__RequestVerificationTokenCookie,Cookie的域、路径、有效期都要和浏览器的匹配 - 部分ASP.NET站点会把身份凭证放在Cookie之外的地方,比如请求头的
Authorization字段,要确认是否和浏览器请求保持一致
4. 校验站点特殊逻辑处理
- 确认是否开启了requests的自动重定向,你提到不是标准重定向,有可能是前端JS跳转,响应内容里会包含跳转的JS代码,你可以打印响应的全文本搜索
location.href、window.open这类关键词确认,requests不会自动执行JS,需要你手动提取跳转链接访问 - 部分ASP.NET站点会做请求频率、IP地址的校验,可以尝试加和浏览器一致的请求间隔,或者更换和测试浏览器相同的出口IP再测试
- 检查是否存在服务端的会话状态绑定,比如同一个会话只能在一个客户端发起请求,测试的时候不要同时用浏览器和requests登录同一个账号,避免会话被踢下线
内容的提问来源于stack exchange,提问作者nparham
相关产品推荐
相关产品推荐

