深蓝海域KMPRO

关于安全的建议:对投入使用的XML Web Services禁用HTTP-GET和HTTP-POST协议

2002-09-17 09:18

关于安全的建议:对投入使用的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 进行恶意通信。

简介

由于 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 的生产用计算机上禁用对这两个协议的支持。

图 1:常见的恶意通信事件

步骤 说明

1 位于防火墙后面的 HTTP 客户端(如 Microsoft? Internet Explorer)浏览一个包含链接的恶意 Web 页。

2 Web 服务器向客户端返回一个包含恶意链接的 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 协议(建议)

使用常用的文本编辑器打开 Machine.config 文件。(默认安装将 Machine.config 放在 C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\CONFIG 文件夹中。)

在 webServices 节中标出添加 HTTP-GET 和 HTTP-POST 支持的命令行。执行此操作后,webServices 节应如下所示:

<webServices>
    <protocols>
      <add name="HttpSoap"/>
         <!-- <add name="HttpPost"/> -->
         <!-- <add name="HttpGet"/>  -->
      <add name="Documentation"/>
    </protocols>
</webServices>

保存 Machine.config。

此配置更改将在下一次对该计算机上的 XML Web service 发出请求时生效。

在单个 Web 应用程序上禁用 HTTP-GET 和 HTTP-POST 协议

使用常用的编辑器打开 Web 应用程序根目录中的 Web.config 文件。(如果不存在 Web.config 文件,则创建该文件。)

修改 Web.config 的 webServices 节,使用以下格式显式删除 HTTP-POST 和 HTTP-GET 协议(如果 Web.config 文件不包含 webServices 节,则添加该节):

<webServices>
     <protocols>
       <remove name="HttpPost" />
       <remove name="HttpGet" />
     </protocols>
</webServices>

保存 Web.config。

此配置更改将在下一次对该 Web 应用程序上的 XML Web service 发出请求时生效。

在单个 Web 应用程序上添加 HTTP-GET 和 HTTP-POST 协议支持

使用常用的编辑器打开 Web 应用程序根目录中的 Web.config 文件。(如果不存在 Web.config 文件,则创建该文件。)

修改 Web.config 的 webServices 节,使用以下格式添加 HTTP-POST 和 HTTP-GET 协议(如果 Web.config 文件不包含 webServices 节,则添加该节):

<webServices>
     <protocols>
       <add name="HttpPost" />
       <add name="HttpGet" />
     </protocols>
</webServices>

保存 Web.config。

此配置更改将在下一次对该 Web 应用程序上的 XML Web service 发出请求时生效。

禁用 HTTP-GET 和/或 HTTP-POST 的影响

对于生产用计算机,禁用 HTTP-GET 和 HTTP-POST 协议所带来的弊端微乎其微。弊端包括:

XML Web service 的默认服务帮助页面继续有效,但潜在的客户端将无法使用服务帮助页面上的 Invoke(调用)按钮测试 XML Web service。

如果要在 Microsoft Visual Studio? .NET 中调试 XML Web service,您必须创建一个测试客户端程序。

对于投入使用的 XML Web service,这两个弊端都可以轻松克服,因为 Visual Studio .NET 提供了 Add Web Reference(添加 Web 引用)命令,使创建 XML Web service 的客户端变得非常简单。

总结

提供用 ASP.NET 创建的 XML Web services 的生产用计算机应该在整个计算机中禁用对 HTTP-GET 和 HTTP-POST 消息处理协议的支持,以避免在很多情况下可能出现的安全问题。对于早期开发而言,您可以在开发用计算机上启用这些协议;这样,开发用计算机便可以使用服务帮助页面来测试 XML Web services。将计算机投入实际使用时,请修改 .config 文件以禁用 HTTP-GET 和 HTTP-POST 协议。

需要说明的是,这并不是 XML Web service 开发人员应当采取的唯一安全措施,它只是保护 XML Web service 的安全所涉及的诸多步骤和问题之一。

相关推荐