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: 不允许执行 PAC 脚本超过 60 秒,之后脚本执行将终止。

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

请注意,处理 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”实用工具依赖于服务器管理员。