2017-06-12 238 views
2

用C#防止MDX注入攻擊的好方法是什麼?我目前使用的ADOMDClient是否有一個不同的客戶端,我應該使用?防止MDX注入攻擊

+2

['AdomdCommand'具有'Parameters'](https://docs.microsoft.com/en-us/sql/analysis-services/multidimensional-models/mdx/using-variables-and-parameters- mdx)和['STRTOMEMBER'](https://docs.microsoft.com/en-us/sql/mdx/strtomember-mdx)具有'CONSTRAINED'來防止欺騙。這是非常多的。 –

+0

你有一個很好的例子 –

回答

3

我們可以通過將用戶指定的字符串傳遞給MDX StrToSet,StrToTuple,StrToMember和StrToValue函數來創建參數化MDX查詢以防止MDX注入攻擊。

以下是來自this MSDN page的MDX StrToSet功能的幾個示例。

以下示例使用StrToSet函數返回State-Province屬性層次結構的成員集合。設置規範提供了有效的MDX集表達式。

SELECT StrToSet ('[Geography].[State-Province].Members') 
ON 0 
FROM [Adventure Works] 

以下示例返回一個錯誤,由於約束標誌。雖然設置規範提供了有效的MDX集表達式,但CONSTRAINED標誌需要設置規範中的合格或不合格成員名稱。

SELECT StrToSet ('[Geography].[State-Province].Members', CONSTRAINED) 
ON 0 
FROM [Adventure Works] 

下面的代碼示例演示如何創建一個參數化查詢,以及如何使用AdomdConnection對象來執行它。

假設我們有以下通用的C#方法,它執行參數化的MDX查詢並返回CellSet。

public CellSet GetCellSet(string connectionString, string query, IDictionary<string, object> parms) 
{ 
    using (var conn = new AdomdConnection(connectionString)) 
    { 
     // Open the connection. 
     conn.Open(); 

     // Create the command. 
     using (var cmd = conn.CreateCommand()) 
     { 
      // Set the command query. 
      cmd.CommandText = query; 

      // Add any query parameters. 
      if (parms != null) 
      { 
       foreach (var kv in parms) 
       { 
        var parameter = cmd.CreateParameter(); 
        parameter.ParameterName = kv.Key; 
        parameter.Value = kv.Value; 

        cmd.Parameters.Add(parameter); 
       } 
      } 

      // Execute the query and return the CellSet. 
      return cmd.ExecuteCellSet(); 
     } 
    } 
} 

假設我們有另一種方法允許客戶端傳遞MDX集表達式的字符串表示形式。該方法將從多維數據集中選擇集合並返回結果的CellSet。

public CellSet GetMdxSetOnColumns(string setExpression) 
{ 
    var connectionString = "replace with your connection string"; 

    // The query parameter @TheSet will be replaced with setExpression. 
    var query = "SELECT StrToSet(@TheSet) ON 0 FROM [Adventure Works]"; 

    // Add the passed in string as a query parameter. 
    var parms = new Dictionary<string, object>(); 

    // You can omit the "@" in front of the parameter name here. 
    parms.Add("TheSet", setExpression); 

    return GetCellSet(connectionString, query, parms); 
} 

客戶端代碼可以像這樣調用此方法。

var cellSet = GetMdxSetOnColumns("[Geography].[State-Province].Members");