我允许上传任何文件扩展名,但我会将文件存储在不直接由 Web 服务器提供服务的文件夹中。然后,我将创建一个从电子邮件链接到的 HTTP 处理程序,该处理程序将传输所请求的文件。可以通过原始文件名、系统生成的文件名或 ID 来请求文件。无论哪种方式,我都会清理参数以防止目录遍历攻击。
例如www.example.com/FileLink.ashx?FileName=Word.docx
这样,您无需担心将来是否希望将其他文件扩展名作为可执行文件类型提供服务,因为任何文件都是直接从文件系统的字节流提供的,并且永远不会通过 Web 服务器处理程序传递。
您还可以使用处理程序来检查当前用户是否具有加载文件的正确权限。
对每个文件进行病毒扫描也是值得的,以防时事通讯作者上传(无论是恶意还是意外)的文件会攻击订阅者的计算机而不是服务器。
还要确保Content-Disposition https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition被设定为attachment
:
Content-Disposition: attachment; filename="filename.html"
这可以防止通过上传包含脚本标签的 HTML 或其他同源策略来实现 XSS使用 Flash 或 PDF 文件绕过 https://soroush.secproject.com/blog/2014/05/even-uploading-a-jpg-file-can-lead-to-cross-domain-data-hijacking-client-side-attack/。这里的场景是一名新闻通讯编辑危及另一名新闻通讯编辑的会话。还值得设置X-Content-Options: nosniff
,这也可以防止这种情况。xap
文件 (Silverlight) 也可能绕过同源策略,因此请检查文件名不能以.xap
索取您的文件
e.g. www.example.com/FileLink.ashx/x.xap?FileName=Word.docx
您可以将 Silverlight 的内容类型设置列入黑名单,作为这种特殊情况的额外保护。来源在这里 https://github.com/nccgroup/CrossSiteContentHijacking/blob/master/README.md:
注意:.XAP 文件可以重命名为任何其他扩展名,但不能
不再跨域加载了。 Silverlight 似乎找到了该文件
根据提供的 URL 扩展名,如果不是 .XAP,则忽略它。
如果网站允许用户使用“;”,则仍然可以利用此漏洞。或者
“/”在实际文件名后添加“.XAP”扩展名。
注意:Silverlight跨域请求.XAP文件时,内容
类型必须是:application/x-silverlight-app。
我自己也验证了这些场景,它们是目前有效的攻击媒介。