私はプロジェクト (プライベート、ASP.net Web サイト、https で保護されたパスワード) を持っています。要件の 1 つは、ユーザーがデータベースを直接クエリする Sql クエリを入力できることです。これらのクエリがデータベース自体に損害を与えたり、アクセス/更新できないはずのデータにアクセスまたは更新したりしないようにしながら、これらのクエリを許可できる必要があります。
実装のために次のルールを考え出しました。
- Select Table/View および Update Table の権限のみを持つdb ユーザーを使用します(したがって、drop/alter/truncate/insert/delete などの他のコマンドは実行されません)。
- ステートメントが「Select」または「Update」という単語で始まっていることを確認します
- (Regex を使用して) 単一引用符、空白、および文字で囲まれていないステートメントにセミコロンのインスタンスがないことを確認します。(ここで考えられるのは、2 番目のクエリを含めることができる唯一の方法は、入力文字列の一部ではないセミコロンで最初のクエリを終了することであるということです)。
- (正規表現を使用して) ユーザーが、クエリ/更新されている、結合に含まれているなどのテーブルにアクセスする権限を持っていることを確認します。これには、サブクエリが含まれます。(これを達成する方法の一部は、ユーザーが実際にはデータベースに存在しないテーブル名のセットを使用することです。クエリ解析の一部は、正しい対応するテーブル名をクエリに代入することです) .
何か不足していますか?
目標は、ユーザーが適切と思われる方法でアクセスできるテーブルをクエリ/更新できるようにし、データベースを損傷する偶発的または悪意のある試みを防ぐことです。(そして、ユーザーがSQLを生成することが要件であるため、クエリをパラメータ化する方法や、私が知っている組み込みツールを使用してサニタイズする方法はありません)。