2011-07-11 12 views
1

私はいくつかのデータベースクエリでプロトタイプシステムを構築しました。それは単なるプロトタイプであり、私はデータベースにはまったく新しいので、私はちょうど直接の文字列を使用しました。これは私が使用される文字列であり、それは正常に動作します:VB.NET - パラメータ化されたクエリでいくつか問題がある

command = New OleDbCommand("SELECT * FROM " + prefix + "CanonicForms WHERE Type=1 AND Canonic_Form='" + item + "'", dictionary_connection) 

さて、実際のシステムにそれを置くことで、私はより安全なparametizedメソッドを使用していたので、いくつかのグーグルの後、私はこの思い付いた:

command = New OleDbCommand("SELECT * FROM @prefix WHERE Type=1 AND [email protected]", dictionary_connection) 
command.Parameters.AddWithValue("@prefix", prefix + "CanonicForms") 
command.Parameters.AddWithValue("@form", item) 

しかし、私は不完全なクエリ句のエラーです。私はどうしたのですか?

答えて

3

テーブル名はパラメータにすることはできません。あなたは連結の何らかの形をしなければならないかもしれません。それは実際に言葉の正式な意味でのパラメータではありません。

+0

本当に?何らかの入力に依存するテーブル名を持っている場合は、パラメータを使用しない場合と同じようにインジェクションの問題を引き起こすことはありませんか?私がテーブルの連結を使用しているのであれば、 – cost

+0

私はそれがあなたを開くかもしれないと言っています。テーブル名を「サニタイズ」したいと思うかもしれません。これはかなり一般的なものだと思います。誰もSQL文を連結するのは好きではありませんが、多くの選択肢がない時があります。 –

+1

@cost:SQLインジェクションは、UNVERIFIED/sanitized入力を連結した結果です。入力を確認すると、SQLインジェクションはできません。この場合、入力を検証する好ましい方法は、ユーザーが入力したものを既知のテーブル名にマップすることです(ユーザー入力を直接使用しない)。そうでない場合は、連結する前にテーブル名が存在することをまず確認することができますそれは(つまり、information_schema.tablesに対するパラメータ化されたクエリを使用します)。だから、はい、注射にはオープンですが、注射に脆弱である必要はありません。 – jmoreno

1

ek_nyのように、テーブル名はパラメータにすることはできません。

もしあなたが本当に注射についての不治症であれば、SQL文字列を作成する前に、渡されたテーブル名をホワイトリストの許容値でチェックしてください。

1

@cost、私はそれがいいと思うが、それはちょうど存在する機能ではないことに同意する。一般に、WHERE句はクエリの動的部分であり、他のすべて(SELECTリストとテーブル名を含む)は静的であると仮定します。実際には、WHERE節のほとんどは動的ではなく、検索値そのものだけではありません。この方法でも列名を動的に追加することはできません。これは間違いなく構築することができますが、クエリエンジンは、Microsoftがオープンに感じたことのないワームの可能性のあるデータベースエンジンを認識する必要があります。

「ジョブ」、「人」、「雇用者」などのテーブル名を持つドロップダウンメニューを想像してみてください。ポストバック時に値はSELECT * FROMに使用されます。単純なSQLインジェクションは、そのメニューにリストされていない別のテーブルにジャンプするのに必要なすべてのものです。本当に変なものを渡すと、データベースについて何かを明らかにするエラーを非常に簡単にスローすることができます。値のみのパラメータ化されたクエリは引き続き破損する可能性がありますが、表面積はずっと小さくなります。

複数のテーブルプレフィックスを持つ人は、スキーマを使用する人がいますが、それはあなたのオプションですか?

関連する問題