-1

これに関するドキュメントはあまり見当たりません。URLからサーバーにアップロードされた画像を取得しようとしています。理想的には物事をシンプルにしたいのですが、サーバーにファイルを保存して静的ファイルとして表示するのに ImageField を使用するのが最善の方法なのか、それとも簡単なのかについては 2 つの考えがあります。私はファイルをアップロードしていないので、それらを取得する必要があります。ホイールを再発明する前に、適切なコード例を誰か提案できますか?

http://www.xyx.com/image.jpgという URLを指定すると、その画像をサーバーにダウンロードし、名前を変更して適切な場所に配置したいと思います。人々がすでに行ったことの例を探しているので、私の質問は一般的なものです。これまでのところ、画像のアップロードに関連する例を見ただけですが、それは当てはまりません。これは単純なケースである必要があり、役立つ可能性のある標準的な例を探しています。

これは、ユーザーから画像をアップロードするためのものです: Django: サーバーへの画像のアップロード

そのため、フェッチと画像のプロセスを処理し、サーバーや ImageField に保存するだけの例はありますか。

4

1 に答える 1

2

画像を取得してファイルに保存するのは簡単です。

import urllib2
with open('/path/to/storage/' + make_a_unique_name(), 'w') as f:
    f.write(urllib2.urlopen(your_url).read())

次に、そのディレクトリからファイルを提供するように Web サーバーを構成する必要があります。

しかし、これにはセキュリティ リスクが伴います。

悪意のあるユーザーがやってきて、どこも指していない URL を入力する可能性があります。または、それはあなたの接続を受け入れるが応答しない独自の邪悪なサーバーを指しています. これは典型的なサービス拒否攻撃です。

単純な修正は次のとおりです。

urllib2.urlopen(your_url, timeout=5)

しかしその後、攻撃者は、接続を受け入れ、毎秒無期限に 1 行を書き出すサーバーを構築し、停止することはありません。はtimeoutそれをカバーしていません。

したがって、適切な解決策は、タスク キューを実行し、同じくタイムアウトを設定し、慎重に選択した数のワーカーを実行することです。これらはすべて、Web に面するプロセスから完全に独立しています。

別の種類の攻撃は、サーバーをプライベートなものに向けることです。例として、ポート 8000 で実行されている内部管理サイトがあり、外部からはアクセスできないが、独自のプロセスからはアクセスできるとします次にhttp://localhost:8000/path/to/secret/stats.png、貴重な秘密のグラフをすべて入力して表示したり、何かを変更したりできます. これは、サーバー側のリクエスト フォージェリまたは SSRF として知られており、防御するのは簡単ではありません。URL を解析してホスト名をブラックリストと照合するか、ホスト名を明示的に解決して、それがマシンやネットワーク (127.0.0.0/8 を含む) を指していないことを確認してください。

もちろん、受け取ったファイルが実際に画像であり、HTML ファイルや Windows 実行可能ファイルではないことを検証するという問題もあります。ただし、これはアップロード シナリオにも共通しています。

于 2013-09-20T21:10:19.470 に答える