1

ストアド プロシージャの一部として動的 SQL を使用しているクライアントの 1 つ。彼らはこれを変えたくありません。その危険なストアド プロシージャを使用する必要がある MVC Web サイトを構築しています。したがって、Entity Framework でパラメーターを使用しても問題は解決しません。

古くて優れた SQL ヘルパーを使用したとき、ExecuteQuery 関数内のすべてのパラメーターをチェックし、危険なキーワードを見つけようとしました。しかし今、私がネイティブの.NET Entity Framework 5を使用しているとき、私はそれをチェックできる共有機能を持っていません。

特定のフィールドごとにバリデーターを使用することは、私にとっては良くありません。SPを実行するEntity Framework部分に機能を追加するオプションはありますか、またはその問題を解決する他のアイデアはありますか?

4

1 に答える 1

1

ストアド プロシージャ内の動的 SQL がパラメーターを使用するかどうかはわかりません。そうでない場合、最善の解決策は、クエリ実行時に一重引用符の文字列をエンコードすることです

たとえば、メソッドを作成しますstring EncodeSqlString(string s) { return s.replace("'", "''"); }

次に、このメソッドを呼び出します

cmd.CommandText = "SP_FOO";
cmd.CommandType = CommandType.StoredProcedure;
EntityParameter param = new EntityParameter();
param.Value = EncodeSqlString(myString);
param.ParameterName = "MyParam";
cmd.Parameters.Add(param);

これは、ストアド プロシージャに渡される文字列値のみをエンコードするため、最も安全な方法です。他の場所や、引用符のエンコードが適切でないコンテキストでは値を使用せず、切り捨てのリスクを軽減します ( SP 内で切り捨てが発生しない限り)。これは、SP が SQL クエリを構築するための値のみを使用する場合にのみ正しく機能します。SP が値を使用して何か他のことを行う場合、これはおそらく適切ではありません。

このメソッドには文字列値のみを渡します。その他の引用符で囲まれていない型については、パラメーターに渡す前に正しい型であることを確認する必要があります。例えばint

  string number = Request.QueryString["Number"];
    if (int.TryParse(number, out myInt))
    {
      cmd.CommandText = "SP_BAR";
      cmd.CommandType = CommandType.StoredProcedure;
      EntityParameter param = new EntityParameter();
      param.Value = myInt;
      param.ParameterName = "MyParam";
      cmd.Parameters.Add(param);
    }
    else
    {
      // handle appropriately but do not use value
    }
于 2013-09-19T09:30:28.373 に答える