web-dev-qa-db-ja.com

SQLクエリを生成するときにクライアントのスキーマ情報をハッシュする方が安全ですか?

PhpMyAdminのように、データテーブル内の [〜#〜] crud [〜#〜] のAPIとプレゼンテーションが自動的に生成されるWebシステムを実装することを計画しています。これを実装する方法は、クライアントからの要求に基づいてSQLステートメントを作成することです。

  1. クライアントはサーバーからメタデータ(テーブル、列)情報を受け取ります。
  2. ユーザーが対話し、何かを実行します。たとえば、行の列を更新します。
  3. クライアントは、テーブルの識別子、行の識別子、列の識別子および新しい列データ。
  4. サーバーはクエリを作成し、実行します。

今私が興味を持っているのは、#3で強調表示されている単語です。プレーンな識別子(名前自体)を使用するだけで、知識のあるユーザーはリクエストを自分の意志に合わせて簡単に変更できます(たとえば、リクエストを別のテーブル/列に送信する)。私が考えるもう1つの重要なことは、読み取り専用のプレゼンテーションを作成することです。これには、並べ替えやフィルタリングなどのテーブルメタデータを含める必要があります。暗号化されていない通信を使用する場合、このようなメタデータを公開するのは非常に不気味です。

十分なセキュリティ(トランスポート暗号化(一部の場合を除く)、入力サニテーション、特権チェック)が実施されている場合、私の質問は次のとおりです。

  • ハッシュ(あいまい、おそらく別の方法で)テーブルのメタデータ (テーブル名および/または列名)追加のセキュリティを提供しますか?または、入力サニテーション(渡されたテーブル名が実際にテーブルであり、列と同じであることを確認します)と特権チェックで十分ですか?

ほとんどの場合(つまり、上記の読み取り専用シナリオを除く)、ユーザーはすでに 気密ハッチウェイ内 であることに気付きましたが、ハッシュによってセキュリティが向上するでしょうか?

3
Mark Garcia

それは隠すことによるセキュリティになるので、いいえ、セキュリティは向上しません。何度も何度も示されていますが、もしあなたの唯一の防御が「誰もそのメカニズムを知らないなら、一人がそれに遭遇するだけで、数分以内に何百人もの人々が知るでしょう。

それは物事を難しくするかもしれません、しかしそれはあなたの計画を難読化するのにただ一人の機知に富んだ人を必要とします。

3
Lucas Kauffman

ルーカスが指摘したように、名前を隠すことは単に難読化であり、私は同意します。ユーザーが特定のテーブル/列のみを編集できるようにする場合は、許可されたオブジェクトのみを変更できることを確認するセキュリティをプログラミングに実装する必要があります。ユーザーがあなたが提示したことだけをしようとすると思い込まないでください。ユーザーが可能な限りあらゆる方法でリクエストをいじることができる(そしてそうするだろう)と想定するのが最も安全です。

1
TTT