CodeIgniter - 用户应该只能访问自己的图像

时间:2012-07-29 11:02:51

标签: php codeigniter session permissions

我目前正在尝试使用CodeIgniter开发图片上传网站。 问题是,我今天遇到了一个问题,我真的很感激任何帮助,以解决它。

基本上,该网站正在运作。但问题是,文件不是私有的。用户可能希望确保用户上传的文件仅由他们可见,而不是由猜测一堆网址的人显示。 (例如,user1上传他想保密的image1,对于他自己=> [localhostlocalhost / upload_script / files / image1.jpg],user2可以通过猜测并输入url来访问image1 [localhost / upload_script / files / image1.jpg ]这是我们不想发生的事情。) 我做了一些研究,我认为这可能需要另一个控制器来提供文件(检查会话数据)。 在过去的一段时间里,我一直在PHP中使用会话等,但我在CodeIgniter中并不熟悉它们。 这是唯一的方法吗?我不认为我需要为每个用户创建单独的目录,是吗?你能告诉我如何走向正确的方向或给我一个例子吗?

提前致谢,

harris21

3 个答案:

答案 0 :(得分:3)

为了保护文件,您需要将它们保留在网络根目录之外,否则人们将始终能够 url hack

我已经使用非常方便的mod_xsendfile用于apache(如果您具有对服务器的那种访问权限),这将允许您提供可以受访问控制保护的文件,而无需在没有相应凭据的情况下访问。

您可以放入CI控制器以显示图像的代码段(改编自mod_xsendfile页面):

...
if ($user->isLoggedIn())
{
    header("X-Sendfile: $path_to_somefile");
    header('Content-Type: image/jpeg');
    exit;
}

如果您无法安装mod_xsendfile,那么您唯一的其他选择就是使用readfile(),如TheShiftExchange所说。

答案 1 :(得分:2)

使用PHP返回图像并将图像目录锁定在Web服务器根目录后面。这样,在提供图像之前,您可以通过会话变量检查用户凭据,确保允许他查看图像。否则,您可以将用户直接重定向到网站,提醒他无权访问。像这样提供图像比通过网络服务器(apache,nginx,...)提供图像要慢,但它可以让你控制下载图像。

更确切地说,将图像详细信息保存在数据库中,例如具有列:id,file_path,title,uid。每当用户想要下载图像时,例如调用http://domain.com/files/download/3,您就可以检查是否可以为当前登录的用户下载ID为3的图像。你需要编写自己的控制器来做这件事。

我在这里做类似的事情http://www.mediabox.si/你可以检查图像的提供方式。我允许缩略图,我正在为普通访客看到更大的图像水印。

答案 2 :(得分:1)

唯一的方法是将图像存储在public_html之外。否则,根据定义,您将打开文件以直接访问。

使用控制器检查是否允许用户访问该文件,并使用php函数readfile()来提供文件

您可以在此处的其他问题中阅读一些代码:Does this PHP function protect against file transversal?

这实际上非常快 - 你根本不会注意到性能上的打击