WinHTTP 中的 AutoProxy 问题

使用 WinHTTP autoproxy 功能时,请考虑以下重要问题。

目前仅支持一个代理服务器

WinHTTP 目前不支持指定多个代理服务器的代理配置。 如果 WinHttpGetProxyForUrl 返回包含代理服务器列表的 WINHTTP_PROXY_INFO 结构,应用程序随后使用 WINHTTP_OPTION_PROXY 选项在请求句柄上设置该结构,则 WinHTTP 仅使用列表中的第一个代理服务器。 如果无法访问该代理服务器,WinHTTP 不会故障转移到列表中的任何其他代理服务器。 应用程序可以通过使用列表中的下一个代理服务器再次设置 WINHTTP_OPTION_PROXY 选项并重新发送请求,由应用程序来处理这种情况。

安全风险缓解

处理代理自动配置文件需要执行下载的脚本代码。 需要考虑一些安全问题:如果 PAC 文件所在的服务器已泄露,则 PAC 脚本代码可能是恶意的。 因此,WinHTTP 使用以下预防措施来保护客户端:

  1. 阻止脚本代码实例化任何 ActiveX 对象。 这会阻止许多潜在的危险功能,例如访问文件和执行网络 I/O 的能力。

  2. **Windows Server 2003:**WinHttpGetProxyForUrl 将整个 WPAD 处理委托给外部进程外服务 WinHTTP Web 代理自动发现服务,该服务在低特权本地服务内置用户帐户下运行。

  3. SP2 和 Windows Server 2003 的 Windows XP: 不允许执行超过 60 秒的 PAC 脚本,之后脚本执行将终止。

  4. SP2 和 Windows Server 2003 的 Windows XP: WinHTTP 拒绝大于 1MB 的 PAC 文件。 典型的 PAC 文件的大小通常不超过几千字节。

请注意,处理 PAC 脚本代码需要使用 COM,因为 WinHTTP 使用 Microsoft JScript 组件来执行脚本。 如果 WinHTTP 无法将 WPAD 协议处理委托给外部进程外 Web 代理自动发现服务,WinHttpGetProxyForUrl 在调用期间在应用程序进程中加载 COM 运行时。 如果应用程序本身已在使用 COM,则这不应引起关注。

性能注意事项

自动检测过程可能很慢,可能只要几秒钟。 WinHttpGetProxyForUrlWinHttpDetectAutoProxyConfigUrl 函数是阻塞的同步函数。 可能是一种特定的自动检测机制(如 DHCP)比另一种(如 DNS)慢得多。 如果同时指定了 WINHTTP_AUTO_DETECT_TYPE_DHCPWINHTTP_AUTO_DETECT_TYPE_DNS_A 自动检测标志,则 WinHTTP 首先根据 WPAD 规范使用 DHCP。 如果没有通过发出 DHCP 请求来发现 PAC URL,则 WinHTTP 会尝试在已知 DNS 地址中找到 PAC 文件。

WinHttpGetProxyForUrl 使用 WinHTTP 会话句柄参数来缓存 PAC 文件和自动检测结果。 最好对多个 WinHttpGetProxyForUrl 使用相同的会话句柄 调用(如果可能避免重复的 PAC URL 检测和文件下载)。 PAC 文件仅缓存在内存中,并在应用程序关闭会话句柄时被丢弃。

由于 autoproxy 的性能影响,建议仅桌面客户端应用程序或服务使用此功能;基于服务器的应用程序应使用“ProxyCfg.exe”实用工具依赖于服务器管理员。