最新碰到一个用 aiohttp 访问不出内容,但是用 requests 能访问的情况,url 是事先进行了 urlencode 的, 下面的 url 随便找了个站点代替,但是把重点的参数提了出来
%40 对应的是 @
%3a 对应的是 :
https://www.xxx.com?xxx%40yyy%3azzz
这个时候 requests 打开是有内容的,但是 aiohttp 打开是空内容
此时打开 burpsuite, 然后把 requests 和 aiohttp 的请求均通过 burpsuite 的本地 http 代理端口,仔细分析了报文后发现
requests 发送出去的和我传进去的参数一致:
https://www.xxx.com?xxx%40yyy%3azzz
但是 aiohttp 发送出去的和我传进去的参数略有区别:
https://www.xxx.com?xxx@yyy:zzz
上面那两个urlencode过的字符又被urldecode回来了,此时 google 一下发现 同样的问题
应该是 yarl 对url 解析处理的时候采取和 requests 等库不同的策略造成的,像 @ 和 : 这种在 url 里面有特殊意义的字符,即使 urlencode 过还是会被 urldecode 回来, 那么传参数之前告诉 aiohttp 我已经 urlencode 过了,你不需要再进行这一步处理就好了
import aiohttp
import asyncio
from yarl import URL
async def test():
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
async with session.get(URL("https://www.xxx.com?xxx%40yyy%3azzz"), proxy="http://localhost:8080") as resp:
print(await resp.text())
async with session.get(URL("https://www.xxx.com?xxx%40yyy%3azzz", encoded=True), proxy="http://localhost:8080") as resp:
print(await resp.text())
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(test())
在 burpsuite 发现两条真实发出去的url分别是下面的样子的