WCF RIA Services 的安全性
本主题提供了确保安全使用域服务的指南。当通过应用 EnableClientAccessAttribute 特性来公开某个域服务时,该域服务可供公开它的网络上的所有用户使用。不能假定您的客户端应用程序是唯一将访问该域服务的应用程序。此注意事项对公共网络尤其重要。但是,在受限网络(如公司网络)中公开敏感数据时,这一点也很重要。
**“添加新的域服务类”**对话框将生成用于帮助您开始使用域服务的代码。生成的代码不一定能够直接部署。您必须检查代码并对其进行修改以满足应用程序的安全要求。具体而言,您必须考虑要提供给网络上的任何人执行的操作。以下检查表是确保安全使用域服务的起点。
安全检查表
若要确保安全使用域服务,请参考以下指南。
最大程度地减少由域服务公开的数据和操作。这是阻止信息泄露和拒绝服务的第一道防线。
只公开客户端需要的那些实体。如果此方法能让您减少公开的实体的数量,则可能需要将服务器逻辑和验证与客户端逻辑和验证分离开。例如,一个在客户端上不需要员工实体的费用报表应用程序不应通过域服务公开员工实体。
构造实体以避免公开敏感数据。可以使用 ExcludeAttribute 特性或表示模型来减少对客户端可用的数据。例如,如果应用程序不需要出生日期和身份证号码,则在显示给客户端的内容中排除它们。
需要查询方法来接受应用程序所需的参数,而不是依赖 LINQ 中的数据筛选功能。例如,如果为给定的员工显示费用报表,则您应要求使用员工 ID 作为查询方法中的参数,而且不应提供可获取所有费用报表的方法。此方法能最大程度地减少为所有员工收集数据的可能性。
创建仅在应用程序中提供特定方案所需的数据的查询方法。此方法意味着,您可以提供多个返回一部分数据的查询方法,而不是提供一个返回所有数据的查询方法。例如,如果产品按类别或供应商显示,则可以提供两个接受类别或供应商信息的方法,而不是提供一个返回所有产品的方法。
对数据进行筛选,以便只提供应用程序通常需要的数据。例如,您可以使用一个只返回去年完成的订单的查询方法。
限制可从查询返回的结果的数量,从而最大程度地减少无意或有意的服务器超载。可以使用 QueryAttribute 的 ResultLimit 属性来限制可返回的结果的数量。例如,如果可能返回大量产品,则通过将结果数限制为 20 来强制在客户端上对结果进行分页。此外,可以考虑使用 OutputCacheAttribute 特性进行输出缓存,以减少中间层和数据库的负载。
最大程度地减少每个公开的实体的操作数量。例如,如果订单应用程序仅需要添加或修改订单,则应对订单实体公开查询、插入和更新操作,但不公开删除操作。此外,您应该只对产品实体公开查询操作,而不公开任何数据修改操作。
应尽可能地使用命名的更新方法来限制可更新的成员。
限制只有经过身份验证的用户和特定角色的用户才可以访问数据和操作。
使用 RequiresAuthenticationAttribute 特性以尽可能地避免匿名访问。如果您必须允许匿名访问,则应只允许匿名访问最少量的域服务以及这些域服务中的最少量操作。
尽可能地添加特定于操作的 RequiresRoleAttribute 特性。在域服务中单独考虑每个操作。例如,所有用户都可能需要查询产品实体,但只有管理员角色的用户才需要对产品实体进行更新。
考虑使用 AuthorizationContext 属性来提供自定义授权模型。
将客户端发送的任何数据视为可疑数据。恶意客户端(甚至是已经过身份验证和授权的客户端)可能会为变更集中的当前值和原始值提供篡改值。您的应用程序逻辑不应假定这些值可信。相反,应考虑原始值已被篡改的潜在威胁。
将 https 协议用于 Forms 身份验证。以明文形式发送密码存在重大风险,但可以使用 https 来减轻风险。
公开最小数量的终结点。默认情况下,RIA Services 将为域服务创建一个二进制终结点。只有当客户端明确需要其他终结点时才会添加相应的终结点。将禁用任何未使用的终结点。