【问题标题】:PHP + htaccess: Protecting PDF Files [closed]PHP + htaccess:保护 PDF 文件 [关闭]
【发布时间】:2012-02-16 09:54:20
【问题描述】:

我现在建立了我的网站,因此用户必须登录 (PHP + Cookies + SQL) 才能查看可供他们使用的文件列表。但是,文件以可预测的目录格式上传,一旦用户知道 URL,可能会将所述文件暴露给未经授权的用户。它们只是 PDF。我很好奇我应该如何保护目录,但我假设它将与 .htaccess 一起使用。这些文件使用从数据库中提取的简单动态标签链接。是否有一种安全有效的方法来保护整个目录并允许登录用户快速查看链接,但将未经授权的用户重定向到登录屏幕?谢谢!

扎克

【问题讨论】:

    标签: php sql ajax apache .htaccess


    【解决方案1】:

    唯一真正安全的方法是将文件放在工作 Web 目录之外,并通过 php 文件将它们提供给登录的用户。如果您希望文件仍保留 .pdf 扩展名,您可以使用 htaccess 将传入的 pdf 名称重写为您的 php 文件 + 一些参数。

    .htaccess:

    RewriteRule ^([A-Za-z0-9-]+).pdf$ index.php?filename=$1 [L,QSA]
    

    index.php:

    if($logged_in){
    
        $temp_file = $_GET['filename'];
    
       //make sure no one is trying to inject anything funny
        $temp_file = str_replace('.','',$temp_file);                //prevent file path manipulation
        $temp_file = str_replace('/','',$temp_file);                //prevent file path manipulation
        $temp_file = str_replace('%00','',$temp_file);              //prevent null char injector
        $temp_file = preg_replace('[^A-Za-z0-9]', '', $temp_file ); //just to be sure
    
     $file = STORAGE_DIR.$temp_file.'pdf';
    
      if (file_exists(file)) {
        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');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
      }
    }
    else{
    
        header('Location: '.LOGIN_PAGE);
        exit;
    }
    

    【讨论】:

    • 感谢您的回复!这看起来是一种可能性。我唯一担心的是我的系统在从数据库中提取列表后使用 标记和 PHP 填充“href”路径。有没有办法将此方法合并到 标签中?
    • 我不确定我是否遵循,如果您正确实施此方法,您的链接应该不需要更改。如果您的数据库提取了一个名为 yourdomain.com/pdf-files/example.pdf 的 url,您只需将 pdf-files 目录中的所有 pdf 文件移动到工作 Web 目录之外,然后在 pdf-files 中安装脚本和 htaccess 文件。
    • +1 表示不污染 :)
    • @MarkR:好的,谢谢!我的配置文件中是否声明了 STORAGE_DIR?
    • 是的,在您喜欢的地方声明它,它只是您要存储 PDF 的文件夹的系统路径。您还可以以相同的方式定义 LOGIN_PAGE,但将其设为 Web 目录。
    【解决方案2】:

    首先确保为您的网络服务器禁用目录列表。这样可以确保没有人可以查看您所有文件的列表。

    其次,以让人难以猜测的方式命名文件。不要使用简单的数据库 ID(例如 1.pdf 等)——要么使用某种哈希值,要么使用有意义但不易猜到的名称。

    您可以使用数据库 ID、时间戳、随机值和标签的组合。例如:

    top-secret-document-20120216-77-33.pdf
    

    当然,詹姆斯·邦德会将敏感文件移到网络树之外,并有一个 php 脚本为登录用户读取和输出文件。

    编辑:既然您提到了敏感文件,那么您真的应该更多地考虑这一点。您可以考虑将文件移动到数据库中。和/或检查 htaccess 中的 cookie。

    【讨论】:

    • 您好 Zaf,感谢您的回复。文件名不一定容易猜到,但它们包含敏感信息,我希望有一种解决方案可以完全保护它们对未经授权的用户(希望是 .htaccess)...
    • @Zakman411 我添加了一些关于将文件移动到数据库中的内容。您也可以在 htaccess 中检查 cookie。
    • 如果您删除网络服务器通过文件系统权限读取目录内容的能力,散列名称的效果特别好:chmod 711 /path/to/secret/directory(假设所有者不是网络服务器用户帐户) . 遍历目录只需要x执行权限。
    【解决方案3】:

    我有一个基于 PHP 的下载系统的基本框架,可以很容易地添加用户安全性。如果你想看看,那就是here。它使用 Symfony 1.3 和 Propel,因此您可以将它连接到各种数据库。还没有 F/OSS 许可证,但如果你愿意,我会添加一个!

    【讨论】:

      【解决方案4】:

      最好的方法是使用 PHP 提供文件,并禁止使用 FilesMatch 直接通过 .htaccess 文件访问 PDF 文件。

      如果您需要我进一步说明如何执行此操作,请告诉我。

      <FilesMatch "\.(htaccess|htpasswd|pdf)$">
        Order Allow,Deny
        Deny from all
      </FilesMatch>
      

      【讨论】:

      • 是的,这会很棒 - 有什么帮助吗?
      • Mark R 的答案实际上有你需要的 PHP 材料和一个可以工作的重写规则,但你不必担心将文件放在你的 web 根目录之外,只要你添加我添加到对您的 .htaccess 文件的回答中的代码。实际上,您应该将 FilesMatch 代码放在存储 PDF 的目录中的 .htaccess 文件中,这样它就不会无意中影响您不想拒绝访问的文件。
      • 你介意在你的答案中发布吗?我实际上不想将文件移到网络根目录之外(我正在使用 CPanel,但我不确定这是否可行)。
      • FilesMatch 代码已经在我的答案中,因此只需在您存储 PDF 的目录中创建一个 .htaccess 文件并添加我在此处发布的代码。然后,使用类似于 Mark R 的 PHP 文件,但添加了用户身份验证和验证,以提供文件。
      • @DanAmbrisco,亲爱的,我在我上传(file.pdf)的文件夹上创建了一个文件(.htaccess),和以前一样,如果我评论上传类型,请保留你写的代码验证是指PDF一,它会将任何文件上传到该文件夹​​,那么你的.httaccess代码有什么用????
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多