0

ユーザーがアップロードした画像(.jpg)を安全に保存したい。より良い結果とパフォーマンスを得るには、どちらに進むべきか混乱しています。私が見ることができる最良のオプションは次のとおりです。

1. Store the images in database. 
//problem : database size get large. lagging performance 

2. Store them in a folder in encrypted manner. 
//problem : Encryption and decryption on large file slows it down.

3. Place the image as it is in a folder behind 'public_html' in root directory. 
//problem : I am unsure as they aren't encrypted.

どちらがより良い方法でしょうか、それとも私が今気づいていない他の「ベストプラクティス」はありますか?

4

4 に答える 4

2

それはすべて、あなたがそれで何をしたいのか、そして何に対してそれを保護したいのかという問題です.

画像を介した攻撃ベクトルの可能性はありません。したがって、2 つの可能なオプションが表示されますが、最初に基本事項を説明します。

イメージ自体をファイル システムに保存します。リレーショナル データベースにファイルを格納するのは非常に非効率的です。

  • ファイル自体を保持し、コンテンツの MD5 または SHA1 ハッシュに名前を変更します。
  • ファイルシステム上のファイルの場所にリンクするデータベースエントリが、必要なメタデータ (所有者、色、カテゴリなど) とともに作成されます。
  • ファイルは、ハッシュの最初の文字に基づいてフォルダーに分割されます (画像が多数ある場合は、2 文字または 3 文字に基づいてディレクトリに分割することを検討してください。

ここで、アクセス スキームに応じて、ファイルをパブリックに配置し、単純にリンクすることができます (ファイル名が複雑であるため、難しいと推測されます)。または、ファイルをパブリック ルートの外に配置して、PHP ファイルを作成することもできます。それらにアクセスし、権限を確認した後にそれらを提供します。

于 2013-11-14T20:56:16.180 に答える
2

画像を保護されたディレクトリに保存し、.htaccess.
deny from all

ユーザーが画像をアップロードするときに、画像ストアに一意のファイル名を作成する必要があります。次に、特定のイメージ ID を使用してイメージ ハンドラーを使用してイメージを提供できます。

<?php 
    header('Content-Type:image/jpeg'); 
    if(authorized && isset($_GET['id']))
    {
        flush();
        readfile('someimage' . $_GET['id'] . '.jpg');
    }
?>
于 2013-11-14T20:58:05.273 に答える
0

3、web ルート外のフォルダーに保存します。

サイズが大きすぎる場合、またはフロント エンド ノードの数が増えた場合に、将来別のマシンに格納する必要がある可能性があるため、ディレクトリが構成オプションであることを確認してください。

2 ヒント:

  1. ファイルの名前を GUID または固有のものに変更し、実際の名前をデータベースに保存します。これにより、重複するファイル名の競合が防止されます。
  2. すべてのファイルが同じディレクトリに存在しないように、フォルダー システムを作成します。フォルダ内のファイル数には制限があります。そしてパスをデータベースに保存します。(つまり、フォルダ [YYYY][MM][DD][File.Ext] の日付ベース)
于 2013-11-14T20:39:42.597 に答える