38

私はDjangoを使用して、アクセス制御を使用したファイルのダウンロードに関する調査を行ってきました。私の目標は、特定のユーザーがアクセスする場合を除いて、ファイルへのアクセスを完全にブロックすることです。Djangoを使用する場合、X-Sendfileはこれを実現するための最適な方法の1つであることを読みました(他のSOの質問などに基づく)。DjangoでX-Sendfileを使用することについての私の基本的な理解は次のとおりです。

  1. ユーザーがURIを要求して保護されたファイルを取得する
  2. Djangoアプリは、URLに基​​づいて返すファイルを決定し、ユーザーの権限などを確認します。
  3. Djangoアプリは、「X-Sendfile」ヘッダーがサーバーのファイルパスに設定されたHTTP応答を返します
  4. Webサーバーはファイルを見つけてリクエスターに返します(Webサーバーも途中で「X-Sendfile」ヘッダーを削除すると思います)

Djangoから直接ファイルをチャッキングする場合と比較して、X-Sendfileは保護されたダウンロードを実現するためのより効率的な方法のようです(Djangoと比較してNginxを使用してファイルを提供できるため)が、2つの質問があります。

  1. X-Sendfileの私の説明は少なくとも抽象的に正しいですか?
  2. ファイルが保存されているディレクトリへの通常のフロントエンドHTTPアクセス(例:http: //www.example.com/downloads/secret-file.jpg )を提供しないと仮定すると、それは本当に安全ですか(つまり、私のpublic_htmlディレクトリに保存しないでください)?または、技術に精通したユーザーがヘッダーなどを調べて、ファイルにアクセスする方法(次に配布する方法)をリバースエンジニアリングすることはできますか?
  3. それは本当にパフォーマンスの大きな違いですか。Djangoから直接150Mbファイルの8bチャンクダウンロードを提供することでアプリケーションサーバーをダウンさせるつもりですか、それともこの種の問題ではありませんか?私が尋ねる理由は、両方のバージョンがほぼ等しい場合、完了したダウンロードの数をログに記録したり、ダウンロードの帯域幅を集計したりするなど、Pythonで処理できるため、Djangoバージョンの方が望ましいからです。

前もって感謝します。

4

1 に答える 1

26
  1. はい、それがまさにその仕組みです。
  2. 正確な実装はWebサーバーによって異なりますが、nginxの場合は、外部アクセスを防ぐために場所を内部としてマークすることをお勧めします。
  3. Nginxはファイルを非同期的に提供できますが、Djangoではリクエストごとに1つのスレッドが必要であり、並列リクエストの数が多いと問題が発生する可能性があります。

X-Sendfileの代わりにnginxのX-Accel-Redirectヘッダーを送信することを忘れないでください。詳細については、 http://wiki.nginx.org/XSendfileを参照してください。

于 2011-09-04T03:47:43.930 に答える