【问题标题】:Good Way to Secure File Uploads in PHP在 PHP 中保护文件上传的好方法
【发布时间】:2010-10-26 17:35:15
【问题描述】:

编写一个小应用程序(除其他外)允许用户上传文件(像图像、.doc 或文本文件)作为他们发布的一部分/提交。

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

所以,简而言之,我正在寻找一种好方法来做到这一点。

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

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

【问题讨论】:

    标签: php security file upload file-upload


    【解决方案1】:

    您必须执行以下操作:

    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;
    

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

    【讨论】:

    • 感谢 Paolo - 我将您的建议与链接结合起来并提出了我自己的建议,因此您的代码和链接都非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2016-10-02
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多