我有一个显示画廊的网站。用户可以从网上上传自己的内容(通过输入网址)或从计算机上传图片。
我将URL存储在数据库中,该数据库适用于第一个用例,但如果用户从他们的计算机上传,我需要找出存储实际图像的位置。
这里有什么建议或我应该存储这些的最佳做法吗?
我应该将它们保存在appdata或内容文件夹中吗?它们是否应该与网站一起存储,因为它是用户内容?
答案 0 :(得分:60)
您不应将用户上传内容存储在网站结构中已知URL可直接访问的任何位置。这是一种安全风险,因为用户可以上传.htm文件和.js文件。即使是具有正确扩展名的文件也可能包含恶意代码,这些代码可以由经过身份验证的用户在您的站点上下文中执行,从而允许服务器端或客户端攻击。
请参阅示例http://www.acunetix.com/websitesecurity/upload-forms-threat.htm和What security issues appear when users can upload their own files?,其中提到了在允许用户上传文件然后在您的网站中下载文件之前需要注意的一些问题。
请勿将文件放在正常的网站目录结构中
请勿使用用户提供的原始文件名。您可以使用原始文件名添加内容处置标题,以便他们可以将其作为相同的文件名再次下载,但服务器上的路径和文件名不应该是用户可以影响的内容。
不信任图像文件 - 调整大小并仅提供调整后的版本以供后续下载
不要相信mime类型或文件扩展名,打开文件并对其进行操作以确保它是声称的。
限制上传大小和时间。
答案 1 :(得分:8)
根据您必须实现此类资源的资源,将所有这些内容存储在Amazon S3中是非常有益的。
上传完成后,您只需将其推送到亚马逊,然后在使用其他图片时弹出数据库中的网址。如上所述,打开图像并在发送之前调整大小可能是明智之举。这两个都检查它实际上是一个图像,并确保您不会意外地向最终用户呈现完整的相机分辨率图像。
如果您必须迁移/故障转移您的网站并且不想同步千兆字节的图片资产,那么立即执行此操作将会变得更加容易。
答案 2 :(得分:4)
一种方法是将图像存储在带有varbinary字段的数据库表中。
另一种方法是将图像存储在App_Data文件夹中,并为每个用户创建一个子文件夹(〜/ App_Data / [userid] /myImage.png)。
对于这两种方法,您需要创建一个单独的操作方法,以便可以访问图像。
答案 3 :(得分:3)
上传图片时,您需要在上传文件之前验证文件的内容。文件扩展名方法不可信。
使用幻数方法验证文件内容,这将是一种简单的方法。
请参阅stackoverflow post并查看list of magic numbers
保存文件的一种方法是将其转换为二进制格式并保存在我们的数据库中,下一个方法是使用App_Data文件夹。
存储选项取决于您的要求。另见this post
通过将maxRequestLength属性设置为Web.Config来设置上传限制,其中文件大小以KB为单位指定
<httpRuntime maxRequestLength="51200" executionTimeout="3600" />
答案 4 :(得分:-2)
您可以将您的可信数据与htdocs/www
文件夹并行保存,以便任何用户都无法访问该文件夹。如果您使用的是apache,还可以在可信数据上添加.htaccess身份验证(对于.htaccess,您应该将.htpasswd文件与htdocs / www文件夹并行保存)。