我有一个网站展示画廊。用户可以通过输入URL或从计算机上传图片来上传他们自己的内容。
我将URL存储在数据库中,这适用于第一种情况,但是如果用户从计算机上传,则需要确定在哪里存储实际图像。
这里是否有任何建议或最佳实践,我应该在哪里存储它们?
我应该将它们保存在appdata或content文件夹中吗?它们是否根本不应该与网站一起存储,因为这是用户内容?
我有一个网站展示画廊。用户可以通过输入URL或从计算机上传图片来上传他们自己的内容。
我将URL存储在数据库中,这适用于第一种情况,但是如果用户从计算机上传,则需要确定在哪里存储实际图像。
这里是否有任何建议或最佳实践,我应该在哪里存储它们?
我应该将它们保存在appdata或content文件夹中吗?它们是否根本不应该与网站一起存储,因为这是用户内容?
您不应该将用户上传的文件存储在可以通过已知URL直接访问到的站点结构中。这是一个安全风险,因为用户可能会上传htm文件和js文件。即使一个文件有正确的扩展名,它也可能包含恶意代码,可以由经过身份验证的用户在您的站点上下文中执行,从而允许服务器端或客户端攻击。
例如,请参阅http://www.acunetix.com/websitesecurity/upload-forms-threat.htm和What security issues appear when users can upload their own files? 这些内容提到了一些在允许用户上传文件并在站点中提供下载之前需要注意的问题。
不要将文件放在常规网站目录结构中。
不要使用用户给出的原始文件名。您可以添加内容描述标题以便他们可以再次下载相同的文件名,但服务器上的路径和文件名不应受到用户影响。
不要信任图像文件 - 调整它们的大小,并仅提供调整大小后的版本进行随后的下载。
不要信任MIME类型或文件扩展名,打开文件并操作以确保它是所声称的东西。
限制上传大小和时间。
一种方法是使用varbinary字段将图像存储在数据库表中。
另一种方法是将图像存储在App_Data文件夹中,并为每个用户创建一个子文件夹(~/App_Data/[userid]/myImage.png)。
对于这两种方法,您需要创建一个单独的操作方法,以便可以访问图像。
在上传图像时,您需要在上传文件之前验证文件的内容。文件扩展名方法并不可靠。
使用魔术数字法来验证文件内容将是一种简单的方法。
保存文件的一种方法是将其转换为二进制格式并保存在我们的数据库中,另一种方法是使用App_Data文件夹。
存储选项基于您的要求。还可以参考此帖子
通过将maxRequestLength属性设置为Web.Config,例如指定文件大小为KB,来设置上传限制:
<httpRuntime maxRequestLength="51200" executionTimeout="3600" />
您可以将可信数据保存在htdocs / www
文件夹的并行位置,以便任何用户都无法访问该文件夹。如果您正在使用apache,则还可以在可信数据上添加.htaccess身份验证(对于.htaccess,您应该将.htpasswd文件保留在htdocs / www文件夹的并行位置)。
- Paul Tyng