aiohttp(yarl) 对 url 部分字符自动 urldecode

最新碰到一个用 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分别是下面的样子的

https://www.xxx.com/?xxx@yyy:zzz

https://www.xxx.com/?xxx%40yyy%3azzz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值