2012-02-16 135 views
1

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

Zach

回答

0

首先确保您的Web服务器的目录列表已禁用。这可确保没有人能查看您的所有文件的列表。其次,以难以让人猜测的方式命名文件。不要使用简单的数据库id(例如1.pdf等) - 要么使用某种类型的哈希值,要么使用一些有意义但不容易猜测的名称。

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

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

当然,詹姆斯·邦德将移动的敏感文件的网站外树,并有一个PHP脚本读取和文件输出用于登录的用户。

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

+0

Hi Zaf, 感谢您的回复。文件名不一定很容易猜到,但他们有敏感的信息,我希望有一个解决方案,可以完全保护他们给一个未经授权的用户(.htaccess希望)... – Zakman411 2012-02-16 10:07:08

+0

@ Zakman411我添加了一些关于移动将文件导入数据库。你也可以在htaccess中检查cookies。 – zaf 2012-02-16 10:19:36

+0

如果您通过文件系统权限:'chmod 711/path/to/secret/directory'(假设所有者不是Web服务器用户帐户)来删除Web服务器读取目录内容的能力,则哈希名称工作得特别好。_traverse_目录只需要'x'执行访问。 – sarnold 2012-02-18 02:19:11

0

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

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

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

是的,这将是伟大的 - 任何帮助? – Zakman411 2012-02-16 10:38:54

+0

Mark R的答案实际上包含了您需要的PHP材料和一个可行的重写规则,但只要您将添加到我的代码中的代码添加到我的代码中,您就不必担心将文件放到Web根目录之外回答你的.htaccess文件。 实际上,您应该将FilesMatch代码放置在PDF存储目录中的.htaccess文件中,以免它不会无意中影响您不想拒绝访问的文件。 – 2012-02-16 10:43:11

+0

你介意在你的回答中发帖吗?我实际上更喜欢不把这些文件移到web根目录之外(我使用CPanel,但我不确定这是可能的)。 – Zakman411 2012-02-17 21:33:19

3

唯一真正安全的方式做,这是把文件的工作web目录之外,并为他们服务通过一个PHP文件登录的用户。如果你希望这些文件仍然保留.pdf扩展名,你可以使用htaccess将你的php文件名改写成你的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; 
} 
+0

感谢您的回复!这看起来像是一种可能性。我唯一担心的是我的系统使用PHP的标签填充“href”路径后,从数据库中拉出列表。有没有办法将这种方法合并到标签中? – Zakman411 2012-02-16 10:44:35

+1

我不确定我是否遵守,如果您正确实施此方法,则不需要更改链接。如果您的数据库提取了一个名为yourdomain.com/pdf-files/example.pdf的url,则只需将pdf文件目录中的所有pdf文件移动到工作Web目录之外,然后将脚本和htaccess文件安装到pdf文件中。 – MarkR 2012-02-16 10:49:27

+0

+1为无知:) – halfer 2012-02-16 19:37:50

0

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