【问题标题】:Best way to validate files in ASP .NET Core Controller?在 ASP .NET Core 控制器中验证文件的最佳方法?
【发布时间】:2021-03-08 16:17:05
【问题描述】:

我有一个带有 .NET Core 后端的 Angular 应用程序。

要执行批量导入,用户可以上传包含多行的文件。每行包含一个电子邮件地址,然后被邀请为应用程序创建一个帐户。

为此,我有一个文件类型的输入字段。

<input type="file">

文件以multipart/form-data 的形式发送到我的后端控制器。

现在验证文件的最佳方法是什么?

目前,我正在根据允许的 ContentType 列表检查 ContentType。此外,我检查了文件的大小,因为具有估计内容的文本文件不应超过 250 KB。

var allowedFileTypes = new List<string>
  {
    ".txt",
    ".csv",
    "text/comma-separated-values",
    "text/plain",
    "text/richtext",
    "text/rtf",
    "application/vnd.ms-excel"
  };

  var maxFileSize = 250000; //250KB

  var file = Request.Form.Files.First();

  if (!allowedFileTypes.Contains(file.ContentType))
    return BadRequest();

  if (file.Length > maxFileSize)
    return BadRequest();

还有其他方法可以验证文件吗?我需要考虑任何安全问题吗?例如,是否可以在 .csv 文件中注入恶意代码。

【问题讨论】:

  • 在您的上下文中“验证”和“处理安全”是什么意思?这些问题在很大程度上取决于您打算如何处理这些文件。
  • 旁注:250000 != 250KB。 250KB=250*1024=256000
  • @Magnetron 校正:250KB == 250000B。但是:250KiB == 256000B。
  • @FranzGleichmann 取决于您的上下文。 Windows 使用 KB 作为 1024B,Linux 称之为 KiB。从 OP 上下文来看,他们可能想要 256000B。

标签: c# .net file asp.net-core


【解决方案1】:

还有其他方法可以验证文件吗?

通常,我们使用扩展名验证文件:

private string[] permittedExtensions = { ".txt", ".pdf" };

var ext = Path.GetExtension(uploadedFileName).ToLowerInvariant();

if (string.IsNullOrEmpty(ext) || !permittedExtensions.Contains(ext))
{
    // The extension is invalid ... discontinue processing the file
}

我是否需要考虑任何安全问题?例如,是否可以在 .csv 文件中注入恶意代码。

您可以对上传的内容使用第三方病毒/恶意软件扫描 API。

更多详情,请参考doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2020-08-07
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2021-06-25
    相关资源
    最近更新 更多