web-dev-qa-db-ja.com

SQLクエリのサニテーション(ブラックリスト)

次の問題/問題があります:

企業LANにインストールされ、SQL Server DBで動作するWebアプリケーション(ASP.NET 3.5)は、カスタムレポートを生成する機能を提供する必要があります。これらのレポートは、基本的に下線DBからのものであり、複雑なジョイント、ユニオン、および考えられるあらゆるものが含まれます。 (選択するだけで、挿入/削除/ドロップ/更新はありません)

これを行う最も簡単な方法–システムがSQLクエリを実行できるようにします。システム管理者はシステムにカスタムクエリを追加し、「通常の」ユーザーはそれらを実行できます。新しいクエリが必要な場合は、管理者にクエリを作成するよう依頼し、クエリIDで実行できるようにします。

ホワイトリストのアプローチはここでは機能しません(少なくとも私は方法がわかりません)。

ブラックリストはどうですか?私はそのようなことを考えていました:

blackList={"--", ";", "/*", "*/", "@@", "@",
                  "char", "nchar", "varchar", "nvarchar",
                  "alter", "begin", "cast", "create", "cursor",
                  "declare", "delete", "drop", "end", "exec",
                  "execute", "fetch", "insert", "kill", "open",
                   "sys", "sysobjects", "syscolumns",
                  "table", "update"};

繰り返しますが、このようなカスタムクエリを作成できるのはadminだけです(そして、彼はおそらくDBを完全に制御できます)。

どんな助けでも大歓迎です。

ありがとう

3
AaronS

削除、作成、実行など、サニタイズするリストを提供しています...

ただし、 "SELECT"アクセスのみが必要な場合は、クエリを実行しているユーザーが必要としない権限を削除する方が簡単です。 (すべての特権ではなく、最も低い特権)

私があなただったら、私はストアドプロシージャを定義するでしょう。 Webアプリケーションでこれが難しい場合は、パラメーターを使用するパラメーター化SQLを試すことができます。

自分自身をサニタイズしてから、データベースに直接クエリしないでください。パラメータ化されたSQLは非常に柔軟であり、通常は動的SQLを使用する場合よりも安全な環境になります。

また、エラーを開示しないように注意してください。 (私はそれがあいまいさによるセキュリティであることを知っていますが、それを使用して余分な時間を獲得すると、それを検出できる可能性があります。)

13
Lucas Kauffman

ユーザーからのスターター、更新/削除の拒否などの読み取り専用アカウント。

個人的には、そのようなものにストアドプロシージャを使用するのが好きです。そして、もしあなたがあなたのアプリケーションを信頼することができれば、あなたがあなたの管理者を信頼できない場合、彼らはおそらくあなたがあなたのアプリケーションであれば、彼らはおそらくバックエンドでしたいことを何でもできるでしょうか?

2
Wayne In Yak

最善の解決策は、すべてのデータに対する書き込み権限、一部のデータに対する読み取り専用権限、および他のユーザー(管理者であるespユーザー)のパスワードハッシュなどの安全なデータに対する読み取り権限がない、非特権データベースアカウントを使用してすべてのクエリを実行することです。 。

エンドユーザーがSQLクエリへの入力を提供している場合は、文字列の書式設定/連結ではなく、バインドされたパラメーターを使用していることを確認してください。これにより、エンドユーザーがSQLインジェクション攻撃でクエリの種類を根本的に変更できるようになります。

多くの場合、ブラックリストは非常に微妙にバイパスされる可能性があります。たとえば、updateをブラックリストに登録する場合は、UpDaTeがブラックリストに登録されていること、およびデータベースがブラックリストを渡した後にASCII文字にマッピングされる可能性があるUnicode文字(úpdãtÊなど)を含む文字列を確認してください。

また、データを変更する以外に、悪意のあるエンドユーザーが行う可能性のあるさまざまな他の脅威にも注意してください。データを盗むことから(例えば、LIMIT 100)または非常に時間のかかるクエリからのサービス拒否。

1
dr jimbob

ユーザーをdb_datareaderデータベースロールに配置します。 VIEWSを使用して、クエリできるものを制限します(CREATE VIEWステートメントでSELECT *ではなく、SELECT列リストを指定してください)。ビューとそれらが提供するものを公開します。ユーザーはビューから選択して、必要なデータを取得します。

0
jl01