【问题标题】:How to store user profile images privately so that it is only accessible to profile owner?如何私下存储用户个人资料图像,以便只有个人资料所有者可以访问?
【发布时间】:2012-02-28 18:47:38
【问题描述】:

我正在使用 Yii 框架开发一个网站。在我的网站上,我有用户资料(已经实施)。我将有一个文件上传器,以便用户可以上传个人资料图片。一些个人资料可能对公众开放,其他个人资料将是私人的。公共用户应该无法访问私人个人资料,并且除了个人资料所有者之外,任何人都可能无法访问此个人资料中的图像。

我了解到将图像存储在 MySQL 数据库中是一个坏主意,因为它会降低性能并且可能在我的虚拟主机上被禁止。我曾考虑将图像存储在受保护的目录中,但如果在这里完成,我将根本无法链接到图像。那么我如何才能在有效的个人资料(公共个人资料或属于用户的个人资料)上显示图像?

任何提示或想法将不胜感激(与 Yii、php 或任何其他相关)。如果我的问题不清楚,请告诉我。谢谢。

*顺便说一句,我从来没有上过正式的 Web 开发课程,而且和许多其他人一样,我在自己的时间里学到了我所知道的一切,所以我很可能错过了一个非常简单/明显的解决方案。

【问题讨论】:

  • 听起来像是您需要解决的架构的实现。您应该存储他们的用户类型(私人或公共),然后在查看者尝试查看某人的个人资料时进行检查。如果他们没有以他们试图查看的个人资料的(私人)用户身份登录,请不要向他们显示任何内容。
  • 感谢您的回复。我想我对此并不完全清楚。我已经按照您的建议实施了它(对于私人和公共用户。破解 url 的用户会被发送到某个错误页面/拒绝访问页面)。但是,我担心“聪明”的用户仍有可能通过一些 url hack 访问私人用户的图像(因为图像存储在公共域中)。如上所述,我不想将其存储在受保护域中的原因是我根本无法在用户页面上显示图像,但也许我的想法是错误的?

标签: php yii


【解决方案1】:

通过 php 文件提供图像,该文件可以检查当前会话是否具有权限

【讨论】:

  • 好的,谢谢。我不知道该怎么做,但我会查一下。
【解决方案2】:

用户上传图片后,随机重命名图片并将随机文件名存储在用户表中。

用户登录后,你当然会设置会话(至少是用户id)。

创建image_profile.php 并从该文件中的会话中获取 user_id。之后,执行这样的查询:

SELECT `profile_image_filename`
FROM user WHERE user.id = {$SESSION['user_id']}
LIMIT 1;

然后发送{$profile_image_filename}.jpg 以便image_profile.php 的结果将是登录用户的个人资料图像。 (如何动态输出图片?Output an Image in PHP

【讨论】:

  • 这听起来像是我可以在没有太多工作的情况下代表我学习的事情。感谢您的帮助!
  • 而不是随机化文件名,将图像存储在服务器可以读取的不可访问的路径中,然后它将真正是“私有的”
【解决方案3】:

用户上传图片后,获取随机图片名称,例如。 mt_rand(30,999) 。图像扩展。
将此值作为用户图像名称存储在image 表中。图像表 包含它自己的 iduser_idname 列。

在 Yii Image 模型中创建 protected function afterSave() 方法,它将您的图像存储在文件系统中。您在文件系统中的真实图像名称将由数据库中的图像 ID 和数据库中的图像名称组成。
不要忘记在此函数中添加以下行:

return parent::afterSave();

示例:
你有一个名为 me.jpg
mt_rand(30,999) 给我们 421
因此,您将 jpg 图像存储在数据库中。
该行具有值:
id=7, user_id=3, name=421.jpg
现在您将图像保存在名称 7_421.jpg 下。
通过这样做,您的图像将永远不会两次获得相同的名称,因为我们在图像名称的第一部分使用的id 是唯一的。此外,没有人会知道图像的名称,因为她/他需要id 和随机数。

只为所有者显示图像,您比较登录的用户 ID 与 user_id 相同 通过这样做:

if(Yii::app()->user->id === $image->user_id) {
 // display photo
}

您不需要处理会话。 Yii 为您服务。

【讨论】:

  • 嗯,谢谢。我已经让它工作了,但方式略有不同。我接受了你的回答,因为你似乎已经考虑了很多,我认为这是最清楚的。在我当前的实现中,我将图像保存在公共域无法访问的地方,然后通过 php 文件提供图像。我想我会稍微改变一下,让它更像这样(最终它必须达到一定程度)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多