既然你不能把文件放在你的public_html目录中的任何地方,那么你将不得不采取恐惧/憎恨的“安全隐患”方法
>创建一个随机命名的子目录,将文件存储在:public_html / RANDOMGARBAGE中
>确保目录不可浏览.禁用目录浏览(如果可以),并在其中放置默认文档(index.html?),因此即使打开浏览,您也不会获得目录列表.
>不要使用可猜测的名称存储文件.而不是使用数据库ID存储它们,而是使用盐渍的散列名称存储它们:$crypted_filename = sha1($real_filename.’一些难以猜测的盐文本’); (当然,如果你需要,这会使它更复杂).将原始文件名存储在数据库中.所以你最终得到的结果如下:
的public_html / RANDOMGARBAGE / 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145
的public_html / RANDOMGARBAGE / 7ec1f0eb9119d48eb6a3176ca47380c6496304c8
>通过PHP脚本提供文件 – 永远不要直接链接到哈希文件名
下载
那么:
$fileID = (int)$_GET['fileID'];
$crypted_file = sha1($fileID . 'some hard-to-guess salt text');
$full_path = 'public_html/RANDOMGARBAGE/' . $crypted_file;
if (is_readable($full_path)) {
if(user_is_allowed_to_see_this_file()) {
/// send file to user with readfile()
header("Content-disposition: attachment; filename=$ORIGINAL_FILENAME");
readfile($full_path);
} else {
die("Permission denied");
}
} else {
/// handle problems here
die("Uh-oh. Can't find/read file");
}
这样用户永远不会看到你的“s00per seekrit”文件名是什么,他们只会看到他们的浏览器命中… php?fileID = 37并开始下载秘密文件.pdf
除此之外,您可以偶尔将特殊子目录重命名为其他内容,以及更改salt文本(然后需要使用新的sha1值更新所有散列文件名).