SQL ステートメントを解析して、SELECT ステートメントのみが含まれていることを確認する良い方法はありますか? C#、System.Data.SqlConnection、および MS SQL Server を使用しています
5 に答える
以外のことを行う権限を持たないユーザーとしてデータベースに接続する必要がありますSELECT
。
このようにして、非SELECT
ステートメントは実行できなくなります。
これは、SQL Server のパーサーを複製することを除けば、可能な限り最も安全なソリューションです。
正規表現を思いつくことができると思いますが、100% 安全ではない可能性があります。
これを行う最善の方法は次のとおり
です。 1. ストアド プロシージャとビューを作成し、ユーザーの権限をそれらのみを使用するように制限します。(および特定のテーブルの SELECT ステートメント)
2. データ抽象化レイヤーを構築します。他の誰かではなく、あなたがクエリを作成します。公開しているメソッドの一部のみに他のユーザーがアクセスできるようにします。
3. LINQ to SQL を使用しますが、DataContext オブジェクトを隠すため、データベースに変更を加えることができません。
SQLの解析が解決策になると思います: 別の質問から
SELECT ステートメントはステートメントの最初にある必要があるため、文字列をチェックして、最初の 6 文字が SELECT かどうかを確認できます。
if (stringSql.Substring(0, 6).ToUpper() == "SELECT")
{
//execute statement
}
ステートメントが SELECT キーワードで始まっていることを確認してから、リテラル文字列の一部ではないセミコロン (別の SQL ステートメントを開始することになる) がステートメントに含まれていないことを確認してください。