2

ユーザーが 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-ratelimiturlopen().

編集:関連する回答

4

1 に答える 1

0

これには重大なネットワーク I/O が含まれる可能性があるため、作業を「ファイル ダウンロード ワーカー」に移します

ファイルシステム

次の部分は、メインの Django デプロイメントをそのワーカーから分離すると、特権のない別の OS ユーザーを使用してワーカーを実行できることです。これは、chrootまたは別の刑務所内で実行できます。これにより、ワーカーがファイルシステムで見ることができるものを制限する必要があります。

ネットワーク インターフェイス

ネットワーク インターフェイスに関しては、ファイアウォール ルールを設定できます。たとえば、Linux OS では、iptablesでユーザーごとおよびネットワーク インターフェイスごとにルールを設定できます。そのため、ワーカーのユーザーがネットワーク上でできることを制限できます。

結論

要するに、メインの Django アプリのアクセス許可を継承するのではなく、タスクを別のワーカーに移動し、コンピューター リソースへのアクセスが非特権で制限されているということです。ワーカーに与えられる唯一の特権は、インターネットに接続し、いくつかのファイルを取得し、それをディスクに書き戻すことだけです。

于 2015-11-02T06:45:43.843 に答える