我目前正在尝试使用CodeIgniter开发图片上传网站。 问题是,我今天遇到了一个问题,我真的很感激任何帮助,以解决它。
基本上,该网站正在运作。但问题是,文件不是私有的。用户可能希望确保用户上传的文件仅由他们可见,而不是由猜测一堆网址的人显示。 (例如,user1上传他想保密的image1,对于他自己=> [localhostlocalhost / upload_script / files / image1.jpg],user2可以通过猜测并输入url来访问image1 [localhost / upload_script / files / image1.jpg ]这是我们不想发生的事情。) 我做了一些研究,我认为这可能需要另一个控制器来提供文件(检查会话数据)。 在过去的一段时间里,我一直在PHP中使用会话等,但我在CodeIgniter中并不熟悉它们。 这是唯一的方法吗?我不认为我需要为每个用户创建单独的目录,是吗?你能告诉我如何走向正确的方向或给我一个例子吗?
提前致谢,
harris21
答案 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?
这实际上非常快 - 你根本不会注意到性能上的打击