2017-06-12 180 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");