1

我目前正在尝试使用 CodeIgniter 开发一个图片上传网站。问题是,我今天遇到了一个问题,我非常感谢任何形式的帮助来解决它。

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

提前致谢,

哈里斯21

4

3 回答 3

3

为了保护文件,您需要将它们保存在您的 Web 根目录之外,否则人们将始终能够通过url 破解他们的方式。

我已经为 apache 使用了非常方便的mod_xsendfile(如果您对服务器具有这种访问权限),这将允许您提供可以通过访问控制保护的文件,并且在没有适当凭据的情况下无法访问。

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

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

If you cannot install mod_xsendfile then your only other option would be to use readfile() as TheShiftExchange says.

于 2012-07-29T15:57:39.903 回答
2

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

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

我在这里做类似的事情http://www.mediabox.si/你可以检查图像是如何提供的。我允许缩略图图像,并且我正在为普通访问者可见的较大图像添加水印。

于 2012-07-29T11:10:49.020 回答
1

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

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

您可以在此处阅读我的其他问题之一的一些代码:此 PHP 函数是否可以防止文件横向传输?

这实际上非常快 - 你根本不会注意到性能下降

于 2012-07-29T14:50:43.627 回答