使用WCF通过线路传递查询表达式

时间:2011-09-25 23:33:37

标签: c# wcf security iqueryable nettcpbinding

我想实现类似WCF OData提供程序但使用NetTcpBinding而不是WebHttpBinding / REST。我希望客户端能够编写透明序列化并发送到服务器(或者可能是多个服务器,以整合分布式数据库实例)的linq查询。

实现此目的的一种方法是实现自定义IQueryable提供程序。您可以通过线路传递查询表达式(至少)两种方式:

1)将表达式序列化为xml,发送并在服务器上反序列化

2)以DataContracts的形式将原始SQL的前身或多或少的内容传递给服务器

1很难并且工作很简单,2显然会带来安全风险(sql注入)。比方说,'Where'表达式被封装并传递给服务器,如此,

[DataContract]
public class WhereFilter
{
    [DataMember]
    public string Property { get; set; }

    [DataMember]
    public string Operation { get; set; }

    [DataMember]
    public string Value { get; set; }
}

上述内容最终表示SQL查询中指出'Where [SomeColumn] ='SomeValue'的部分。

我的问题是WCF客户端 - 服务器连接是否足够安全以保证这种方法而不会带来太大的安全风险?或者,如果有任何其他方式通过NetTcpBinding实现类似OData的提供程序,我会感兴趣。

1 个答案:

答案 0 :(得分:2)

我首先尝试Expression Tree Serialization项目。它旨在允许表达式的序列化,但我还没有用它来评论它的工作情况。

如果失败,那么您可以使用DataContract构建查询。存在风险,但您始终可以通过数据库权限排除不需要的操作(例如UPDATEDELETE UserRole表)。您的WCF服务应该使用专用帐户连接到数据库,该帐户应该只具有执行所需操作的权限(无CREATEDROP,仅来自相关表的SELECT等)。

当然,您也可以保护WCF连接以阻止不需要的连接(请参阅WCF Security Overview)。一种选择是要求证书身份验证 - 只有具有相关证书的用户才能使用该服务。