2009-11-29 15 views
8

ファイルの拡張子を確認して、MIMEタイプを指定します。ファイルのアップロードを安全にするために何かできることはありますか?PHPでファイルを安全にアップロードするには?

アバターのため(すべての画像は1つのフォルダにあります)私はhtaccessを使用してphpの実行を禁止することを考えていました。ちょうどそこにあるPHPファイルを入れました。どう思いますか?

答えて

19

ファイル拡張子もMIMEタイプも、画像ファイルを扱っている100%のセキュリティを提供できません。しかし、ファイルを実行しない限り(例えばinclude()を使用して)、それは問題ではなく、PHPコードなどをチェックする必要はありません。偽造された画像ファイルを使用して想像できる唯一のセキュリティ違反は、ブラウザのレンダリングエンジンを悪用するものです。これは、サーバー側から効果的に保護することは不可能であり、ブラウザのベンダーの責任です。

アップロードを処理するときにis_uploaded_file()move_uploaded_file()を使用することを確認している限り、少なくとも画像フォーマットの前面には問題はありません。下の@bobinceの投稿を読んでリンクをたどってください。ファイルを扱う際には、他のセキュリティ面に関する素晴らしい情報がたくさん含まれています。

ただし、GDのimagecopyを使用して、画像を新しい画像コンテナにコピーすることができます。これにより、ファイルに含まれているID3やその他のヘッダー情報が消去され、攻撃の試みが破棄される可能性があります(GDはおそらくこのようなファイルを枯渇させ、エラーを返します)。これはGIF、JPEG、PNGの場合にのみ有効です。アルファチャンネルやカラープロファイルの問題などいくつかの問題が発生する可能性があります。

+0

+1画像をコピーします。 –

16
  1. ユーザが提出したファイル名はまったく使用しないでください。 «乱数».jpegのような新しいものを作りなさい。 'サニタイズ'ファイル名は、特にアプリケーションがWindowsサーバー上で動作する必要がある場合は、思うより難しいです。

  2. イメージの場合、非常に信頼性の低いファイル名とMIMEタイプの送信を見るのではなく、画像のファイルタイプを判断するにはPHP getimagesize関数を使用します。画像として解析されないアップロードを許可しない。

  3. ダウンロードするファイルの場合、Content-Disposition: attachmentヘッダーを使用して、HTMLコンテンツのIEスニッフィングを停止し、ブラウザに表示します。

  4. インラインで表示する必要のあるファイルの場合は、メインサイトとは異なるホスト名から配信する必要があります。そうでないと、内部のHTMLコンテンツがセキュリティコンテキストにクロスサイトスクリプティングできます。安全なファイルアップロード機能を作る

ハードです。 More discussion

+0

約3.、素晴らしいヒントと素晴らしいリンクを知らなかった。 –

関連する問題