2017-01-09 6 views
2

(信頼できない可能性のある)ランダムユーザーがアップロードしたファイルを保存します。私の主な関心事はセキュリティです。 MySQLデータベースにファイルを格納することは、SQLデータベースからロードするスクリプトなしではアクセス/実行できないため、権限のあるユーザーに対してのみ行うことができるため、最も安全な方法です。PHPでユーザーがアップロードしたファイル:データベースVSにファイルシステムに保存する

しかし、私はファイルシステムにファイルを格納することについて多くのことを読んだことがありますが、実際の説明はほとんどありません。私が見つけた唯一の欠点はパフォーマンスです。それは実際にはるかに遅いですか、私は知らない他の欠点がありますか?

答えて

2

データベースがディスク上のファイルよりも本質的に安全だと考えるのは間違いです。結局、データベースファイルです。また、通常はMySQLサーバをバストする方がシェルを介してマシンにアクセスする方が簡単です.MySQLはパスワードを使用し、適切に設定されていればシェルはSSH鍵のみを使用します。

その他の懸案事項は、データベースにバイナリデータをより多くロードするにつれて、適切にバックアップすることはかなり高価になることです。 MySQLは差分バックアップを非常にうまく行いません。一方、ディスク上のファイルは、rsyncのようなツールを使用して素早く効率的に複製します。

ファイルシステムは、驚くことではないが、大量の任意のバイナリデータを格納するのに非常に優れています。リレーショナルデータベースはそうではありません。さらに、オペレーティングシステムレベルでは、ファイルをディスクからできるだけ効率的にサービスを提供するために多くの作業が行われています。

  1. ファイルを開く:

    はここでコンピュータがディスクからファイルを取得し、それをネットワークに送信するために行う必要がありますものです。

  2. sendfileのようなシステムコールを作成します。
  3. カーネルは、ディスクからの読み取り、ネットワークデバイスへの書き込みを処理します。

    1. オープンMySQLの接続をして認証:

    ここでは、MySQLのようなデータベースからそれを送信するためにしなければならないものです。

  4. SELECT file FROM tablename WHERE id=?
  5. のようなコマンドを作成し、MySQLバイナリプロトコルでエンコードし、ネットワーク接続を介してMySQLサーバに送信します。これはローカルでもリモートでもかまいません。遠隔の場合はさらにオーバーヘッドが関係します。
  6. サーバーはコマンドを受信して​​解読し、まずコマンドを解凍します。
  7. サーバーはコマンドを解析して解釈する必要があります。
  8. サーバーは、インデックスファイルと同様に問題のテーブルを開いて、そこでデータの場所を探します。
  9. 見つかったら、データはMySQLの行形式からデコードし、次にMySQLの結果形式で再エンコードする必要があります。
  10. そのデータは、ワイヤを介してクライアントに返送されます。
  11. クライアントは、結果セットを受信して​​デコードする必要があります。
  12. クライアントは、関連するバイナリ情報を抽出する必要があります。
  13. クライアントは、ネットワーク接続をバッ​​クアウトするために、そのデータを別のバッファにコピーする必要があります。
  14. カーネルは、そのデータをユーザ空間からカーネル空間に転送し、それをネットワークドライバに送る必要があります。

これはかなり多くの作業であり、ユーザスペースとカーネルスペースの境界を何度も超えているため、必須のコピーが多数含まれています。

ドキュメントストアが必要な場合は、MySQLのようなRDBMSではなくRiakのように見てください。

1

ウェブサイトの運用の人々の一般的な経験は、ファイルシステム上にアップロードされたファイルを保存すると、より高速な

  • 、およびデータベース列に格納するよりもアップし、より良い

  • 尺度であるということです。

    なぜですか? WebサーバーとWebキャッシングプロキシサーバーは、ファイルシステムからユーザーにファイルを配信するように設計されています。 Webサーバーのクラスタは、1つのサーバーと同様に、これを非常に効率的に実行できます。

    dbmsからファイルを配信すると、ボトルネックになります。通常、複数のWebサーバーと1つのdbmsがあります。さらに、BLOBデータは通常のデータより処理が遅くなります。

    これはセキュリティの問題が解決されるような広範な技術です。彼らは本当の問題ですが、解決されます。最大の問題は、プライベートファイルのパス名を推測する悪意のある人の容易さです。

  • 関連する問題