我正在用PHP构建一个Web应用程序。用户将使用他们的帐户访问。他们将拥有系统中的图片,笔记等资源,如Facebook。
我的第一个问题是不让任何人访问帐户的私人资源。让我们说这是一张照片。有三种情况:
我不知道Facebook是否做了类似于第1点的事情。因为业务很重要,而且用户的隐私也很重要。
我的第一个想法是通过PHP文件进行所有资源访问。但过了一段时间,它看起来真的很复杂。
我的另一个想法是在数据库表中保留所有资源的列表,并将隐私设置放在一起。这看起来更好,但我不确定性能会如何及时受到影响。
您有什么想法,您将如何构建这样的系统?
P.S。我打算再添加一个Web应用程序,并创建一个共享资源区域来放入共享资源。我也需要同样的特权制度。
答案 0 :(得分:2)
嗯..
User_ID
”。 User_ID
”。与/store/user_9892/album_2/beer&girls.jpg
因此,您可以执行一个SQL查询,该查询检查目录中的“User ID
”是否为当前应用程序执行者ID,或者他是否拥有所有者作为朋友。在那种情况下 - 给予访问权限。否则 - 重定向403标题(或其他)。
这意味着你不需要任何有资源等的表。只需用极快的SQL查询检查所有者\友好状态。
编辑:
对于其他帐户委派,您可以简单地添加到您的'user'
表格字段中..例如'access_accounts'
。也许是序列化数组,可能是特殊字符分隔的文本。我们所做的一切 - 检查一个SQL查询以获取当前User_ID的权限。
如果我们需要更进一步,并定义任何文件夹的任何访问权限(任何人,任何人组等)......所以是的,我想必须有一个像[path]=>[access_id]
这样的结构的表。但这个想法再次起作用 - 简单的一个SQL检查。
P.S。所有这些意味着我投票支持“通过PHP文件进行所有资源访问”。可以使用.htaccess
和php-script轻松完成,其中包含一些SQL查询和规则。
答案 1 :(得分:1)
根据我的经验,您可以通过将文件上传到公开无法使用的目录来最好地解决此问题。然后,您的数据库中还会有一些表,其中至少有三列:文件的名称,您要提供的访问级别以及上传文件的用户。
然后您可以编写一些内容来检查访问用户是否有权访问该文件。首先,它将检索包含有关所提到文件的信息的列。根据该信息,如果用户有权访问,请使用readfile(请参阅PHP手册中的示例)来显示该文件。在所有其他情况下,您只需显示403 Forbidden页面。
在您的情况下,检查访问权限的函数将如下所示:
function hasAccess($accesslevel, $owner, $visitor)
{
if ($accesslevel === 'public') {
return true;
}
if ($accesslevel === 'private') {
return $owner === $visitor;
}
if ($accesslevel === 'friends') {
return $owner === $visitor || isfriend($visitor, $owner);
}
}
这只是一个例子,根据您的环境,您的实施可能会略有不同。
据我所知,Facebook只允许所有人查看所有文件,但尝试创建一个难以猜测的网址。只要您有了网址,就可以查看图片本身,无论上传图片的用户的隐私设置如何。