web-dev-qa-db-ja.com

ブログやその他のWebコンテンツに外部画像を添付できるようにしても安全ですか?

私は私のブログのコンテンツに添付されたすべての画像をフィルタリングしています:

  1. ファイル拡張子を確認します。
  2. $finfo = finfo_open(FILEINFO_MIME_TYPE);を使用してコンテンツタイプを確認する
  3. また、サーバーにイメージを一時的に保存し、getimagesize()を使用してサイズを確認した後、関数がfalseを返さない場合は削除します。

しかし、これらのチェックの後、私は画像を再チェックしません。

私に何が起きたの

1つのユーザープロファイルでは、ユーザープロファイルにアクセスするたびに、画像に自分のIPアドレスが表示されます。これは私がこの投稿に添付した例です:

enter image description here

今、私は、各リクエストで動的な画像を生成する可能性があるこのクローキングファイル攻撃のために、ユーザーが画像を添付することを許可することは危険であると結論付けることができます。

これを防ぐメカニズムはありますか?

または、ユーザープロファイルからすべての添付画像を削除して、サーバーに各画像を保存する必要があります

6
Akam

単純なプロフィール画像の場合は、 Gravatar (security.seが使用する)のような信頼できるサードパーティを使用することで、ほとんどのセキュリティ脅威を回避できます。リンクされた画像を " Web Bug "として使用することはリモート画像では避けられませんが、多くの人はGravatarが画像を追跡できることを気にしていません。攻撃者が制御するファイルをローカルに保存すると、他のセキュリティ上の脅威が発生します。

より一般的には、ユーザー制御のファイルをサーバーに保存したくない場合です。このタイプの脆弱性を悪用する良い例は、 PHPローカルファイルインクルード(LFI)脆弱性を使用してリモートコード実行を取得する を使用することです。攻撃者が制御したファイルを一時的に保存することも、LFI攻撃で悪用される可能性があるセキュリティ上の脅威です。

リンクが実際にgetimagesize()を使用した画像であることを確認すると、CSRFの防止に役立ちます。ただし、有効な画像ファイルでも、EXIFメタデータにPHP=タグを含めることができ、LFI攻撃で使用される可能性があります。このようなLFI攻撃は、PHPのopen_base_dir PHPがイメージまたは一時ディレクトリにファイルを含めることを防ぐための構成オプション。

7
rook

外部画像がコメントに「添付」されると、サーバーがそのようなことを処理する方法に応じて、次の2つのいずれかが発生します。

  • 画像を指すURLへの参照が保持され、サイトにアクセスするクライアントブラウザに返されるHTMLファイルに複製されます。
  • イメージはサーバーによってダウンロードされ、クライアントはサーバー上に保持しているコピーを受け取ります。

最初のケースでは、ページにアクセスするすべてのクライアントが自動的に画像をダウンロードし、反対側のサーバー(あなたのものではなく、画像を含むサーバー)は、おそらく現在誰が要求しているかに応じて、適切と思われる任意の画像を提供できます。 (これが「show my IP」画像の仕組みです)。あなた自身があなたのブラウザでページを閲覧したとしても、他のすべての訪問者が同じものを見ることを確信することはできません。また、イメージを含むサーバーのシステム管理者は、サイトのすべての訪問者のIPアドレスを収集できます。

最後に重要なことですが、悪意を持って作成された「画像」リンクが画像以外のものを指す可能性があり、不本意ながらサイトのすべての訪問者を 分散型サービス拒否 に登録します。

したがって、サーバーで画像のコピーを取得し、サーバーからの訪問者にのみそれを提供するほうが安全に思えます。これは、画像をデコードできることを確認し、「正常」なサイズにすることを強制する検証/変換ステップと組み合わせる必要があります。 [〜#〜] svg [〜#〜] のようなスクリプト可能な画像フォーマットに注意してください。

2
Tom Leek

彼らはあなたのIPを伝えるだけでなく、あなたが実行しているブラウザの種類やそこにあなたを送ったウェブサイト(リファラーヘッダー)を推測することもできます。

はい、画像のプライバシーを制御する唯一の方法は、プライバシーポリシーを制御するサーバーでホストされている画像を保持することです。この場合、画像をサーバーにコピーすることも含まれます。

1