$f = $_GET['f'];
//f = filename i.e file.mp3
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($f));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($f));
ob_clean();
flush();
如果我将所有mp3文件存储在根目录中,则此代码有效但如果我将它们存储在单独的文件夹(如/ files
)中则不会我尝试更改基本名称并添加$f
的路径,但没有运气
我有没有办法让这段代码从dir而不是root下载文件?
答案 0 :(得分:1)
那可能是因为basename
显式删除了除文件路径的文件名部分之外的所有内容。所以basename("foo/bar/baz.mp3")
产生“baz.mp3”。
正如其他人已经提到你编写PHP脚本的方式是一个主要的安全漏洞,因为现在有人可以做一些像“www.example.com/index.php?f=index.php”和你的脚本(假设它位于www.example.com/index.php)将提供自己的来源。通过一点创造力,您的脚本可以访问的任何外部文件都可以以这种方式下载。不太好,您确实需要将文件限制为允许路径的白名单。