如何在下载文件之前验证用户?

时间:2010-10-11 05:35:21

标签: php

例如,如果用户想要下载/webroot/files/bigimage.jpg,则会给他们一个URL www.domain.com/download.php?filename=bigimage.jpg。然后,

  1. 如何防止未经身份验证的用户 访问文件bigimage.jpg?
  2. 如果经过身份验证的用户访问该用户 URL,我想触发下载 浏览器的行为(例如,在IE中, 显示“打开”,“保存”对话框 和“取消”按钮)而不是 在浏览器中显示图像。 怎么做?
  3. 编辑: 让问题更清晰。

    我正在使用LAMP堆栈。对于Q1,我不问如何进行身份验证,我问如何阻止用户直接访问该文件。此外,读取整个文件的内容并回显它们是资源广泛的。有更好的解决方案吗?

5 个答案:

答案 0 :(得分:5)

第一步,将.htaccess文件放在文件夹中,图像上显示“全部拒绝”。这将阻止任何人访问该文件,即使他们知道该文件夹。

然后,你编写使用像这样的PHP函数

$file = 'path/to/folder' . $filename;
//Make sure you check that $filename does not contain ".." for security
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    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;
} else {
    //Show error message
}

您应该检查会话变量以查看用户是否已登录并且具有可以下载此角色的角色。此代码也将强制下载图像而不是显示它。

答案 1 :(得分:2)

  1. 使用会话。
  2. 将标题的内容META标记设置为二进制,以便浏览器不会尝试自行处理该文件。

    header('Content-Type:application / binary');

答案 2 :(得分:1)

仅对.htaccess中的图片使用此类内容:

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteRule ^(.*)/uploads/([0-9]+/.*)\(jpg|jpeg|gif|png|bmp)$ /root/image.php?img=$2.$3 [L]
</IfModule>

或任何类似的文件类型:

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteRule ^(.*)/uploads/([0-9]+/.*)\.* /root/image.php?img=$2.$3 [L]
</IfModule>

然后在你的PHP中这样:

<?php
// server link to wordpress installation when using Wordpress
require_once('/root/wp-config.php');
if( is_user_logged_in() ):

  $file = '/root/wp-content/uploads/'.$_GET['img'];

  if (file_exists($file)) 
  {
    $ftype = 'application/octet-stream'; 
    $finfo = @new finfo(FILEINFO_MIME); 
    $fres = @$finfo->file($file); 
    if (is_string($fres) && !empty($fres)) { 
       $ftype = $fres; 
    } 

    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Cache-Control: no-cache");
    header("Pragma: no-cache");
    header('Content-Type: ' . $ftype);
    header('Content-Length: '.filesize($file));
    header('Content-Disposition: filename='.basename($file));

    flush();
    readfile($file);

  }
  else
  {
    header("Location: //media.vet.uu.nl/ziekteleerboek", 404);
  }

else:  

 auth_redirect();

endif;

die();
?>

让这对我的网站很好用。

您可以通过允许缓存来加速代码。

这种方式不会强制下载,这对我来说很好。

强制下载使用:

header('Content-Disposition:attachment;filename='.basename($file));

这适用于大多数浏览器和文件类型。

答案 3 :(得分:0)

您可以在用setcookie()进行身份验证后在用户的浏览器中设置Cookie。您的下载脚本可以检查$ _COOKIE以获取身份验证字符串。如果你想了解它,你可以为每个用户提供某种独特的auth字符串,并检查数据库。

答案 4 :(得分:0)

我想你使用Apache作为网络服务器。尝试使用一些http auth作为选项。这是很好的教程,展示了如何正确设置工作http://httpd.apache.org/docs/1.3/howto/auth.html