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

One*_*erd 2 php security upload file-upload file

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

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

所以,简而言之,我正在寻找一个很好的方法来做到这一点.

我想在/ web /(http)文件夹之外创建一个文件夹然后让PHP使用header() commans 以某种方式呈现它,或者,可能只是将文件转储到数据库中?但是,我从未做过任何一个.

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

Pao*_*ino 9

您必须执行以下操作:

  1. 将所有文件移出webroot.您可以使用.htaccess禁用对该文件夹的访问,但不值得为此带来麻烦和潜在的安全风险.把它移到那里.
  2. 保留上传文件的表格,并在其中存储用户的原始文件名.将文件重命名为$id.$ext,依此类推.简而言之,您不希望在系统中使用用户的文件名.
  3. 有一个脚本,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;
Run Code Online (Sandbox Code Playgroud)

如果你想允许恢复文件等,你可以得到更多的幻想,但上面应该这样做.