日期:2012-01-12  浏览次数:20485 次

关于安全的建议:对投入使用的 XML Web Services 禁用 HTTP-GET 和 HTTP-POST 协议
Microsoft Corporation
2002 年 2 月

摘要:出于安全原因,Web service 操作人员可能需要对 XML Web services 禁用 HTTP-GET 和 HTTP-POST 消息处理协议。禁用这些协议有助于防止外部 Web 站点与您的 Intranet 上的 XML Web services 进行恶意通信。

目录

  • 简介
  • 对基于 ASP.NET 的 XML Web Services 禁用 HTTP-GET 和 HTTP-POST 协议
  • 禁用 HTTP-GET 和/或 HTTP-POST 的影响
  • 总结

简介


由于 HTTP-GET 和 HTTP-POST 消息处理协议的固有功能,在某些条件下,恶意 Web 页可以使用它所定义的参数调用在防火墙后面运行的 XML Web service。这与某些基于 HTTP-GET 的恶意重定向问题类似。如果 XML Web service 支持使用 HTTP-GET 或 HTTP-POST 消息处理协议(对于使用 ASP.NET 创建的 XML Web services,将默认启用这些协议)进行通信,就可能会发生此类安全问题。
尽管使用 HTTP-POST 创建恶意 Web 页并不容易,但如果 XML Web services 没有使用 HTTP-GET 和 HTTP-POST 消息处理协议,还是应该在提供用 ASP.NET 创建的 XML Web services 的生产用计算机上禁用对这两个协议的支持。
http://www.microsoft.com/china/msdn/library/dnnetsec/images/dishttpget01.gif
图 1:常见的恶意通信事件步骤说明1位于防火墙后面的 HTTP 客户端(如 Microsoft® Internet Explorer)浏览一个包含链接的恶意 Web 页。2Web 服务器向客户端返回一个包含恶意链接的 Web 页。当用户单击该链接时,即对客户端所在的 Intranet 上的 XML Web service 发出请求(用户并不知道该请求)。3恶意 Web 页将使用基于 Web 页提供的参数和用户凭据向 XML Web service 发出请求。
只有在下列条件下才会发生图 1 所示的情况:
  • XML Web service 支持使用 HTTP-GET 或 HTTP-POST 消息处理协议进行通信。(使用 HTTP-POST 的情况比较复杂,请参阅以下关于 HTTP-POST 的代码示例。)
  • 恶意 Web 页的外部开发人员了解 XML Web service 是否存在以及如何调用的详细信息。
  • 客户端具有执行内部 XML Web service 的访问权限。

虽然这种情况概括的是如何使用 HTTP-GET 恶意调用 XML Web service,但同样适用于 HTTP-POST。要使用 HTTP-POST 以类似的方法执行 XML Web service,Web 页必须包含脚本,以便在用户单击某处导致消息发送回外部 Web 服务器时,将客户端重定向到 XML Web service。
下面的代码示例是一个包含恶意链接的 Web 页,该链接指向在客户端所在的 Intranet 上运行并使用 HTTP-GET 协议的 XML Web service。在此示例中,用户必须单击链接;不过,也有可能 Web 页包含执行重定向的脚本,因而不需要用户的交互操作。
<html>
<body>
<a HREF = "http://AnIntranetServer/401K.asmx/ChangeWithholding?PreTax=  0@PostTax=0">快速致富!</a>
</body>
</html>

同样,下面的代码示例是一个包含恶意按钮的 Web 页,该按钮能够与在客户端所在的 Intranet 上运行并使用 HTTP-POST 协议的 XML Web service 进行通信。
<form method="POST"  action="http://AnIntranetServer/401K.asmx/ChangeWithholding">
  <input type="hidden" name="pretax" value="2.5">
  <input type="hidden" name="posttax" value="3.5">
  <input type="submit" value="快速致富。单击此处了解详细消息。" ></p>
</form>

需要说明的是,这种情况对只能通过 HTTP 协议的 SOAP 与之通信的 XML Web service 不适用。SOAP 请求需要 SOAPAction HTTP 标头,而 Web 页不具有在使用链接的重定向中包含该标头的功能。

对基于 ASP.NET 的 XML Web Services 禁用 HTTP-GET 和 HTTP-POST 协议


默认情况下,客户端可以使用以下三种协议与使用 ASP.NET 创建的 XML Web services 进行通信:HTTP-GET、HTTP-POST 和通过 HTTP 的 SOAP。使用 Microsoft .NET 框架支持的配置系统,您可以在单独的 Web 应用程序或整个计算机中修改 XML Web services 所支持的协议。
无论是在计算机上还是在单个 Web 应用程序中禁用 HTTP-GET 和 HTTP-POST,都只需修改配置文件,该文件在 .NET 框架中只是一个简单的文本文件。计算机的默认配置是在 Machine.config 文件中进行设置的,对于每个 Web 应用程序,您可以修改该 Web 应用程序的根目录中的 Web.config 文件而不是 Machine.config 文件。
在不需要 HTTP-GET 和 HTTP-POST 消息处理协议的生产用计算机上,最好在整个计算机中禁用对这些协议的支持。对于 XML Web service 客户端使用 HTTP-GET 或 HTTP-POST 与 XML Web service 进行通信的特殊情况,可以为使用这些协议的 Web 应用程序添加对这些协议的支持。

在整个计算机上禁用 HTTP-GET 和 HTTP-POST 协议(建议)

  1. 使用常用的文本编辑器打开 Machine.config 文件。(默认安装将 Machine.config 放在 C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\CONFIG 文件夹中。)
  2. 在 webServices 节中标出添加 HTTP-GET 和 HTTP-POST 支持的命令行。执行此操作后,webServices 节应如下所示:
    <webServices>
        <protocols>
          <add name="HttpSoap"/>
             <!-- <add name="HttpPost"/> -->
             <!-- <add name="HttpGet"/>  -->
          <add name="Documentation"/>
         </protocols>
    <