2010-11-27 1 views
1

これはまったく仮説です。まさにそのアイデアは、私に卑劣な物語を与える。私はむしろすべての事態をカバーするデータベース管理UIを持っています。しかし、私はこれを安全に行うことが可能かどうかについて考える必要があり、すべての結び目で自分を縛ることになりました。したがって、疑問。信頼できるスタッフ用の「安全な」SQL - ブラックリスト、ホワイトリスト、上記のどれですか?

とにかく:私は私のウェブサイトの特定のユーザーが「生」のSQLを入力して、データベースの一部を検索できるように望んでいたとします

  • が信頼(およびログインして、明らかに)スタッフのみ
  • 読まない専用の関連するテーブル
  • へのアクセスに他のテーブル
  • への一切のアクセスを安全ではない/不許可にSQLを実行しているのない可能性について、偶発的またはそれ以外

すべての表には、関連する領域の接頭辞が付きます(例:videos_、photos_、forum_)。私は、これらのユーザーに特定のセクションへの読み取りアクセスを許可したいと思いますが、SQLを使って直接変更することはできません。

これらの信頼できるユーザーでも、すべてのフォーラム_テーブルからロックしたいと思うでしょう。そうしないと、すべてのユーザーのプライベートメッセージや管理フォーラムの投稿などを読むことができます。

"信頼できるユーザー"の要件は注意を払っていますが、これを表示または使用するには特定のユーザーグループに属している必要があります。それはもっと「安全なSQL」の部分です。

読取り権限のみを持ち、適切な表のみに異なるDBユーザーで接続するのと同じくらい簡単ですか?

forum_、DROP、ALTER、UPDATE、CREATE、INSERTなどをブラックリストに登録して、拒否しますか?

またはホワイトリストSELECT、FROM、WHERE、関連するテーブル名とフィールド名? field_name = "ここでの任意のテキスト"の必要性について考えるまで、それはより安全に思えます。

またはいくつかの組み合わせですか? (たとえ去勢されていることが分かっていても、「ブラックリストに登録された」SQLの使用をログに記録してください。)

あなたはそれにどのように対処しますか?実際にこれを安全に行うことは可能ですか?

答えて

1

多くのRDMSを付与または取り消す読み取り/書き込み/更新/削除...特定のスキーマの/テーブル、などのユーザーの特定のユーザー/グループの権限にテスト機能を提供しなければなりません(SQL Server用)は基本的にデータベースオブジェクトを含むデータベース内のコンテナ(テーブルなど - "dbo"が指定されていない場合はデフォルトスキーマ)です。セットアップが完了すると、ログインにアクセス権を割り当てることができます。これには、テーブルが追加されると自動的にスキーマを使用してアクセスが許可されます(または拒否されます)。

欠点は、実際にそれを先取りする必要があることです。すべての既存のテーブルをスキーマに移動するには、すべての名前を変更し、それに応じてすべての既存のコードを更新する必要があります。それでも、あなたがそれを行うならば、黒と白のリストを設定して管理するほうがはるかに簡単です。

3

ターゲットエンドユーザーがSQLに慣れていれば、クライアントアクセスツールにアクセスできるようにし、データベースへのログイン権限を使ってできることを制限するだけで、多くの時間を節約することはできません。

+0

これは意味があります。私はそのようなことが利用できない環境を想定していました。私の同僚の一人はphpMyAdminで厄介な経験をしていて、私たちのものの近くのどこにでも置いてほしくないと知っています。彼らが私がより良い仕事をするのをなぜ信じるのか分かりません... –

1

(あなたのDBMSに応じて)オブジェクトレベル(必要であればカラムレベルまで)の権限を使用してアクセスできるユーザを制限する必要があります。

新しいオブジェクト(テーブル、ビューなど)を追加するたびに、ブラックリストアプローチではなくホワイトリストに行くことをお勧めします。オブジェクトを設定するのを忘れた場合、悲しみに陥るのではなく、デフォルトで安全です。必要に応じてブラックリストに登録する。

3

insertdeleteなどのような言葉で...)手動filter悪い SQLしようとしないでください。それは恐ろしい計画のように聞こえる!

はあなたのデータベースは...

1

ホワイトリストのアプローチは行く方法です。
テーブルに対してビューを作成し、ベーステーブルに対するすべての権限を拒否し、ビューでのみ許可することができます。この方法で、誰がどこで何ができるのかを制御できます(つまり、そこに挿入を拒否し、更新を許可しますが、ここに挿入したり、このテーブルを完全に隠すなど)。
このアプローチでは、セキュリティ - それは外部ユーザーからデータベーススキーマを完全に隠し、後であなたのアプリケーションを悪用する可能性を減らします(そうです、このように起こります)。

関連する問題