【问题标题】:php image storing - securityphp 图像存储 - 安全性
【发布时间】:2011-12-03 08:24:47
【问题描述】:

我想我有两种方法可以将图像存储在 php 应用程序中:将它们存储在数据库中或存储到具有唯一名称的文件夹中。考虑到我想最小化数据库连接,如何保护包含用户上传图像的文件夹?

所以基本上,每个用户都会有一个个人资料,并将他们的照片上传到网站上,以便与他们想要的任何人分享。我打算按如下方式存储它们:

/root/somefolder/{userid}{uniquenumber}.jpg

如果我将 htaccess 配置为阻止访问当前文件夹,就足够了吗?或者我应该有一些其他的安全预防措施?

干杯

【问题讨论】:

  • 您可以使该目录无法访问网络并使用脚本检查权限,如果他们有权限则服务器请求的文件。
  • 不要将图像放入数据库。当然,BLOB 字段在那里,但文件系统也在那里!
  • @MarcB,我问的是安全流程而不是利弊......

标签: php image security upload


【解决方案1】:

将它们存储在数据库或具有唯一名称的文件夹中

数据库针对存储小块数据而不是大块数据进行了优化。如果您让正常的操作系统和 Web 服务器处理文件传递,您将获得更好的性能。使用普通文件也使您不必重新实现对 HTTP 缓存标头和范围请求的处理。

但无论哪种方式,这些资源都需要 URL,因此您问题的第二部分仍然相关。

如果我配置htaccess来阻止对当前文件夹的访问,就够了吗?

我认为这就足够了。只要唯一部分很长(例如,“somefolder/738b3093b898654bd3bbb9e3770e7fc0.jpg”)并且不遵循模式,就无法猜测它。

但除非您确实需要文件名中的用户 ID,否则请避免使用它。 Facebook 包括用户个人资料 ID,它是照片文件名的一部分,因此当人们在其他地方共享照片文件时,它允许发现他们的 Facebook 个人资料和真实姓名。我已经看到它在多个在线社区中引起了跟踪和骚扰。这不是用户的错——他们不知道自己在某处张贴照片是在泄露自己的真实姓名或朋友​​的真实姓名。

另一个考虑因素是,随着这样一个系统的增长,它会获取大量文件,如果它们仅位于一个文件夹中,这对文件系统来说是一个可怕的负担。您可以通过在子文件夹中重复或拆分部分名称来轻松防止这种情况。例如,“somefolder/7e/7e8b3093b898654bd3bbb9e3770e7fc0.jpg”。

【讨论】:

    【解决方案2】:

    如果您确实需要一些额外的安全性,您可以将文件存储在网站公共路径之外的文件夹中。构建一个页面,例如http://example.com/get_photo/?id=12345,该页面验证用户已登录并拥有照片权限,然后找到实际文件名并将该文件包含在响应中。请记住,您需要为您的图像格式发出正确的 MIME 类型标头。

    【讨论】:

      【解决方案3】:

      实际上,许多数据库引擎无论如何都会将 BLOB 数据存储为单独的文件,因此首先将图像存储为文件。它将使您的数据库更小、更易于管理、更易于备份并且在紧急情况下更易于恢复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-26
        • 2019-09-05
        • 2011-08-17
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        相关资源
        最近更新 更多