PHP + htaccess:保护PDF文件

时间:2012-02-16 09:54:20

标签: php sql ajax apache .htaccess

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

扎克

4 个答案:

答案 0 :(得分:3)

唯一真正安全的方法是将文件放在工作网站目录之外,并通过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;
}

答案 1 :(得分:0)

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

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

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

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

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

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

答案 2 :(得分:0)

执行此操作的最佳方法是使用PHP提供文件,并禁止使用FilesMatch直接通过.htaccess文件访问PDF文件。

如果您需要我进一步说明如何做到这一点,请告诉我。

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

答案 3 :(得分:0)

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