2011-11-25 201 views
0

我对文件夹和文件权限的工作方式有一些疑问。说我有用户目录以外的“保护”,如下..php文件夹和文件权限

users 
    -- usera 
    -- docs 
    -- userb 
    -- docs 
protected 

我不想谁没有权限,访问用户A的目录任何用户B。另外,我不希望任何人通过url链接访问目录目录。基本上我只想让用户能够访问他们自己的目录,而不是其他人。如何做呢?

谢谢!

+1

这需要更多的上下文。访问如何? “受保护”的相关性是什么?在读取或下载文件时访问 – deceze

+0

。保护是一个目录,具有.htaccess'拒绝所有'托管php脚本。 – twb

+0

由于您谈论的是“权限”,这通常是文件系统的事情,所以这仍然有点令人困惑。当你通过网络服务器访问文件时,你似乎在谈论更多的抽象权限,或者你是? – deceze

回答

1

我在这里回答了一个类似的问题limiting users to subdirectories,您应该可以根据自己的需要进行调整,我也在这里复制了它。

的download.php

<?php 
/** Load your user assumed $user **/ 

$file = trim($_GET['file']); 

/** Sanitize file name here **/ 

if (true === file_exists('/users/user'.$user->id.'/'.$file)) { 
    //from http://php.net/manual/en/function.readfile.php 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.$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 { 
    throw new Exception('File Not Found'); 
} 

的.htaccess要使用/download.php?file=filename.ext拒绝所有直接下载文件

deny from all 

这样,你会链接到文件夹和它只会从当前用户的用户目录下载该文件。

您会希望确保您清理输入文件名,以便您不易受目录横向漏洞利用攻击。

+0

嗨,这会给服务器带来额外的负担吗?使100个用户一次下载不同的1mb文件(100x100mb)会导致内存或处理能力瘫痪? – twb

+0

yup ..我想我会使用这种方法,与xsendfile一起。干杯 – twb

1

没有更多信息可以继续,我的建议是确保用户目录位于Web根目录之上。这将阻止他们被链接到。然后创建一个验证用户是谁的PHP脚本。一旦您知道登录用户的身份,您可以使用fpassthru()(http://php.net/fpassthru)或类似功能将文档交付给用户。

+0

您好,还需要其他什么信息?有没有其他的方法,因为我会认为使用passthr会给服务器带来很大的处理负担? – twb

+0

在关于速度和服务器资源使用情况的fpassthru PHP页面上有一些有趣的评论。使用fread可能实际上更快。您应该浏览该页面上的评论以获取一些好的提示。如果你不想使用PHP函数,你可以看看像mod-auth-token http://code.google.com/p/mod-auth-token/ – Daniel

+0

mod-auth-token看起来不错!但我不能在共享主机上得到这个? – twb