2012-01-03 30 views
2

ユーザーが選択のWHERE条件を決定するための機能を作成する必要があります。条件は動的になります。動的WHERE句とSQLインジェクション

私はSQLインジェクションに自分のコードを公開せずにこれを達成できる方法はありますか?

私はC#/ .NET Windowsアプリケーションを使用しています。

+0

あなたはどの言語を書いていますか? – Todd

+0

使用している技術は何ですか? .net? PHP?ルビー? ...その他? – dknaack

+0

私の投稿を更新しました。 – Rivka

答えて

1

ああに2つの段階をしないでください。列名と演算子は直接ユーザー入力ではありません。例えば。リストまたはラジオグループなどから選択した String WhereClause = String.Format( "{0} {1} @ {0}"、 "Customer"、 "=");

だから、あなたは "Where Customer = @Customer"を持っています。

次に、aparamer Customerを追加して、ユーザー入力から設定することができます。

これを攻撃するにはいくつかの方法がありますが、基準がどの程度複雑になるかによって異なります。

+0

はい、列名と演算子はリストから選択されます。私の質問は、これがストアドプロシージャで可能な場合になります。 – Rivka

2

ほとんどの悪いことは、where条件の値の部分で発生するため、パラメータ化されたクエリを使用するとSQLインジェクション攻撃からユーザーを保護することができます。 @pa="hello"@pb="WORLD"を結合し、クエリを実行し、その後

select a,b,c,d 
from table 
where [email protected] and [email protected] -- this is generated dynamically 

:examplegについては

条件a=="hello" && b=="WORLD"を与え、これを行います。

C#では、あなたは要素ごとのそれを通過し、手であなたのwhere句のメモリ内表現で始まり、2つの出力オブジェクトを生成するには:

  • where句の文字列(実際の名前は関係ありません)
  • 名前が値に対応する名前と値のペアの辞書です。 where clに挿入したパラメータause、および式表現から引っ張った定数に対応する値が含まれています。

これらの出力を手に入れて、文字列を使用して動的クエリを準備し、辞書を使用してパラメータ値を追加してから、RDBMSソースに対してクエリを実行します。

この

select a,b,c,d 
from table 
where a='hello' and b='WORLD' -- This dynamic query is ripe for an interjection attack 
+0

右...フィールドや演算子が動的なときに、どのようにパラメータを使うことができるのでしょうか? – Rivka

+0

明確化 - 私はパラメータの使い方を知っています。ここでの問題はパラメータ、パラメータ値、演算子は動的です。だから私は通常と同じようにパラメータを追加することはできません。 – Rivka

+0

@Becky私は、クエリ式表現からパラメータを抽出する方法に関する一般的な情報を含める答えを編集しました。 – dasblinkenlight