用户上传的图片最佳存储位置在哪里?

43

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

我将URL存储在数据库中,这适用于第一种情况,但是如果用户从计算机上传,则需要确定在哪里存储实际图像。

这里是否有任何建议或最佳实践,我应该在哪里存储它们?

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

5个回答

67

您不应该将用户上传的文件存储在可以通过已知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. 限制上传大小和时间。


2
希望在第三点和第四点上能够提供更多细节。调整大小是否确保它们实际上是图像?而通过“打开它”,您是否意味着检查应该告诉您文件类型的第一个字节? - Omar
3
  1. 这基本上消除了图像文件中包含腐败元数据以攻击某些编写不佳的浏览器或其他图像软件的可能性。
  2. 是的,请检查它是否真的是具有相应类型的图像元数据的图像文件。 它可以加载到位图等吗? 用户经常会将损坏的图像上传到您的网站,早期拒绝它们是一个好主意。
- Ian Mercer
3
你提到“不要把文件放在你的正常网站目录结构中”。但如果我不这样做,我怎么链接到这些内容呢? - leora
2
是的,任何不可见的地方都可以。上传通常会变得很大,所以我通常会将它们放在单独的驱动器/ SAN / ... 上,然后将它们推送到S3 / ...上。 - Ian Mercer
2
如果您使用的是托管解决方案,您可以将其放在站点结构中的文件夹中,但拒绝所有访问: - Paul Tyng
显示剩余3条评论

9
根据您实现此类功能所拥有的资源,将所有内容存储在Amazon S3中非常有益。一旦上传完成,您只需将其推送到Amazon并将URL放入数据库中,就像处理其他图像一样。如上所述,最好在发送之前打开图像并调整其大小。这既可以检查它是否为图像,又可以确保不会意外向最终用户呈现完整的相机分辨率图像。现在这样做将使您在必须迁移/故障转移站点但不想同步吉字节的图像资产时变得更加容易。

我喜欢这个答案,但你也应该考虑安全性。使用S3将最小化通过您的站点传输的流量。但是,您需要确保文件是它们所说的那样,我会在上传到S3之前对图像应用过滤器,这样您就知道如果过滤器成功,则是图像。 - Angelom
确实。这就是我在调整大小步骤中所说的,但无论如何,最好有任何一种良好的、坚实的检查方法,以确保您拥有真实的图像。 - dmnc

4

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

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

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


我们在网站上有用于静态常见内容的数据库方法。我们使用它来调用版本。这很有效,我们可以压缩二进制数据块。 - Omnia9

3

在上传图像时,您需要在上传文件之前验证文件的内容。文件扩展名方法并不可靠。

使用魔术数字法来验证文件内容将是一种简单的方法。

请参阅stackoverflow post魔术数字列表

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

存储选项基于您的要求。还可以参考此帖子

通过将maxRequestLength属性设置为Web.Config,例如指定文件大小为KB,来设置上传限制:

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

-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接