2011-10-07 24 views
0

私はPHPアプリケーションに画像を保存するには2つの方法があります:それらをデータベースに保存するか、固有の名前を持つフォルダに保存するかのどちらかです。データベースの接続を最小限に抑えるために、ユーザーがアップロードしたイメージを持つフォルダを保護するにはどうすればよいですか?php画像の保存 - セキュリティ

だから、基本的には、各ユーザーがプロファイルを持っていますし、彼らが望む誰とそれらを共有するために、ウェブサイトに自分の写真をアップロードします。私は次のようにそれらを格納することを計画:

/root/somefolder/{userid}{uniquenumber}.jpg 

私は現在のフォルダへのアクセスを防止するためにhtaccessファイルを設定した場合、それは十分でしょうか?または、私は他のセキュリティ上の注意を払うべきですか?

乾杯

+0

ディレクトリにWebアクセスできないようにし、スクリプトを使用してアクセス許可を確認し、許可されている場合は要求されたファイルをサーバーにすることができます。 –

+0

[DBに画像を保存する - そうかNay?](http:// stackoverflow。com/questions/3748/stored-images-in-db-yea-or-nay) –

+0

イメージをデータベースに入れないでください。確かに、 'BLOB'フィールドはそこにありますが、ファイルシステムもそうです! – Bojangles

答えて

5

いずれかのユニークな名前を持つデータベースまたはフォルダにそれらを格納するための

データベースは、データの小片ではなく、大きなブロブを格納するために最適化されています。通常のOSとWebサーバーでファイルの配信を処理させると、パフォーマンスが向上します。通常のファイルを使用すると、HTTPキャッシュヘッダーと範囲要求の処理を再実装する必要がなくなります。

しかし、いずれにせよ、これらのリソースは、URLを必要とするので、あなたの質問の2番目の部分は、まだ関連しています。

現在のフォルダへのアクセスを防ぐためにhtaccessを設定すると、十分でしょうか?

私はそれが十分になると思うはずです。ユニークな部分が長い場合(たとえば「somefolder/738b3093b898654bd3bbb9e3770e7fc0.jpg」)、パターンに従わない場合は、それを推測する方法がありません。

実際にファイル名にuseridが必要な場合以外は、避けてください。 Facebookには写真のファイル名の一部であるユーザープロファイルIDが含まれているので、写真ファイルをどこか別の場所で共有すると、Facebookのプロフィールと本名の検索が可能になります。私はそれが複数のオンラインコミュニティでストーカーと嫌がらせを引き起こすのを見ました。これはユーザーの責任ではありません。写真をどこかに投稿することで、実名や友だちの本名を知らされているとは考えられません。

もう1つの考慮事項は、このようなシステムが成長し、それがファイルの膨大な数を取得するように、それは彼らがただ1つのフォルダにしている場合、ファイルシステム上のひどい負担だということです。サブフォルダ内の名前の一部を繰り返したり分割したりすることで、そのことを簡単に防ぐことができます。たとえば、「somefolder/7e/7e8b3093b898654bd3bbb9e3770e7fc0.jpg」あなたには、いくつかの追加のセキュリティを希望した場合は

+0

本当に良い答え、ありがとう! – Shaokan

1

は、Webサイトの公開パス外のフォルダにファイルを保存することができます。 http://example.com/get_photo/?id=12345などのページを作成します。そのページでは、ユーザーがログインしているかどうかを確認し、写真の権限を持っています。実際のファイル名が検索され、レスポンスにそのファイルが含まれます。イメージ形式に正しいMIMEタイプヘッダーを発行する必要があることに注意してください。

1

実際には、多くのデータベースエンジンはとにかく別々のファイルとしてデータのBLOBを格納しますので、ちょうど最初の場所にファイルとしてあなたのイメージを格納します。これにより、データベースは非常に小さく、管理が容易になり、バックアップが容易になり、緊急時には復元が容易になります。