【问题标题】:where is the best place to save images from users upload保存用户上传图片的最佳位置在哪里
【发布时间】:2011-05-30 22:55:06
【问题描述】:

我有一个展示画廊的网站。用户可以从网络上传自己的内容(通过输入 URL)或从他们的计算机上传图片。

我将 URL 存储在数据库中,这适用于第一个用例,但如果用户从他们的计算机上传,我需要弄清楚实际图像的存储位置。

这里有什么建议或关于我应该将这些存储在哪里的最佳做法吗?

我应该将它们保存在 appdata 或 content 文件夹中吗?它们是否应该完全不与网站一起存储,因为它是用户内容?

【问题讨论】:

    标签: asp.net-mvc image storage security


    【解决方案1】:

    根据您实现此类操作所需的资源,将所有这些内容存储在 Amazon S3 中非常有益。

    获得上传后,您只需将其推送到 Amazon 并在您的数据库中弹出 URL,就像您处理其他图像一样。如上所述,在发送之前打开图像并调整其大小可能是明智之举。这既可以检查它实际上是一张图像,又可以确保您不会意外地向最终用户呈现完整的相机分辨率图像。

    如果您必须迁移/故障转移您的网站并且不想同步千兆字节的图像资产,现在执行此操作将变得非常容易。

    【讨论】:

    • 我喜欢这个答案,但您也应该考虑安全性。使用 S3 将最大限度地减少通过您的站点的流量。但是你想确保文件是他们所说的那样,我会在上传到 s3 之前对图像应用过滤器,这样你就知道它的图像是过滤器成功的。
    • 确实如此。这就是我在调整大小步骤中得到的结果,但无论哪种方式,最好进行任何形式的可靠检查以确保您确实拥有真实图像。
    【解决方案2】:

    您可以将受信任的数据与htdocs/www 文件夹并行保存,这样任何用户都无法访问该文件夹。如果您使用 apache,您还可以在受信任的数据上添加 .htaccess 身份验证(对于 .htaccess,您应该将 .htpasswd 文件与 htdocs/www 文件夹并行保存)。

    【讨论】:

      【解决方案3】:

      上传图片时,您需要在上传之前验证文件的内容。文件扩展名方式不可信。

      使用幻数法验证文件内容,这将是一种简单的方法。

      查看stackoverflow post 并查看list of magic numbers

      保存文件的一种方法是将其转换为二进制格式并保存在我们的数据库中,下一种方法是使用 App_Data 文件夹。

      存储选项取决于您的要求。另见this post

      通过像这样将 maxRequestLength 属性设置为 Web.Config 来设置上传限制,其中文件的大小以 KB 为单位指定

      <httpRuntime maxRequestLength="51200" executionTimeout="3600" />
      

      【讨论】:

        【解决方案4】:

        一种方法是将图像存储在带有 varbinary 字段的数据库表中。

        另一种方法是将图像存储在 App_Data 文件夹中,并为每个用户创建一个子文件夹 (~/App_Data/[userid]/myImage.png)。

        对于这两种方法,您都需要创建一个单独的操作方法,以便可以访问图像。

        【讨论】:

        • 我们有网站静态公共内容的数据库方法。我们用它来调用版本。这很好用,我们可以压缩二进制 blob。
        【解决方案5】:

        您不应将用户上传的内容存储在您网站结构中可以通过已知 URL 直接访问的任何地方。这是一个安全风险,因为用户可以上传 .htm 文件和 .js 文件。即使是具有正确扩展名的文件也可能包含恶意代码,这些恶意代码可由经过身份验证的用户在您的站点上下文中执行,从而允许服务器端或客户端攻击。

        请参阅 http://www.acunetix.com/websitesecurity/upload-forms-threat.htmWhat security issues appear when users can upload their own files? 示例,其中提到了在您允许用户上传文件并在您的网站中展示它们以供下载之前需要注意的一些问题。

        1. 不要将文件放在正常的网站目录结构中

        2. 不要使用用户给你的原始文件名。您可以使用原始文件名添加内容处置标头,以便他们可以以相同的文件名再次下载它,但服务器上的路径和文件名不应该是用户可以影响的东西。

        3. 不要信任图像文件 - 调整它们的大小并仅提供调整后的版本以供后续下载

        4. 不要相信 mime 类型或文件扩展名,打开文件并对其进行操作以确保它是它声称的那样。

        5. 限制上传大小和时间。

        【讨论】:

        • 希望能更详细地了解#3 和#4。调整大小是否确保它们实际上是图像? open it 你的意思是检查应该告诉你文件类型的第一个字节吗?
        • 3.从本质上消除了损坏的元数据已包含在图像文件中以攻击一些编写不佳的浏览器或其他图像软件的可能性。 4. 是的,检查它是否真的是一个图像文件,其中包含与其声称的类型相对应的适当图像元数据。您可以将其加载到位图等中吗?用户通常会将损坏的图片上传到您的网站,尽早拒绝它们是个好主意。
        • 你提到“不要把文件放在你正常的网站目录结构中。但如果我不这样做,我怎么能链接到这个内容??
        • 是的,任何不可见的地方。上传通常会很大,所以大多数情况下我将它们放在单独的驱动器/SAN/...将它们推送到 S3/...
        • 如果您使用的是托管解决方案,您可以在站点结构中放入一个文件夹但拒绝所有访问:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多