1

ダウンロード サーバーをより堅牢にする方法を考えています。今のところ、https 上にサーバーがあり、ランダムなハッシュで名前が付けられ、データベースによってインデックス化された zip ファイルを保存しています。サーバー上のディレクトリを直接参照して手動でダウンロードすることを避けるために、含まれるディレクトリは一覧表示 (htaccess) を許可しません。

Java アプリはファイルの説明を表示し、ユーザーがダウンロードしたい場合は、ダウンロードをクリックするだけです。Javaアプリは、そのユーザーがダウンロードを許可されている場合、サーバー上の私のPHPスクリプトに認証情報を送信し、PHPスクリプトはそれらをチェックし、そのユーザーがそのファイルをダウンロードすることを許可されているかどうかを再度チェックし、インデックス付けされたDBからfilename.zipを取得しますユーザーがダウンロードしたいファイル ID を返し、そのファイル名をエコー バックします。Java アプリはそのファイル名を読み取り、次を使用してファイルをダウンロードします。

Url url = new URL("https://myserver.com/assets/theAssetToDownload.zip")
URLConnection urlConn = url.openConnection();

InputStream is = urlConn.getInputStream();
FileOutputStream fos = new FileOutputStream("test.zip");

byte[] buffer = new byte[4096];
int len;

while ((len = is.read(buffer)) > 0) {
    fos.write(buffer, 0, len);
}

(コードを短くし、try/catch、is/fos.close() などが必要)

これまでのところ、うまく機能しています...しかし...誰かがブラウザに直接URLを入力すると、承認の明確なチェックなしでファイルもダウンロードされます...

だから私は、PHP スクリプト以外はアセット ディレクトリにアクセスできないようにしようと考えました。繰り返しますが、これは単純な htaccess です。

しかし、ダウンロードはどのように提供されるのでしょうか?

それは私のPHPスクリプトのヘッダーと出力でしょうか?

header("Content-type: application/octet-stream");
header("Content-disposition: attachment;filename=test.zip");
readfile(test.zip);

その場合、Java側からどのように読み取るのですか? また、getInputStream()?

質問が一般的であることは理解しています。どうすれば安全に行うことができますか?

4

1 に答える 1

1

Web からはアクセスできないが Web サーバーからは読み取り可能な場所にファイルを保存し、htaccess を使用してすべての要求を php スクリプトにルーティングすることができます。それをあなたがすでに持っているもの(ヘッダー、readfileでの出力)、および認証と組み合わせると、それだけです。

于 2015-12-06T11:30:45.957 に答える