如何允许用户下载存储在webroot外部的文件?

Sha*_*ron 7 php security file-upload download

我正在开发一个允许注册用户(可能是任何人)上传文件的系统.我阻止mime类型等尝试将文件限制为.doc,.docx和.pdf类型,但为了额外的安全性,它们被上传到webroot之外的文件夹.

然后,其他用户可以选择下载文件.我如何允许他们这样做?显然,我不能只是放入文件的链接,因为它在webroot之外.我不知道如何到达该文件!我认为我可以使用php文件函数来访问该文件,但是如何将其"提供"给请求它的用户呢?

这可能会带来什么安全隐患?

谢谢.

Pab*_*ruz 10

您需要一个执行以下操作的PHP脚本:

  1. 正确设置内容类型标题(取决于用户正在下载的内容)
  2. 正确设置内容长度标头(取决于文件大小)
  3. 打开文件进行阅读(可以使用fopen)
  4. 读取文件并将其内容输出到输出流
  5. 完成

你也可以使用readfile函数做基本相同的事情.这是PHP网站的一个例子:

<?php
$file = 'monkey.gif';

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, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>
Run Code Online (Sandbox Code Playgroud)