0

我想以安全的方式存储用户上传的图像(.jpg)。我很困惑如何获得更好的结果和性能。我能看到的最佳选择是:

1. Store the images in database. 
//problem : database size get large. lagging performance 

2. Store them in a folder in encrypted manner. 
//problem : Encryption and decryption on large file slows it down.

3. Place the image as it is in a folder behind 'public_html' in root directory. 
//problem : I am unsure as they aren't encrypted.

哪种方法更好,或者我现在不知道还有其他“最佳实践”吗?

4

4 回答 4

2

这完全取决于你想用它做什么,以及你想保护它免受什么影响。

我没有通过图像看到任何可能的攻击向量。所以我看到了两种可能的选择,但首先是基础知识:

您将图像本身存储在文件系统上。在关系数据库中存储文件是非常低效的。

  • 您保留文件本身并将其重命名为内容的 MD5 或 SHA1 哈希值
  • 创建一个链接到文件系统上文件位置的数据库条目,以及您可能想要的任何元数据(所有者、颜色、类别等)。
  • 文件根据哈希值的第一个字母划分为文件夹(如果您有很多图像,请考虑根据两个或三个字母将其划分为目录。

现在,根据您的访问方案,您可以将文件公开,然后简单地链接到它们(因为文件名很复杂,猜测会很困难),或者您可以将文件放在公共根目录之外,并拥有一个 PHP 文件在验证权限后访问它们并为它们提供服务。

于 2013-11-14T20:56:16.180 回答
2

将您的图像存储在受保护的目录中,并拒绝您的.htaccess.
deny from all

当您的用户上传图像时,您应该在图像存储中创建唯一的文件名。然后,您可以使用使用特定图像 ID 的图像处理程序来提供图像:

<?php 
    header('Content-Type:image/jpeg'); 
    if(authorized && isset($_GET['id']))
    {
        flush();
        readfile('someimage' . $_GET['id'] . '.jpg');
    }
?>
于 2013-11-14T20:58:05.273 回答
2

不要将它们存储在数据库中。将它们放在像上传一样的网络目录中,并使用 .htaccess 保护它们

deny from all

这将限制对它们的访问。

您还应该注意文件名以避免文件命名冲突。

于 2013-11-14T20:49:41.607 回答
0

3、存放在web根目录以外的文件夹中。

确保目录是一个配置选项,因为将来如果大小太大或增加前端节点的数量,您可能希望存储在单独的机器上。

2个提示:

  1. 将文件重命名为 GUID 或唯一名称,并将真实名称存储在数据库中。这将防止任何重复的文件名冲突。
  2. 创建一个文件夹系统,以便并非所有文件都在同一个目录中。文件夹中的文件数量有限制。并将路径存储在数据库中。(即日期基于文件夹 [YYYY][MM][DD][File.Ext] )
于 2013-11-14T20:39:42.597 回答