Python发送POST请求携带多个同名参数实现站点登录的问题咨询
Python发送携带多个同名参数POST请求的解决方案
错误原因
你当前的写法存在核心问题:Python字典不支持重复键,你定义的字典中后面出现的p_arg_names会直接覆盖前面的取值,最终提交的POST请求里仅会保留最后一个p_arg_names参数,和BurpSuite抓包得到的真实请求结构不符,因此请求失败。
正确实现方式
使用Python的requests库发送请求时,不要用字典类型传递请求参数,改为使用元组列表格式传递,每个参数对应一个(参数名, 参数值)的元组,即可保留多个同名参数:
import requests # 按Burp抓包的参数顺序编写元组列表 post_data = [ ('p_flow_id', '134'), ('p_flow_step_id', '101'), ('p_instance', qw.attrs['value']), ('p_page_submission_id', div.attrs['value']), ('p_request', 'LOGIN'), ('p_arg_names', '3808843104802386083'), ('p_t01', '%D9%8A%D8%B..etc'), ('p_arg_names', '1235407356725963'), ('p_t02', 'http://www.yu.edu.jo'), ('p_arg_names', '174514341787584706'), ('p_t03', 'username'), ('p_arg_names', '174514439646584711'), ('p_t04', 'gggg'), ('p_md5_checksum', '') ] url = "https://sis.yu.edu.jo/pls/yuapps/f?p=134:101:165660500709862::::" resp = requests.post(url, data=post_data)
注意事项
- 参数顺序需要和BurpSuite抓包的顺序完全一致,避免部分后端服务会校验参数提交顺序
- 不需要提前对参数值做URL编码,requests会自动对
application/x-www-form-urlencoded类型的请求做编码处理,提前编码反而会导致二次编码异常 - 其他HTTP请求库(如httpx)也支持相同的元组列表传参方式,用法一致
内容的提问来源于stack exchange,提问作者Abdalrahman_Ayed
相关产品推荐
相关产品推荐

