WCF查询拦截器:此MSDN示例是否存在安全风险?

时间:2010-11-11 01:20:52

标签: c# security entity-framework wcf-security odata

如果查看this 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'"); 
    }
}

查看所有CAPS中的评论。我的问题是:“该行是否依赖于客户提供的数据......如果是这样,我们可以做些什么来进行安全验证?”

1 个答案:

答案 0 :(得分:1)

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