2011-09-25 133 views
2

我想實現類似於WCF OData提供程序的東西,但使用NetTcpBinding而不是WebHttpBinding/REST。我希望客戶端能夠編寫透明序列化併發送到服務器(或可能是多個服務器,以整合分佈式數據庫實例)的linq查詢。通過WCF傳遞查詢表達式

執行此操作的一種方法是實現自定義IQueryable提供程序。你可以越過線查詢表達式中(至少)有兩種方式:

1)序列化的表達,XML,發送和反序列化服務器

2)傳遞更有甚者,或無論是DataContracts形式的服務器的原始SQL的前兆

1是困難和簡單的工作,2顯然可能構成安全風險(SQL注入)。例如說一「位置」表達包封並傳遞到像這樣的服務器,

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

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

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

當上述最終表示,指出「在哪裏[SomeColumn] =‘someValue中’的SQL查詢的一部分。

我的問題是WCF客戶端服務器連接是否足夠安全以保證這種方法不會出現太多的安全風險?或者,如果有任何其他方式通過NetTcpBinding實現OData類提供程序,我會感興趣。

回答

2

我會從嘗試Expression Tree Serialization項目開始。它旨在允許序列化表達式,但我沒有用它來評論它的工作效果。

如果失敗了,那麼您可以使用DataContract構造查詢。存在風險,但您始終可以通過數據庫權限排除不需要的操作(例如,UPDATEDELETEUserRole表)。您的WCF服務應使用專用帳戶連接到數據庫,並且該帳戶應僅具有執行所需內容的權限(不需要CREATEDROP,相關表格中只有SELECT等)。

當然,您還可以保護您的WCF連接以阻止不需要的連接(請參閱WCF Security Overview)。一種選擇是要求證書認證 - 只有具有相關證書的用戶才能使用該服務。