2017-06-12 2 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オブジェクトを使用して、それを実行する方法を示します。

パラメータ化されたMDXクエリを実行し、CellSetを返す次の汎用C#メソッドがあるとします。

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"); 
関連する問題