提问人:Skary 提问时间:5/8/2023 更新时间:5/9/2023 访问量:72
Sanify Excel 文件上传到 ASP.NET
Sanify Excel File uploaded to ASP.NET
问:
我正在为一个 ASP.NET 页面编写一个过程,用户在该页面中上传包含代码列表的 Excel 文件。
由于执行上传的用户不受信任,因此恐怕可能会上传一个特别危险的 Excel 文件。我不太关心宏(因为当我解析文件时,我会忽略它们),但是专门构建的 Excel 文件可能会导致(在我用于解析的组件中)一些不可预测的重灾区(例如远程代码执行)。
总之,我习惯于清理我的 ASP.NET 项目中的所有用户输入,但不知道如何清理更新的 Excel 文件,所以我有一个安全问题,不知道如何清理。
答:
好吧,简单的答案是不使用任何 Excel 对象和自动化。还记得,如果您将 excel 文件重命名为 .zip 文件扩展名?
然后,您可以打开zip文件,然后查看内部。数据、代码/宏和其他内容将由开发人员看到。
因此,我允许上传文件,但随后通过XML处理数据并将其放入新的Excel工作表中。在这一点上,您将“离开”原始文件,并且只会提取数据,并且只能通过查看 excel 工作表的 xml 文件部分来提取数据 - 甚至从未使用 Excel 打开、复制、传输数据。
最终结果是一个新的 Excel 工作表,并且从未被 Excel “自动化”,而是由原始 xml 副本创建的 Excel 工作表。因此,原始的 XML“副本”将留下加载的原始 Excel 工作表的任何其他方面,例如代码或其他任何内容,例如加载项或其他任何内容。
这确实意味着您不能支持以前的 Office(2003 年之前)“二进制”xls 文件,而只接受 xlsx 文件。此外,您只能从该文件中复制 xml,在任何时间点都不会复制或使用 Excel 文件,并且永远不会使用 Excel 应用程序打开 Excel 文件。
因此,我建议使用 openxml,因为 XML 文件没有代码或恶意能力。
换句话说,您的软件将创建最终的 Excel 文件,并且您的软件将仅通过 xml 数据的副本创建该 Excel 文件,因此不会使用上传文件中的任何其他内容,也不会转移到该新的 Excel 工作表中。您甚至没有使用 Excel 创建生成的文件。
最终结果将至少是处理XML文件的安全级别,或者说允许用户上传XML文件。 因此,这些文件如今是运行大多数网站和互联网技术的“粘合剂”。
尽管 json 作为一种数据格式兴起,但网页实际上是一个“DOM”,而 DOM 在很大程度上确实是 xml 格式。那么,我们在这个行业中使用的工具、想法和概念是什么?它非常以 XML 为中心。公平地说,当我使用术语 XML 时,它确实存在于 .net 土地 XXMAL 中,但它仍然是我们正在处理的基于“标签”的分隔结构。
因此,拉出该 Excel 文件中的 xml 数据,然后丢弃原始上传的文件应该提供高级别的安全性,并在原始上传中留下任何恶意内容。
因此,只要您不启动该上传的文件(也许它是伪造的带有 Excel 文件扩展名的.exe文件!!!),那么您就可以在安全方面保持良好状态。
编辑:使用 closedXML 的示例。
因此,这是“空气代码”或概念验证代码。
protected void Button1_Click(object sender, EventArgs e)
{
string sFile = @"c:\test\tblHotelsA.xlsx";
string sFileout = @"c:\test\tblHotelsAR.xlsx";
XLWorkbook MyExcel = new XLWorkbook(sFile);
XLWorkbook MyTargetExcel = new XLWorkbook();
IXLWorksheet MyTargetSheet = MyTargetExcel.Worksheets.Add("mytarget");
if (MyExcel.Worksheets.Count >= 0)
{
// get first work book, process
IXLWorksheet MyWorkBook = MyExcel.Worksheet(1);
MyWorkBook.CopyTo(MyTargetExcel);
MyTargetExcel.SaveAs(sFileout);
}
}
现在,当然上面是硬编码的文件名。因此,毫无疑问,您采用了用户加载并保存的原始文件名。然后,您可以在文件名中添加“-processed.xlxs”,然后将数据复制到这个新创建的工作表中 - 一个是您的代码创建的,另一个不是由客户创建的。
有很多例子。在上面,我可能应该保持工作簿名称相同,但您可以采用自动导入数据库的标准,从而“规范化”甚至工作簿名称始终相同。
评论