12

尊敬されている同僚は、特にファイル構造が推測しやすい場合は、サーバーに画像を保存するのは安全ではないと主張しています(ユーザーが作成した画像ギャラリーがあるため、命名スキームは簡単です)。

代わりに、ルートの上に画像を保存し、freadまたはfputthroughを使用して画像を提供することをお勧めします。

リスクが何であるか、またはスクリプトを介して提供されたときにリスクが回避される理由を理解することはできません。
そのようなスクリプトのオーバーヘッドはばかげているように聞こえます。

サーバーに保存する前に画像をチェックする必要があることを理解しています。そのために、imagemagickを使用してマイナーな変換を行い、jpegに保存します。これにより、私が推測する限り、ドロスを取り除くことができます。

だから、SOの偉大な心への質問:

  1. パスをたどりやすいローカルに画像を保存することでセキュリティ上の問題はありますか?
  2. IMで画像を審査する私の方法は安全ですか?
  3. PHPを使用して画像を提供する理由はありますか?
  4. PHPを使用するオーバーヘッドは本当に大きいですか?
  5. CDNを使用すると、セキュリティに関しては違いが生じますか(私はしたくありません)?
  6. 私は何かが足りないのですか?

皆さんありがとう!

4

4 に答える 4

9

あなたの友人が言及しているのは、単に画像を提供するだけでなく、ユーザーが提供した画像を具体的に提供しているのではないかと思います。ユーザー提供のコンテンツを提供するには、セキュリティ上の問題がいくつかあります。画像の場合、画像のアップロードを使用してWebサーバーにコードを実行させる方法はいくつかあります。よりよく知られているもののいくつかは次のとおりです。

  • 「GIFAR」ファイル。基本的に、これはGIFファイルとjarファイルを連結したものです。GIFのインデックス情報が最初にあり、jarファイルのインデックス情報が最後にあるため、2つのファイルタイプを組み合わせることができ、結果は有効なGIFと有効なJARの両方になります。
  • 複数のファイル拡張子。Webサーバーは、国際化などを可能にするために複数のファイル拡張子をサポートしています。たとえば、page.html.frという名前のファイルは、フランス語バージョンのページにマップされる場合があります。サーバーの構成によっては、拡張子がimage.php.jpgまたはimage.php.123のファイルがPHPスクリプトとして実行可能になる場合があります。
  • バッファオーバーフロー。画像ファイル形式には通常、ファイルのサイズと形式を説明するヘッダーが最初に含まれています。サイズを過小評価すると、悪意のあるユーザーがバッファオーバーフロー攻撃を仕掛ける可能性があります。

これらの例はすべて、Webサーバーとしてコードを実行する機能につながります。サイトの機能にはファイルをアップロードする機能が必要ですが、URLから直接アクセスできないディレクトリにファイルを保存すると、ファイルの悪用が困難になります。同様に、WebサーバーのMIMEハンドラーではなくスクリプトを使用してそれらを提供することにより、画像が実行可能ファイルではなくデータのストリームとして扱われることが保証されます。

これだけのセキュリティがばかげているかどうかは、ユーザーの数、ユーザーに関して収集されたデータの性質、およびWebサイトの些細なことに依存します。少なくとも、攻撃者はユーザーを同期させる傾向があるため、ユーザーのパスワードを取得したいと考えています。パスワードがABC123であるサイトのユーザーは、おそらく電子メール、ソーシャルサイト、および銀行や金融のサイトで同じパスワードを使用します。パスワード以外に、ユーザーに関して収集するデータが個人を特定できるか、他の市場価値がある場合、または単に多数のユーザーがいる場合は、サイトがターゲットになると想定する必要があります。つまり、ユーザー提供の画像ファイルをより慎重に提供するか、それらを本当に適切に検証するか、またはその両方を行う必要があります。

imagemagickを使用することでセキュリティ上の懸念に対処できるかどうかについては、良い答えがありません。クイック検索で既知の脆弱性が多数見つかったため、少なくとも現在のバージョンを使用してください。既知の脆弱性の1つを悪用していなくても、心配する必要のあるファイルがimagemagickを爆破する可能性があることを忘れないでください。したがって、本当に優れたエラートラップを用意してください。

于 2011-01-31T03:02:51.287 に答える
7

画像が非公開である場合、つまり、画像を簡単に見ることができる場合は、誰かにすべての画像を自由に読んでもらいたくない場合は、それぞれに一意の名前を付けるだけで十分な場合があります。

数千を超える場合(そしてその可能性が高いと思われる場合)、それらが格納されるディレクトリ階層を作成すると、アクセスを高速化すると同時に、ランダム検索で見つからないように検索スペースを増やすことができます。次に例を示します。347168a5d9b4ac5eb386e396f68b2231.jpgというファイルを次のディレクトリに配置できます。ギャラリー内のユーザーの画像リストに添付されたデータベースに保存されている)は、ランダムなファイルが見つからないようにします。

于 2011-01-30T21:53:45.773 に答える
5

そのようなスクリプトのオーバーヘッドはばかげているように聞こえます。

こっちも一緒。画像が公開されている場合、これを行う理由はまったくわかりません。

それらが公的にアクセス可能でない場合(つまり、ログインしているユーザーのみがアクセス可能である必要がある場合)、同僚が説明する方法を回避する方法はありません(またはX-Sendfile、ログインチェックを実行した後に使用すると、必要なソフトウェアがインストール済み)。しかし、そうでない場合、これに必要なオーバーヘッドはクレイジーです。

于 2011-01-30T21:25:07.510 に答える
0

実際に画像を安全にする必要があると判断した場合は、これがコミックプロジェクトで使用したものです(基本的には、大量のコミックをディレクトリに配置し、しばらくすると、それらへのアクセスを許可します)一つずつ)

//check if image should be accessed by the current request...

$fh=fopen($my_image,"rb");

if($fh==NULL){
        exit();
}
rewind($fh);
header("Content-Type: image/png");
header("Content-Length: " . filesize($fn));
fpassthru($fh);

fclose($fh);
exit();
于 2011-01-31T03:26:59.390 に答える