ダウンロード サーバーをより堅牢にする方法を考えています。今のところ、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()?
質問が一般的であることは理解しています。どうすれば安全に行うことができますか?