元数据的安全注意事项

在 Windows Communication Foundation 中使用元数据功能时,请考虑发布、检索和使用服务元数据的安全影响。

何时发布元数据

WCF 服务默认不发布元数据。 若要发布 WCF 服务的元数据,必须通过向服务添加元数据终结点来显式启用元数据发布(请参阅 发布元数据)。 保持禁用元数据发布可以减少服务的攻击面,并降低信息意外泄露的风险。 并非所有服务都必须发布元数据。 如果不必发布元数据,请考虑将其关闭。 请注意,你仍然可以使用 ServiceModel 元数据实用工具工具(Svcutil.exe)直接从服务程序集生成元数据和客户端代码。 有关使用 Svcutil.exe 导出元数据的详细信息,请参阅 How to: Use Svcutil.exe to Export Metadata from Compiled Service Code.

使用安全绑定发布元数据

WCF 提供的默认元数据绑定不安全,并且允许匿名访问元数据。 WCF 服务发布的服务元数据包含有关服务的详细说明,可能有意或无意地包含敏感信息。 例如,服务元数据可能包含关于基础设施操作的信息,这些信息本不应被公开披露。 若要保护服务元数据免受未经授权的访问,可以对元数据终结点使用安全绑定。 元数据终结点响应 HTTP/GET 请求,这些请求可以使用安全套接字层(SSL)来保护元数据。 有关详细信息,请参阅 “如何:保护元数据终结点”。

保护元数据终结点也为请求者提供了一种安全检索服务元数据的方法,而不会造成篡改或欺骗的风险。

仅使用受信任的元数据

可以使用服务元数据来自动构造调用服务所需的运行时组件。 还可以在设计时使用元数据来开发客户端应用程序或在运行时动态更新客户端用来调用服务的绑定。

以不安全的方式检索服务元数据时,可以篡改或欺骗服务元数据。 篡改的元数据可以将客户端重定向到恶意服务、包含泄露的安全设置或包含恶意 XML 结构。 元数据文档可能很大,并且经常保存到文件系统。 为防止篡改和欺骗,如果有可用的安全绑定,请使用它来请求服务元数据。

使用安全技术处理元数据

服务元数据经常通过网络使用标准化协议(如WS-MetadataExchange(MEX))从服务中检索。 许多元数据格式包括指向其他元数据的引用机制。 MetadataExchangeClient 类型会为您自动处理 Web 服务描述语言 (WSDL) 文档、XML 架构和 MEX 文档中的引用。 通过检索到的元数据创建的 MetadataSet 对象的大小与使用的 MaximumResolvedReferences 实例的 MetadataExchangeClient 值以及该 MaxReceivedMessageSize 实例正在使用的绑定的 MetadataExchangeClient 值成正比。 根据方案规定将这些配额设置为适当的值。

在 WCF 中,服务元数据将作为 XML 进行处理。 处理 XML 文档时,应用程序应保护自己免受恶意 XML 结构的影响。 处理 XML 时请使用具有适当配额的 XmlDictionaryReader,并将 DtdProcessing 属性设置为 Prohibit

WCF 中的元数据系统是可扩展的,元数据扩展可以在应用程序配置文件中注册(请参阅 扩展元数据系统)。 元数据扩展可以运行任意代码,因此应使用适当的访问控制列表(ACL)保护应用程序配置文件,并仅注册受信任的元数据扩展实现。

验证生成的客户端

从从不受信任的源检索的元数据生成客户端代码时,请验证生成的客户端代码,以确保生成的客户端符合客户端应用程序安全策略。 可以使用验证行为来检查客户端绑定上的设置或直观检查工具生成的代码。 有关如何实现验证行为的客户端的示例,请参阅 客户端验证

保护应用程序配置文件

服务的应用程序配置文件可以控制元数据的发布方式和是否发布。 最好使用适当的访问控制列表(ACL)保护应用程序配置文件,以确保攻击者无法修改此类设置。

另请参阅