【问题标题】:Input Validation for a File文件的输入验证
【发布时间】:2020-09-25 15:04:42
【问题描述】:

我正在对我的应用程序运行安全扫描,并且不断从扫描程序中收到此错误消息。我已经尝试实现一些选项,但它不断带来同样的错误:

The ASP.NET application does not use, or incorrectly uses, the model validation framework.
Complex implementation error

有没有其他方法可以验证下面的输入,尤其是File

private string _Action { get; set; }

public string Action { get { return _Action; } set { if (value != null) _Action = value; } }

[Required]
[FileExtensions(Extensions = "csv,xlsx")]
public IFormFile File { get; set; }

【问题讨论】:

  • CSV 是文本,而 XLSX 是 Microsoft 专有的 Excel 二进制格式。除了用 Excel 打开之外,没有其他方法可以验证 xlsx 文件,
  • 哦,好吧,请问我可以做任何其他形式的验证吗?比如说[最大长度]?因为只使用 required 属性也会导致输入验证不足错误
  • 如果您使用 Excel 手动打开会发生什么?

标签: c# .net asp.net-mvc security asp.net-core


【解决方案1】:

从你的评论say for instance [max length]?,我认为你可以使用自定义验证属性。你可以参考it

这是一个用于验证文件大小和文件扩展名的演示:

TestFile.cs:

public class TestFile
{
    [MaxFileSize(10000)]
    [AllowedExtensionsAttribute(new string[] { ".txt"})]
    public IFormFile File { get; set; }
}

MaxFileSizeAttribute.cs:

public class MaxFileSizeAttribute : ValidationAttribute
{
    private readonly int _maxFileSize;
    public MaxFileSizeAttribute(int maxFileSize)
    {
        _maxFileSize = maxFileSize;
    }

    protected override ValidationResult IsValid(
    object value, ValidationContext validationContext)
    {
        var file = value as IFormFile;
        if (file != null)
        {
            if (file.Length > _maxFileSize)
            {
                return new ValidationResult(GetErrorMessage());
            }
        }

        return ValidationResult.Success;
    }

    public string GetErrorMessage()
    {
        return $"Maximum allowed file size is { _maxFileSize} bytes.";
    }
}

AllowedExtensionsAttribute.cs:

 public class AllowedExtensionsAttribute : ValidationAttribute
{
    private readonly string[] _extensions;
    public AllowedExtensionsAttribute(string[] extensions)
    {
        _extensions = extensions;
    }

    protected override ValidationResult IsValid(
    object value, ValidationContext validationContext)
    {
        var file = value as IFormFile;
        var extension = Path.GetExtension(file.FileName);
        if (file != null)
        {
            if (!_extensions.Contains(extension.ToLower()))
            {
                return new ValidationResult(GetErrorMessage());
            }
        }

        return ValidationResult.Success;
    }

    public string GetErrorMessage()
    {
        return $"The file extension is not allowed!";
    }
}

控制器:

[HttpGet]
    public IActionResult TestFileSize() {
        return View();
    }
    [HttpPost]
    public IActionResult TestFileSize(TestFile testFile)
    {
        if (!ModelState.IsValid) {
            Console.WriteLine("error");
        }
        return View();
    }

查看:

@model TestFile
@{
    ViewData["Title"] = "TestFileSize";
}

<h1>TestFileSize</h1>
<form method="post" enctype="multipart/form-data">
    <input type="file" id="File" asp-for="File" />
    <input type="submit" value="submit" />
</form>

结果:

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2018-01-10
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多