7

有効な式を含む文字列のリストがありますSQL
データベースを変更しないものだけを実行する必要があります。
これを行う最良の方法は何ですか?次のようなことをするだけです:

if(sqlQuery.contains("DELETE")){  
  //don't execute this
}

悪いハックのようです

更新:
これをより具体的にします。許可されているクエリ
のリストが既にあります。SQLこれらだけが実行されるようにしたい。
これらに対してどのように一致させるのが最善でしょうか?

4

3 に答える 3

5

これを行う最も簡単で最良の(最も包括的な)方法は、読み取り専用ユーザーを作成し、そのユーザーのみを使用してデータベースに接続することです。SQLServerでは、これを行う最も簡単な方法は、ユーザーを作成し、組み込みの「db_datareader」ロールに追加することです。これにより、SELECTのみが許可されます。

そして、あなたは単なるDELETE、INSERT、またはUPDATE以上のものについて心配する必要があります。また、ストアドプロシージャの呼び出しにも注意する必要があるため、安全のために、実行権限、ALTER権限、GRANT権限なども削除する必要があります。

編集:これを実行するだけです...

CREATE LOGIN [user] WITH PASSWORD='password', DEFAULT_DATABASE=[your_db], CHECK_POLICY=OFF
GO
CREATE USER [user] FOR LOGIN [user]
EXEC sp_addrolemember N'db_datareader', N'your_db'
GO
于 2012-11-02T13:42:58.303 に答える
2

DELETEデータベースを変更する可能性のあるSQL命令はこれだけではありません。INSERT間違いなくそうするでしょう、そしてUPDATEそうかもしれません(あなたの正確なクエリに依存します)。したがって、文字列を分析するだけでは、これを行うのは難しい方法かもしれません。

パフォーマンスが実際に問題にならない限り、トランザクションを開始し、命令を1つずつ実行し、各行の影響を受ける行の数を確認して、最後にトランザクションをロールバックすることができます。その後、0行に影響を与えたステートメントのみを実行します。

さらに、データベースのドキュメントを確認してください。一部のRDBMS-es(Oracleなど)はALTER TABLEDROP TABLEなどのDDLステートメントのロールバックをサポートしていません...

于 2012-11-02T13:19:40.773 に答える
2

与えられた SQL の内容をチェックするだけでレコードの改ざんを防ぐ確実な方法はないと思います。たとえば、「更新」という値を持つフィールドがあり、一部のユーザーがこの値を含むすべての行をクエリしようとしても、「ブラックリストに登録された」文字列が含まれているため、SQL は実行されません。唯一の安全な方法は、レコードを変更する権限をまったく持たないユーザーで SQL を実行することだと思います。

于 2012-11-02T13:33:52.917 に答える