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

时间:2009-05-16 14:50:34

标签: php security file upload file-upload

编写一个小应用程序(以及其他内容)可让用户上传文件(,如图像,.doc或文本文件)作为其发布的一部分/提交。

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

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

我正在考虑在 / web / http )文件夹之外创建一个文件夹,然后使用PHP以某种方式使用 header() commans,或者,可能只是将文件转储到数据库中?但是,我从来没有做过任何一个。

虽然我怀疑我最终可以解决这个问题,但是在这里有太多聪明人,我想知道有人会知道某种现有的类或函数库已经这样做了吗?

1 个答案:

答案 0 :(得分:9)

您必须执行以下操作:

  1. 将所有文件移出webroot。您可以禁止使用.htaccess访问该文件夹,但不值得为此带来麻烦和潜在的安全风险。把它移到那里。
  2. 保存上传文件的表格,并在那里存储用户的原始文件名。将文件重命名为$id.$ext,依此类推。简而言之,您不希望在系统中使用用户的文件名。
  3. 拥有一个脚本,download.php或其他任何内容,获取文件的ID,验证谁已登录,如果所有内容都已检出,请获取文件,将其读取到浏览器,然后发送相应的下载标头。
  4. 这些标题类似于:

    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;
    

    如果你想允许恢复文件等,你可以get more fancy,但上面应该这样做。