私はいくつかの動的SQLを生成していますし、私のコードはSQL injectionから安全であることを確認したいと思います。.NETの動的SQLでテーブル名または列名をサニタイズしますか? (防止SQLインジェクション攻撃は)
var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
tableName, columnName);
上記で
、tableName
、columnName
、そしてどのような信頼できないソースから来@value
にバインドされます。ここでは議論の便宜上
は、それがどのように生成されるかの最小限の例です。プレースホルダが使用されているので、@value
はSQLインジェクション攻撃から安全であり無視することができます。 (コマンドは、SqlCommandオブジェクトを介して実行される。)
しかし、tableName
とcolumnName
ははプレースホルダとしてバインドされ、インジェクション攻撃に対して脆弱そのであることはできません。この「真の動的」シナリオので、tableName
または利用可能なcolumnName
のないホワイトリストが存在しません。
問題は、このようです:
内蔵ウェイチェックおよび/またはtableName
とcolumnName
をサニタイズする標準は、ありますか? (SqlConnectionまたはヘルパークラスなど)そうでない場合、このタスクを実行する良い方法は何ですかサードパーティのライブラリを使用しないでですか?
注:
- スキーマを含むすべてのSQL識別子、で受け入れなければならない。例えば
[schema].[My Table].column
はtable1
と同じように「安全」です。 - sanitize識別子またはが無効な識別子であるを検出することができます。 (これは、表/列がコンテキストで実際に有効であることを確認する必要はありません。結果のSQLが無効になることができますが、「安全」でなければなりません。)
アップデート:
ジャストましたこの、それはやや面白いと思った:SqlFunctions.QuoteName機能が.NET4(?EF4)です。さて、それはしない実際に私を助けてください...
あなたは正しいです、それは確かにSQL Serverです。私は、最小限の*受け入れられた正規表現ルートに傾いていますが、何かが存在することが期待されていました(そして、テストされた;-))。スキーマのメタデータと照合することについての追加の考えが本当に好きです。 –
パラメータ化されたクエリを使用してテーブル/スキーマをテストする場合は、コード内の各カラム名の存在をテーブルのカラム名の完全なリストと照合してチェックしてください。これは最小限の究極のものになります:)。 –
さて、少し大きめの実装です:) –