关于安全的建议:对投入使用的 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 的生产用计算机上禁用对这两个协议的支持。
http://www.microsoft.com/china/msdn/library/dnnetsec/images/dishttpget01.gif
图 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 的安全所涉及的诸多步骤和问题之一。
|