1
$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但没有运气

有没有办法让这段代码从目录而不是根目录下载文件?

4

1 回答 1

1

那将是因为basename明确剥离了文件路径的文件名部分以外的所有内容。所以basename("foo/bar/baz.mp3")产生“baz.mp3”。

正如其他人已经提到的那样,你编写 PHP 脚本的方式是一个主要的安全漏洞,因为现在有人可以做类似“www.example.com/index.php?f=index.php”和你的脚本(假设它位于 www.example.com/index.php)将提供自己的源。只要有一点创意,您的脚本可以访问的任何外部文件都可以通过这种方式下载。不好,您确实需要将文件限制在允许路径的白名单中。

于 2012-12-23T00:54:46.160 回答