2010-11-11 87 views
2

如果你看看this MSDN文档没有与下面的代码示例:WCF查询拦截器:此MSDN是否存在安全风险?

// Define a change interceptor for the Products entity set. 
[ChangeInterceptor("Products")] 
public void OnChangeProducts(Product product, UpdateOperations operations) 
{ 
    if (operations == UpdateOperations.Add || 
     operations == UpdateOperations.Change) 
    { 
     // Reject changes to discontinued products. 
     if (product.Discontinued) //<-- IS THIS BASED ON UNVERIFIED CLIENT DATA??? 
     { 
      throw new DataServiceException(400, 
         "A discontinued product cannot be modified"); 
     } 
    } 
    else if (operations == UpdateOperations.Delete) 
    { 
     // Block the delete and instead set the Discontinued flag. 
     throw new DataServiceException(400, 
      "Products cannot be deleted; instead set the Discontinued flag to 'true'"); 
    } 
} 

看全部大写的评论。我的问题是:“这条线是否依赖于客户端提供的数据......如果是这样,我们可以做些什么来进行安全验证”?

+0

感谢您报告文档中可能存在的问题! – 2010-11-11 07:07:18

回答

1

更改拦截器应该在客户端的修改应用到它之后获得实体。所以行为取决于提供者。如果您的提供将此属性实现为只读(通常意味着它的任何更新都将被忽略),则上述检查没有问题。但我确实同意这个例子在这方面可能会更好。 还取决于您的提供者,如果此属性不是只读的,则需要向提供者询问未更改/以前的值。要做到这一点的方式取决于供应商。因此,如果是EF,这更像是一个EF问题,如何确定修改后属性的原始值(实体实例将在当前数据源上进行跟踪)。

+1

“在修改应用于它后”......这是否意味着客户端的HTTP邮件会绕过一些(可能)无效的数据,它被应用于(a)EF或(b)提供者。如果情况“b”那么,SQL服务器会得到一个“写”,然后回滚事务? – LamonteCristo 2010-11-12 00:00:10

+0

如果提供者是EF,那么该实现会将更改应用于服务器端EF实体(EF生成的类的实例,以上示例中的Product类),但这些更改不会传输到任何地方,因为SaveChanges不是调用底层的EF上下文。 – 2010-11-12 13:53:35

+0

如果提供者不是-EF,那么实际行为取决于提供者对IUpdatable接口的实现,但是如果它遵循这个规范,则它应该以与SaveChanges尚未调用相似的方式行为,并因此改变应该只在本地缓存在服务器上,不应用于任何persitant存储。 – 2010-11-12 13:54:55

相关问题