これを行うための唯一の本当の安全な方法は作業ウェブディレクトリの外にファイルを置くとPHPファイルを介してユーザーにログインするためにそれらを提供することです。ファイルに.pdf拡張子を保持させたい場合は、htaccessを使って入ってくるpdf名をあなたのPHPファイルといくつかのパラメータに書き換えることができます。
.htaccessファイル:
RewriteRule ^([A-Za-z0-9-]+).pdf$ index.php?filename=$1 [L,QSA]
のindex.php:
if($logged_in){
$temp_file = $_GET['filename'];
//make sure no one is trying to inject anything funny
$temp_file = str_replace('.','',$temp_file); //prevent file path manipulation
$temp_file = str_replace('/','',$temp_file); //prevent file path manipulation
$temp_file = str_replace('%00','',$temp_file); //prevent null char injector
$temp_file = preg_replace('[^A-Za-z0-9]', '', $temp_file); //just to be sure
$file = STORAGE_DIR.$temp_file.'pdf';
if (file_exists(file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
}
else{
header('Location: '.LOGIN_PAGE);
exit;
}
こんにちはザフ、 お返事ありがとうございます。ファイル名は必ずしも推測するのは簡単ではありませんが、機密情報があり、権限のないユーザー(うまくいけば.htaccess)にそれらを完全に保護するソリューションを期待していました... – Zakman411
@ Zakman411私はファイルをデータベースに格納します。あなたはhtaccessのクッキーもチェックできます。 – zaf
'chmod 711/path/to/secret/directory'(ファイルサーバの所有者がウェブサーバのユーザアカウントではないと仮定します)のファイルシステムのアクセス権を使ってディレクトリ内容を読み取るWebサーバの機能を削除すると、ハッシュ名は特にうまく機能します。ディレクトリを移動するには 'x'実行アクセスのみが必要です。 – sarnold