在PHP中保护文件上传的好方法

在PHP中保护文件上传的好方法,php,security,file,upload,file-upload,Php,Security,File,Upload,File Upload,编写一个小应用程序,让用户上传一个文件(如图像、.doc或文本文件),作为发布/提交的一部分 我们当前的原型只是将文件转储到/{app_root}/files/,但当然,任何人都可以访问该文件,即使他们没有登录或使用该系统。目标是仅在用户已登录并且确实有权访问文件所属的帖子时才授予对文件的访问权(查看访问权) 因此,简而言之,我正在寻找一个好的方法来做到这一点 我正在考虑在/web/(http)文件夹之外创建一个文件夹,然后让PHP使用header()commans以某种方式呈现它,或者干脆将文

编写一个小应用程序,让用户上传一个文件(如图像、.doc或文本文件),作为发布/提交的一部分

我们当前的原型只是将文件转储到/{app_root}/files/,但当然,任何人都可以访问该文件,即使他们没有登录或使用该系统。目标是仅在用户已登录并且确实有权访问文件所属的帖子时才授予对文件的访问权(查看访问权)

因此,简而言之,我正在寻找一个好的方法来做到这一点

我正在考虑在/web/(http)文件夹之外创建一个文件夹,然后让PHP使用header()commans以某种方式呈现它,或者干脆将文件转储到数据库中?然而,我从来没有做过这两件事


虽然我怀疑我最终能找到答案,但这里有太多聪明的人,我认为有人会知道某种现有的类或函数库已经做到了这一点?

您必须执行以下操作:

  • 将所有文件移出webroot。您可以使用.htaccess禁用对文件夹的访问,但这不值得这么麻烦和潜在的安全风险。把它搬出去
  • 保留一个上传文件表,将用户的原始文件名存储在该表中。将文件重命名为
    $id.$ext
    ,依此类推。简而言之,您不希望在系统中使用用户的文件名
  • 准备一个脚本,
    download.php
    或其他脚本,获取文件ID,验证谁已登录,如果一切正常,则获取文件,将其读取到浏览器,并发送相应的下载头
  • 这些标题类似于:

    header('Content-type: application/octet-stream');
    header('Content-disposition: attachment; filename=usersuppliedname.txt');
    header("Content-Length: " . filesize('../safefiles/1.txt'));
    header("Content-Transfer-Encoding:  binary");
    readfile('../safefiles/1.txt');
    exit;
    

    如果您想允许恢复文件等,您可以这样做,但上面的操作应该可以做到。

    谢谢Paolo-我将您的建议与链接结合起来,并提出了自己的建议,因此您的代码和链接都非常有用。