公共和私人资源管理

时间:2012-09-06 13:19:38

标签: php web-applications resources privacy

我正在用PHP构建一个Web应用程序。用户将使用他们的帐户访问。他们将拥有系统中的图片,笔记等资源,如Facebook。

我的第一个问题是不让任何人访问帐户的私人资源。让我们说这是一张照片。有三种情况:

  1. 每个人都可以使用图片的URL访问该图片。
  2. 该图片所有者帐户的朋友帐户可以访问该图片。
  3. 只有所有者帐户才能看到该图片,没有其他人。即使有图片的URL。
  4. 我不知道Facebook是否做了类似于第1点的事情。因为业务很重要,而且用户的隐私也很重要。

    我的第一个想法是通过PHP文件进行所有资源访问。但过了一段时间,它看起来真的很复杂。

    我的另一个想法是在数据库表中保留所有资源的列表,并将隐私设置放在一起。这看起来更好,但我不确定性能会如何及时受到影响。

    您有什么想法,您将如何构建这样的系统?

    P.S。我打算再添加一个Web应用程序,并创建一个共享资源区域来放入共享资源。我也需要同样的特权制度。

2 个答案:

答案 0 :(得分:2)

嗯..

  1. 您在申请中有“User_ID”。
  2. 您有想要访问的目录(网址)。
  3. 此目录中包含其所有者“User_ID”。与/store/user_9892/album_2/beer&girls.jpg
  4. 一样

    因此,您可以执行一个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只允许所有人查看所有文件,但尝试创建一个难以猜测的网址。只要您有了网址,就可以查看图片本身,无论上传图片的用户的隐私设置如何。