将每个免费代理视为不可信的基础设施,事实本就如此。运营者匿名,资金模式不明,同一个套接字可能在一周内轮换经过僵尸网络、被入侵的家用路由器以及研究人员的蜜罐。但这并不意味着免费代理不可用——它只是让一小部分习惯变得不可妥协。
常见攻击
这些威胁并不戏剧化。它们是那种无聊的类型,之所以能成功,是因为大多数用户懒得防范。
明文HTTP上的凭证窃取。 如果你通过未知代理使用 http:// 登录任何服务,运营者就能看到密码。始终通过 CONNECT 隧道传输TLS,或者使用SOCKS连接到本身强制使用HTTPS的目标。主流网站的现代登录流程仅使用HTTPS,但遗留的内部网、物联网管理页面和旧版CMS部署并非如此。
头部和内容注入。 恶意的HTTP代理可以重写你请求的任意部分:更改cookie、替换referrer、注入跟踪参数或剥离缓存头部。同一个代理还可以向响应中注入内容——向HTML注入脚本、向JSON注入重定向、向静态页面注入广告。如果你通过代理读取服务器端响应,在能够通过可信路径验证完整性之前,将其视为已被篡改。
通过SOCKS5的DNS劫持。 SOCKS5可以在代理处解析主机名。如果代理对DNS记录撒谎,你就会连接到运营者控制的服务器。尽可能将客户端设置为本地解析:curl --resolve example.com:443:93.184.216.34,或者在代码中传递IP地址而非主机名。
流量日志记录。 即使是善意的代理也可能记录你获取的每个URL。对于包含“此人请求了哪些URL”的威胁模型,每个公共代理都是错误的工具。请使用Tor或具有公开无日志政策且有应对传票记录的付费VPN。
针对客户端的资源耗尽。 某些代理故意将连接限速到极慢、返回非常大的响应,或者保持套接字打开但不发送数据。在客户端设置严格的响应大小限制和连接超时。
防御措施,按优先级排序
将所有流量通过 CONNECT 封装在TLS内发送,或通过SOCKS发送到HTTPS目标。切勿在公共代理后面重复使用你在其他地方也会使用的凭证。严格验证证书——对于日常使用,固定证书颁发者有些过度,但接受任何证书链则是鲁莽的。设置较短的连接和读取超时。当工作负载重要时,记录代理响应以供取证审查。频繁轮换;五分钟前还能用的代理现在未必是同一个代理。
免费代理的实际用途
三类工作值得忍受这些麻烦。测试地理内容差异:你的CDN从法兰克福与圣保罗提供的是否是正确页面?抓取公开的、无需认证的数据:搜索引擎结果、没有按IP限速的公共API、已在其他地方索引的内容。验证你的应用程序在出站IP对目标不熟悉时是否行为正确——对具有基于IP的欺诈启发式系统的QA很有用。
仅用于这些目的。接受失败率。不要将任何你介意丢失的东西放在代理后面。