SSRF的修复比较复杂,需要根据业务实际场景来采取不同的方案,例如前面说到的python中不同url库对url的解析就不一致,所以对于有条件的公司,建立一个代理集群是比较可靠的方案,将类似请求外部url的需求整理出来,分为纯外网集群和内网集群进行代理请求。
如果需要从代码层面来修复的话,需要注意一下几点:
1. 去除url中的特殊字符
2. 判断是否属于内网ip
3. 如果是域名的话,将url中的域名改为ip
4. 请求的url为3中返回的url
5. 请求时设置host header为ip
6. 不跟随30x跳转(跟随跳转需要从1开始重新检测)
其中第一步是为了防止利用url parse的特性造成url解析差异,第三步是为了防止dns rebinding,第5步是为了防止以ip请求时,某些网站无法访问的问题,第6步是为了防止30x跳转进行绕过。