你好网络开发大师
在不影响性能的情况下安全地存储和提供图像的最佳做法是什么?
是否可以将用户图像存储在无法通过网络访问的文件夹中(可能更高,在 /www 之前?)并在用户登录页面后按需提供服务?已有用户名和密码访问机制。
用户不希望这些图像可公开访问。
我在 Ubuntu 上使用 php 运行 nginx。数据库是mysql。
谢谢!
您可以使用 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文件和图像文件
执行此类操作的最有效方法可能是通过 Apache 重写。当用户登录时,您将一个条目添加到以用户会话 ID 为键的重写映射中。条目的值指向保存图像的目录。您将有一个重写规则,从 cookie 中解析出会话 id 并将 URL 重写到图像目录。实际上,您正在使目录仅对该用户进行网络访问。
任何涉及 Apache 重写的东西都是伏都教。除非你真的有那种流量,否则不值得这么复杂。通过 PHP 提供文件效率低下,但在许多情况下,效率低下是可以容忍的。
也许您应该评估使用像 Amazon S3 这样的 CDN,它通过 RESTful 身份验证提供安全访问:http: //s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html并避免您的服务器完成这项工作of 提供静态内容。
这取决于您还有什么其他要求。您可能希望让您的用户通过发送链接来共享他们的图像,这样只有拥有此链接的人(即使在您的系统中没有经过身份验证)才能看到图像。您提出的实施将使这变得困难。
如果您不太担心可能的“泄漏”,您可以为您的图像生成随机名称,并将所有努力都放在真正的随机性上,这样就很难猜到图像名称。密码。一方面,您可以考虑这种“密码保护”,但请记住,您的路径将被缓存在代理、浏览器历史记录等中......所以这可能不是您的解决方案,具体取决于您所保护的资源。