ユーザーが URL を指定して Web から画像をアップロードできるようにしたいと考えています。CORSの問題とホットリンク防止の可能性があるため、クライアントに画像を取得してアップロードさせることができないと思うので、サーバーにそれを行わせています。
最大の懸念は、ユーザーが単に入力することfile:///home/user/secret_image.jpg
です。この URL はサーバーに送信され、django はそれをローカル サーバー側のファイルとして喜んでフェッチし、世界が参照できるようにホストします。外部リソースへのリクエストを制限する方法はありますか? このアプローチを安全にするにはどうすればよいですか (少なくとも -ish)?
その他の懸念としては、ユーザーがローカル アドレスに解決されるホスト名を提供したり、ローカル アドレスへのパブリック URL リダイレクトを提供したりすることがあります。通常はアクセスできない LAN 上の他のデバイスにもアクセスできます。
URL テキストのフィルタリングはオプションではありません。おそらく、urllib の続行を許可する前に、IP がゲートウェイにルーティングされ、宛先がサブネットの外部にあることを確認できます。リダイレクトをブロックすることもできますが、これは場合によっては便利な機能になる可能性があるため、IP を再チェックするリダイレクト ハンドラを作成することもできます。現在、これはパッチ作業のように感じられ始めており、すべてのケースに対応する優れた堅牢なソリューションではありません。
また、ファイルが巨大な場合のような基本的なことも行ってread(max_size)
おり、python-magic を使用して MIME タイプをチェックし、拡張子を選択しdjango-ratelimit
、urlopen()
.
編集:関連する回答