安全文件下载

Posted

技术标签:

【中文标题】安全文件下载【英文标题】:Secure files for download 【发布时间】:2012-06-05 17:53:27 【问题描述】:

我想要一个文件夹,我们称之为 docs,其中包含登录用户可以下载的文档。这些有非常敏感的信息。我怎样才能最好地保护文件夹。我来自 php 背景,所以想知道我是否忽略了什么。

我将使用 .htaccess 保护文件夹,并且当用户单击下载时,他们永远不会显示该文件夹。通过删除文件夹名称的 php 强制下载。

当然,为了保护用户区域,我正在对所有输入字段实施卫生和验证,并注意 SQLInjections。使用 SSL 连接。关闭所有 php 警告。安全区域使用 SESSION 变量来控制访问并重新验证用户的特殊任务,例如更改密码。加上 10 分钟的超时功能,之后用户必须重新输入详细信息。

我尽量做到彻底,所以无论多么小的建议都会受到欢迎。

【问题讨论】:

【参考方案1】:

将文件放在 webroot 之外。然后使用 PHP 通过脚本传递文件。这样,没有人可以直接链接到文件并绕过您的控制。 (当然要确保只有在验证用户有权检索该文件后执行此操作的脚本)。

示例 PHP:

<?php
    if (!isset($_SESSION['authenticated'])) 
        exit;
    
    $file = '/path/to/file/outside/www/secret.pdf';

    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;
?>

【讨论】:

作为将文件放在 Web 根目录之外的替代方法,您可能还会发现一些文件权限组合允许 PHP 读取文件,但不允许 Apache 将其提供给全世界,如chmod o-rwx,换句话说,删除“其他人”的权限。 我尝试了这段代码,效果很好,但它会下载到我的电脑上。如何显示这段代码中的图片? 那么超时呢? 链接图片使​​用:***.com/questions/258365/…【参考方案2】:

除了 John Conde,您还可以将 dl url 重写到其他不合理的文件夹中,以蜜罐试图越过其访问权限的用户。

并在你的 htaccess 中添加这种规则

Options -Indexes

<files .htaccess>
  order allow,deny
  deny from all
</files>

#Add all file you want to protect except the one you share...
<FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
  Order Allow,Deny
  Deny from all
</FilesMatch>

【讨论】:

感谢您的建议。你能否再解释一下。您是建议将下载文件放在蜜罐文件夹中,然后阻止所有文件? 基本上,是的!这个想法是隐藏你的真实文件夹,并阻止所有尝试访问文件夹内部和外部的文件。

以上是关于安全文件下载的主要内容,如果未能解决你的问题,请参考以下文章

windows服务器,下东西为啥老出现当前的安全设置不允许下载此文件?

pikachu靶场-Unsafe Filedownload/Fileupload不安全文件的下载和上传漏洞

Pikachu-Unsafe Filedownload(不安全的文件下载)

文件安全问题重如山!(文件安全权限进行解析)

安全文件下载

Php - 通过下载给最终用户访问文件的安全方式?