2

你好网络开发大师

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

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

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

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

谢谢!

4

4 回答 4

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文件和图像文件

于 2012-12-09T18:42:35.360 回答
0

执行此类操作的最有效方法可能是通过 Apache 重写。当用户登录时,您将一个条目添加到以用户会话 ID 为键的重写映射中。条目的值指向保存图像的目录。您将有一个重写规则,从 cookie 中解析出会话 id 并将 URL 重写到图像目录。实际上,您正在使目录仅对该用户进行网络访问。

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

于 2012-12-09T19:07:36.660 回答
0

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

于 2012-12-09T18:54:27.617 回答
0

这取决于您还有什么其他要求。您可能希望让您的用户通过发送链接来共享他们的图像,这样只有拥有此链接的人(即使在您的系统中没有经过身份验证)才能看到图像。您提出的实施将使这变得困难。

如果您不太担心可能的“泄漏”,您可以为您的图像生成随机名称,并将所有努力都放在真正的随机性上,这样就很难猜到图像名称。密码。一方面,您可以考虑这种“密码保护”,但请记住,您的路径将被缓存在代理、浏览器历史记录等中......所以这可能不是您的解决方案,具体取决于您所保护的资源。

于 2012-12-09T19:18:16.380 回答