-1

操作で使用するために特定のテーブルからデータを選択する任意の SQL 選択ステートメント (入力文字列として) を入力できるようにするインターフェイスがあります。このステートメントがデータベースに変更を加えないようにしたいのです。

string query = GetStringFromForm(...);

DatabaseStatement statement(query);

statement.execute();

while (statement.fetch(...))
    ...

これを実装する 1 つの方法は、適切な権限を持つ新しいデータベース ユーザーを作成し、そのユーザーの下でステートメントを実行することです。この新しいユーザーを設定し、新しいデータベース接続を作成する必要があるため、これは面倒です。

単一のステートメント MySQL 5.5 のアクセス許可を分離する方法はありますか? または、これを行う他の方法はありますか?

4

2 に答える 2

1

すべてに同じログインを使用してデータベースに接続しないでください。

少なくとも、このアーキテクチャには 3 つのログインを使用 する必要があります。

  1. テーブルなどを作成するための開発レベルのログイン
  2. アプリケーションを実行するためにアプリケーションで使用されるログイン
  3. ユーザー指定のクエリを実行するために使用されるログイン

つまり、アプリケーションのログインには、必要なテーブルの読み取りまたは書き込みのみが許可され、すべてのテーブルに対してすべてを実行するわけではありません。たとえば、アプリケーションのログインは、テーブルを作成または削除できる必要はありません。

これにより、コードの間違いによる影響が制限されるだけでなく、誰かがシステムをハッキングできる範囲(SQL インジェクション攻撃など) も制限されます

また、ユーザー固有のクエリを実行するためのログインには、SELECT 権限のみを付与する必要があり、使用できるテーブル/ビュー/関数に対してのみ付与する必要があることも意味します。彼らが権限を持っていない INSERT または DELETE を実行しようとした場合、エラーをキャッチしてvery naughty boy、RDBMS がユーザーに何かを損傷させないことを念頭に置いて安全であることをユーザーに伝えることができます。あなたがまだ彼らに許可を与えていないこと。


つまり、RDBMS には既にログイン権限のアーキテクチャがあります。これらを使用して、コードのさまざまな側面の権限と機能を制限します。

私はこの車輪を再発明しようとはしません。アプリケーションの脆弱性を明らかにする、見逃したトリックやハックがある可能性が非常に高いです。これが面倒だとおっしゃるのもありがたく思いますが、実際にはこれが正しい方法であり、信頼できる唯一の方法です。申し訳ありませんが、これがデータ セキュリティへの標準的なアプローチであることには理由があります。

(そして、私を信じてください。誰もあなたのシステムをハッキングしようとしていないとしても、最終的には誰かがスクリューボール クエリを入力するでしょう。誤ってセキュリティをバイパスし、データベースの豚の耳を作ってしまいます.)

于 2012-11-19T12:03:38.343 に答える
1

MySQL 5.6 では、次のことができます。

START TRANSACTION READ ONLY;

https://dev.mysql.com/doc/refman/5.6/en/commit.html

探しているものだと思いますが、使用するには 5.6 にアップグレードする必要があります。

于 2012-11-19T13:28:06.563 に答える