2

質問は簡単です。PHPを使用して100%安全な写真アップロードスクリプトを作成するにはどうすればよいですか?考えられるすべての安全性のギャップを示すチュートリアルはありますか?

サイズについてのみ話しているので、この質問を見るように私に申し出ないでください。しかし、私は、誰もシェルやその他のものをアップロードできないことを確認したいと思います。それは100%安全な写真アップロードスクリプトを必要とする大きなウェブサイトだからです。

編集:または、メンバーが画像ハックなどのレセプタクルに写真をアップロードして、自分のWebサイトへのリンクをコピーできるようにする必要がありますか?100%安全だと思いますよね?

4

3 に答える 3

4

とても簡単です。アップロードされたすべての画像を、安全であることがわかっている画像フィルターを介して実行します。「画像エラーではありません」と表示された場合は、シェナニガンがあります。(簡単な例は、ID変換、またはJPEG品質正規化手法です。)重要なポイントは、元のファイルではなく、フィルターからの出力を実際に使用することです。

于 2010-06-24T21:51:31.803 に答える
4

考慮して注意する必要があること:

ファイル拡張子: Webサーバーは、ファイル拡張子を使用して、クライアントに送信されるMIMEタイプを判別します。許可する拡張機能のホワイトリストを使用する必要があります。あなたの場合、これは画像拡張になります。

LFI: Matchuがすでに述べたように、ローカルファイルのインクルードが問題になる可能性があります。アプリケーションに動的インクルードがある場合、これにより任意のファイルをインクルードできます。include($_GET['myfile']);PHPが任意に実行される可能性があります。したがって、 basename()を使用してそのようなインクルードを保護する必要があります。これは、画像にコメントが埋め込まれている可能性があるため、画像でも発生する可能性があります。

MIME-Type-Detection:これは実際にはあまりよく知られておらず、それに関する情報はあまりありません。IE <8には、MIME-Type-Detectionと呼ばれる機能があり、Content-Typeがコンテンツと一致しない場合、最初の256バイトを調べてタイプを推測しようとします。つまり、上部にコメントが付いたimage.gifというPNGファイルがある場合<script>alert('hello');</script>、IE <8はそれがHTMLであると見なし、JavaScriptを実行して、XSS攻撃を引き起こします。

画像のこの問題を防ぐために、WillihamTotlandが述べたアプローチを使用できます。getimagesize()を使用して、画像が有効かどうかを検出し、拡張子がタイプと一致することを確認することをお勧めします。

$image_filename = 'uploaded_image.gif';
$image_extension = substr(strrchr($image_filename, '.'), 1);

$mime_mapping = array('png' => 'image/png', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg');
$info = getimagesize($image_filename);

if (!$info) {
    exit('not an image');
}

if ($info['mime'] != $mime_mapping[$image_extension]) {
    exit('wrong extension given');
}

// all checks passed
// image can be saved now

この問題について書かれた記事がここにあります

于 2010-06-24T23:17:51.873 に答える
2

あなたが言ったように、問題に対処する別の質問があります。著者は、本物の画像ファイルのみを受け入れ、ファイルサイズを抑える限り、安全である必要があると述べています。これは、あなたができる唯一のことです。拡張子とMIMEタイプを確認し、必要な形式と一致しないものをすべて拒否します。RFIはまだありますが(ここではLFIに似ています)、健全性チェックを実行せずにファイルを無計画に含めない限り、問題はありません。

于 2010-06-24T21:53:09.277 に答える