今日写公司的验签脚本时,发现requests库给服务端发送请求时,没有对URL参数中的=进行加密,导致验签算法得到的值错误,仅此记录,我用的requests版本是2.23.0版本,以下是请求示例
Python发送requests接口时的参数如下
ur = "http://111.11.40.21/cinema/address/?sessid=E1MDk0OTE==&city=杭州"
res = requests.get(url=ur)
到服务器端接收到的url是
GET /cinema/address/?sessid=E1MDk0OTE==&city=%E6%9D%AD%E5%B7%9E HTTP/1.1" 200 24 "-" "python-requests/2.23.0
通过后端的请求日志可以看到杭州已经被urlencode了,但是sessid参数里的==号却没有被urlencode,正常情况下==会被转换成%3d%3d,但是requests发出去的请求却没有进行编码,最后查看源码发现,requests库底层把这些字符排除了!!!而我写验签算法时没有排除这些,造成了我算验签拿到的参数是全部都编码的,但是requests发送请求时会排除一些字符不进行编码,后台拿到的参数跟我验签时用的参数不一致,导致验签失败,所以还是要多看源码啊!!!!