从用户上传保存图像的最佳位置在哪里

leo*_*ora 40 security asp.net-mvc storage image

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

我将URL存储在数据库中,该数据库适用于第一个用例,但是如果用户从他们的计算机上传,我需要找出存储实际图像的位置.

这里有什么建议或我应该存储这些的最佳实践吗?

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

Ian*_*cer 62

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

例如,请参阅http://www.acunetix.com/websitesecurity/upload-forms-threat.htm以及用户上传自己的文件时会出现哪些安全问题?其中提到了在允许用户上传文件然后在您的网站中下载文件之前需要注意的一些问题.

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

  2. 请勿使用用户提供的原始文件名.您可以使用原始文件名添加内容处置标头,以便它们可以将其作为相同的文件名再次下载,但服务器上的路径和文件名不应该是用户可以影响的内容.

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

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

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

  • 3.基本上消除了图像文件中包含损坏的元数据以攻击一些写得不好的浏览器或其他图像软件的可能性.4.是的,检查它确实是一个图像文件,其中包含与其声称的类型相对应的相应图像元数据.你可以把它加载到位图等?用户经常会将损坏的图像上传到您的网站,提前拒绝它们是一个好主意. (3认同)
  • 会喜欢#3和#4的更多细节.调整大小是否确保它们实际上是图像?并且通过`open it`你的意思是检查应该告诉你文件类型的第一个字节吗? (2认同)
  • 你提到"不要把文件放在你的正常网站目录结构中.但如果我不这样做,我怎么能链接到这个内容? (2认同)
  • 是的,任何不可见的地方。上传通常会变得很大,所以大多数情况下我将它们放在单独的驱动器/SAN/...将它们推送到 S3/... (2认同)
  • 如果您使用的是托管解决方案,您可以在站点结构中放入一个文件夹但拒绝所有访问: <authorization> <deny users ="*" /> </authorization> (2认同)

dmn*_*mnc 8

根据您必须实现此类资源的资源,将所有这些内容存储在Amazon S3中是非常有益的.

上传后,只需将其推送到亚马逊,然后在处理其他图片时弹出数据库中的URL.如上所述,打开图像并在发送之前调整大小可能是明智之举.这两个都检查它实际上是一个图像,并确保您不会意外地向最终用户呈现完整的相机分辨率图像.

如果您必须迁移/故障转移您的站点并且不想同步千兆字节的图像资产,现在执行此操作将使这一过程变得更加容易.