web-dev-qa-db-ja.com

ダウンロードしたファイルがディスクに保存されたときのブラウザイベント

ユーザーにダウンロードする機密ファイルがあり、各ユーザーは特定のファイルを1回だけダウンロードできます。ダウンロードが失敗した場合、再ダウンロードを許可しますが、それ以外の場合は許可しません。

サーバーでのファイルのダウンロードrequestのログ記録/処理に依存するだけでは十分ではありません。ファイルが完成し、サーバーの適切な場所にあることを確定的に知る必要があります。私のユーザーの多くは、頻繁に接続が切断される環境で作業しているためです。

これが機能する最も簡単な方法は、ブラウザーが[名前を付けて保存...]ダイアログから "ファイル保存"イベントを公開し、ダウンロードページのJavaScript関数(サーバーにポストバックできる)に接続できる場合です。しかし、直感では、ブラウザがサンドボックスの外に潜入しているため、ブラウザがこの機能を公開した場合、セキュリティホールが存在する可能性があることを示唆しています。これが可能かどうかはわかりません。

I foundseveralotherquestionsthis area 、しかし特にこの問題については何もない。

何か案は?

編集:私は元の質問で「セキュリティ」という言葉を使用するべきではありませんでした。申し訳ありませんが、赤いニシンを引き起こしてしまいました。

編集2:私の「セキュリティ」の言い回しで、人をトピック外の技術的なセキュリティ問題に誤解させましたが、どちらも「いいえ、ブラウザのサポートがない」という私の疑いを確認しましたそれ。"彼の最初の文が私が探していたものであったので、私は答えで最初のコメンターをマークしています。皆さんありがとう。

20
David Pope

JavaScriptにはそのようなブラウザイベントはありません。たとえあったとしても、ユーザーのブラウザを信頼してセキュリティを提供することはできません。

GUID=を使用して、ダウンロードごとに一意のURLを生成することをお勧めします。たとえば、次のことができます。

  • uRLを特定の期間のみ有効にする
  • 一意のURLに関連付けられた特定のIPアドレスからの転送のみを許可する
  • サーバー側のコードに、一意のURLのコンテンツが完全に転送されたことを検出させ、URLを無効にします。

最後の箇条書きを明確にしましょう。 Javaを使用しているとしましょう-EOFまでループでin.read(buffer)out.write(buffer)を実行します。クライアントが切断すると、IOExceptionの実行中にout.write()を実行すると、中断されたダウンロードからダウンロードが成功したことを確認できます。他のプラットフォームでは、接続が失われたかどうかを確認する方法があるはずです。

EDIT:リンクした質問の の承認された回答で概説されているトリックを使用して、ブラウザイベントを実際に発生させることができます 。ただし、ダウンロード数を制限するための信頼できるソリューションではありません。

9
Martin

これは良い解決策です:

http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

これは基本的に、ダウンロードしたファイルの応答ヘッダーにCookieを設定することで機能するため、JavaScriptはこのCookieの存在を定期的に確認できます...

19
rekna

ファイルを「1回だけ」ダウンロードできることが重要なのはなぜですか?ファイルがダウンロードされると、それはコピーされる可能性があるので、同じユーザーにファイルを複数回ダウンロードさせることには本当にセキュリティ上の問題がありますか?

そうでなければ、あなたはこのようなことをすることができます:

  1. 特定のファイルをダウンロードするための一意のURLを生成します。 (GUIDを使用して、必要に応じて難読化します)
  2. そのURLをユーザー情報(ブラウザの種類、IPアドレスなど)と時間ウィンドウに関連付けます。そのユーザーからのダウンロードのみを許可します。
  3. ウィンドウは、転送が失敗したことをユーザーが認識し、1回または2回再試行するのに十分な長さである必要がありますが、それ以上は長くありません。

最終結果は次のとおりです。

  1. ファイルが意図された受信者によってのみダウンロードされていることを合理的に確信できます。
  2. 受信者が短いウィンドウの間にのみファイルをダウンロードできることを確認できます。
  3. 同じユーザーがファイルを複数回ダウンロードする可能性がありますが、誰が気にするのですか?最初のファイルのローカルコピーを作成するのと同じです。

本当に心配な場合は、各ダウンロード要求をログに記録し、複数回ダウンロードされたファイルのスケジュールされたレポートを実行してください。何か怪しいと思われる場合は、セキュリティログを調べたり、ユーザーと話したりすることができます。

2