以下安全注意事项适用于使用WinHTTP的应用程序:
· | 服务器证书只能在每个会话中验证一次.验证证书后,在当前会话期间仍然有效。只要证书指纹匹配,表示证书未更改,证书将继续重新验证。因此,通过协议,撤销检查或证书错误忽略标志的验证标准的任何更改,一旦验证证书,就不会生效。要迫使这种改变立即生效,当前会议必须结束,新的会议开始。类似地,只有当应用程序本身周期性地检查证书服务器以检索到期限数据时,才能检测到会话过程中的证书到期。 |
· | 自动代理涉及下载和执行脚本.自动代理发现支持涉及通过DHCP或DNS进行检测,下载和执行代码脚本(如Java脚本)。为了实现更高的安全性,应用程序必须避免传递WINHTTP_AUTOPROXY_RUN_INPROCESS标志,以便自动代理发现不在进程中启动。即使如此,如果脚本无法正常运行,WinHTTP默认尝试在进程中运行自动代理脚本。如果您认为此回退行为构成不可接受的风险,请使用WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY标志来禁用回退行为。 |
· | WINHTTP_STATUS_CALLBACK函数必须及时返回.当您编写这些回调函数之一时,请小心不要阻止。例如,回调函数和调用的函数都不应显示用户对话框或等待事件。如果WINHTTP_STATUS_CALLBACK功能阻塞,则会影响WinHTTP的内部调度,并导致同一进程中的其他请求被拒绝服务。 |
· | WINHTTP_STATUS_CALLBACK函数必须可重入.在写回调时,避免静态变量或其他在重入不安全的结构,避免调用不可重入的其他函数。 |
· | 如果可以进行异步操作,则为OUT参数传递NULL.如果您通过注册回调函数启用了异步操作,则为WinHttpQueryDataAvailableWinHttpQueryDataAvailablelpdwBytesRead或WinHttpWriteDatalpdwBytesWritten之类的OUT参数始终传递NULL值。在某些情况下,调用线程在操作完成之前终止,如果OUT参数不为NULL,则该函数可能会结束对已经释放的内存的写入。 |
· | 护照身份验证不是万无一失的.任何基于cookie的身份验证方案都容易受到攻击。护照版本1.4是基于cookie的,因此受到与任何cookie或基于表单的身份验证方案相关联的漏洞的影响。WinHTTP默认禁用护照支持;可以使用WinHttpSetOption启用它。 |
· | 基本认证只能通过安全连接使用.基本身份验证以明文形式发送用户名和密码(参见RFC 2617)只能通过加密的SSL或TLS连接使用。 |
· | 将自动登录策略设置为“低”可能会造成风险.当自动登录策略设置为低时,可以使用用户的登录凭据对任何站点进行身份验证。但是,对不信任的网站进行身份验证不是很好的安全措施。 |
· | 不使用SSL 2.0连接,除非明确启用.TLS 1.0和SSL 3.0安全协议被认为比SSL 2.0更安全。默认情况下,WinHTTP在协商SSL连接而不是SSL 2.0时请求TLS 1.0或SSL 3.0。WinHTTP中的SSL 2.0支持只能通过调用WinHttpSetOption来启用。 |
· | 必须明确要求证书撤销检查.默认情况下,执行证书认证时,WinHTTP不会检查服务器的证书是否被撤销。可以使用WinHttpSetOption启用证书撤销检查。 |
· | 应用程序必须确保会话映射到单个标识.WinHTTP会话应映射到一个唯一的身份;也就是说,WinHTTP会话用于管理单个经过身份验证的用户或一组匿名用户的Internet活动。但是,由于WinHTTP不会自动强制执行此映射,您的应用程序必须采取措施确保仅涉及一个身份。 |
· | WinHTTP请求句柄上的操作应该同步.例如,应用程序应避免在另一个线程发送或接收请求时关闭一个线程上的请求句柄。要终止异步请求,请在回调通知期间关闭请求句柄。要终止同步请求,请在以前的WinHTTP调用返回时关闭句柄。 |
· | 跟踪文件包含敏感信息.跟踪文件使用访问控制列表(ACL)进行保护,以便通常只能由本地管理员或创建它的用户帐户访问跟踪文件。避免任何未经授权的访问损害跟踪文件。 |
· | 避免通过WinHttpSetOption传递敏感数据.不要为WinHttpSetOption提供用户名,密码或任何其他凭据,因为您无法控制所使用的身份验证方案,敏感数据可能会以明文形式发送。使用WinHttpQueryAuthSchemes和WinHttpSetCredentials而不是WinHttpSetOption设置凭据。 |
· | 自动重定向可能会造成安全隐患.默认情况下,即使对于POST,也会自动跟踪重定向(302消息)。为了避免虚假重定向的可能性,应用程序应该在发布敏感信息时禁用自动重定向或监听回调方向。 |
· | 用户定义的标题在不同的重定向之间传输.用户定义的标头(例如添加了WinHTTPAddRequestHeaders的Cookie)将在不改变的情况下跨重定向传输,而WinHTTP生成的标题将自动更新。如果跨重定向传输用户定义的头文件带来安全风险,请在重定向发生时使用带有WINHTTP_CALLBACK_STATUS_REDIRECT完成功能的WINHTTP_STATUS_CALLBACK回调来修改头部。 |
· | WinHTTP在同步模式下不可重入.由于WinHTTP在同步模式下不可重入,因此请勿调度可在WinHTTP函数内执行的应用程序线程上调用WinHTTP的异步过程调用(APC)。在同步模式下,WinHTTP执行“可警告的等待”,如果等待的线程被抢占执行APC,然后再次重新输入WinHTTP,WinHTTP的内部状态可能会被破坏。 |