安全有效地存储/提供网站图像

时间:2012-12-09 18:35:00

标签: php mysql ubuntu nginx security

Hello web development gurus

在不影响性能的情况下,安全存储和提供图像的最佳做法是什么?

是否可以将用户图像存储在不可访问Web的文件夹中(可能更高版本和之前/ www?)并在用户登录页面后按需提供服务?已有用户名和密码访问机制。

用户不希望这些图像可公开访问。

我在Ubuntu上使用php运行nginx。数据库是mysql。

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以使用php文件来提供这些图像,并在提供之前进行一些检查。我会尝试这样的事情:

<?php
if ( /* YOUR CHECK HERE */ ) {
    header('Content-Type: image/jpeg'); // Or whatever your content type might be
    readfile('/path/to/file');
}

你可以使用RewriteRule来调用你的php文件看起来像真实的图像:

rewrite /img/users/pictures/(.*) /your_php_file.php?path=$1 break;

或类似的东西。

这可能是安全的,但效率不高,因为您的服务器必须访问两个文件。 php文件和图像文件

答案 1 :(得分:0)

也许您应该评估像Amazon S3这样的CDN的使用,它通过RESTful身份验证提供安全访问:http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html并避免服务器执行服务静态内容的工作。

答案 2 :(得分:0)

执行类似操作的最有效方法可能是通过Apache重写。当用户登录时,您可以向键入用户会话ID的重写映射添加条目。条目的值指向包含图像的目录。您将有一个重写规则,从cookie中解析出会话ID,并将URL重写到映像目录。那么,有效的是,您只对该用户进行目录Web访问。

涉及Apache重写的任何内容都是伏都教。除非你真的有那种流量,否则不值得复杂。通过PHP提供文件效率很低,但在许多情况下效率低下是可以容忍的。

答案 3 :(得分:0)

这取决于您有什么其他要求。您可能希望通过发送链接让您的用户共享其图像,以便只有拥有此链接的人(甚至未在您的系统中进行身份验证)才能看到图像。你提议的实施会使这很困难。

如果你不太关心可能的“泄漏”,你可以为你的图像生成随机名称,并将所有的努力都放在这个真正的随机性中,这样就很难猜到一个图像名称。猜猜密码。一方面,您可以考虑使用“密码保护”,但请记住,您的路径将缓存在代理,浏览器历史记录等中......因此,根据您保护的资源,这可能不适合您。< / p>