1

そこで、ユーザーが写真コンテストに応じて写真をアップロードできる写真サイトを希望するクライアントがいます。技術的にはこれは問題ではありませんが、任意のユーザーが自分のサーバーに任意の画像をアップロードできるようにすることに伴うリスクを知りたいです。リスクが高い気がする…

私はこのようなものを使用することを考えていましたhttp://www.w3schools.com/php/php_file_upload.asp

匿名ユーザーがファイルをアップロードできるようにした場合、画像 (および潜在的に有害なファイル) がアップロードされるディレクトリをどのように保護できますか?

4

3 に答える 3

1

画像が実際の画像であることを確認したい場合は、gd http://www.php.net/gdを使用してロードできます

gd リソースが正しく作成されている場合、画像は実際の画像です

最初に次を使用して mime を検出します。

getimagesize($filename);

次に、たとえば、gd への jpeg ロードの場合:

$gdresource = imagecreatefromjpeg($filename);

警告なしで有効/作成された場合$gdresource、画像は有効で破損していません... getimagesize()(おそらく)破損した画像を検出するのに十分ではありません

$_FILES['blabla']['name']また、別の重要な注意事項...有効でないutf-8シーケンスが含まれている可能性があり(たとえば、utf-8を使用していると仮定して)、ユーザー入力として潜在的な攻撃メカニズムになる可能性があるため、依存しないでください

そのため、それも検証/サニタイズする必要があります

$originalFileName = $_FILES['blabla']['name'];
$safeOriginalFileName = iconv('UTF-8', 'UTF-8//IGNORE', $originalFileName);
// more additional checks here. for example filename is empty ""
move_uploaded_file(...., $safeOriginalFileName);

また、$_FILES['blabla']['name']ファイル拡張子が含まれていることに注意してください。これは正しくない可能性があります。そのため、それを取り除き、実際の正しい拡張子を使用する必要があります (以前に を使用して解決したものgetimagesize() + imagecreatefrom*()) 。

 $safeOriginalFileName = basename( $safeOriginalFileName ); // removes the extension
 $safeOriginalFileName = $safeOriginalFileName . ".jpg"; // correct extension

お役に立てれば :)


また、DaveRandomが指摘したよう$_FILES['blabla']['type']に、私が提案したように代わりに使用してください。getimagesize() + imagecreatefrom*()

于 2013-03-19T12:15:27.693 に答える
0

アップロードされたファイルは一時的な場所に保存されます。この場所は$_FILES変数で見つけることができます。

スクリプトがアップロードされたファイルを受け入れると、 を使用move_uploaded_file()して選択した場所に移動できます。

したがって、ユーザーが匿名であっても、アップロードをどうするか、アップロードを受け入れるかどうか (コンテンツ、サイズなどに基づいて) を制御できます。

さらに、(匿名の)ユーザーがファイルとそれに付随する詳細を提供します。したがって、これらの詳細をやみくもに使用すると、脆弱になります (悪意のあるユーザーは、正当にするために間違った詳細を提供している可能性があります)。したがって、これらの詳細が必要な場合は、(を使用する代わりに$_FILES) 自分で収集してください!

詳細については、PHP のドキュメントを参照してください。

于 2013-03-19T11:55:40.843 に答える
0

少し調べる必要がありますが、主なヒントは次のとおりです。

  • あなたが持つことができる基本的なセキュリティは、実際に画像の MIME タイプと拡張子をチェックすることです。これは確かに偽造するのは簡単ですが。

  • readfile()fopen()およびのようなバイナリセーフ関数を使用してくださいfile_get_contents()。どれが正確かは覚えていませんが、ファイルを処理する際にセキュリティ上の問題があったいくつかの php 関数があり、どれがどれであるかを調べて回避しました。

  • preg_match()読んでいるファイルにスクリプトに似たものがあるかどうかをチェックする、いくつかの関数があります。それらを使用して、隠しスクリプトがないことを確認してください。これにより、大きなファイルを読み取るとリソースが高価になる可能性があるため、プロセスが少し遅くなりpreg_match()ますが、あまり目立たないはずです

  • 電子メール サービスと同様に、アップロードされたファイルに対してウイルス対策を実行することもできます。

私が知る限り、損害を与える可能性のある画像には通常、XSS 攻撃を試みるための php コードや javascript などのスクリプト言語が含まれていますが、そこには多くの危険があるため、ファイルの安全性を 100% 保証することはできないと思います。しかし、新しい危険とそれらを回避する方法をすべて定期的に確認してください。

于 2013-03-19T12:07:55.533 に答える