【问题标题】:Data annotations in .Net Core are only client side or they also validate server side?.Net Core 中的数据注释只是客户端还是它们也验证服务器端?
【发布时间】:2020-10-19 09:04:28
【问题描述】:

我读到人们可以从浏览器或其他东西中删除 javascript,并且客户端的验证停止工作,这对我们进行服务器端验证很重要..

在 .NET Core 中,我们有数据注释,这对服务器端和客户端都有效还是我们需要在服务器端进行验证?

另外,使用[Remote] 验证,是一样的吗?我正在使用这两种方法,但我不确定是否还需要对 create() 操作进行验证..

还有一件事,ModelState.IsValid() 是否适用于远程验证?感谢您的帮助

例子:

public IActionResult VerifyCargo(string Descricao, int ID_Cargo)
{
    var validateName = ValidateName(Descricao);

    if (validateName != null)
    {
        return Json($"Description {Descricao} is already in use.");
    }
    else
    {
        return Json(true);
    }
}

public RH_Cargos ValidateName(string Descricao)
{
    return _context.RH_Cargos.FirstOrDefault(x => x.Descricao == Descricao);
}

我有这些功能,并且在模型中我有一个 [remote] 注释,它调用第一个...

它工作正常,但我需要对Create 操作进行任何验证吗?或者这个remote 属性是否适用于服务器/客户端?安全吗?

【问题讨论】:

  • 他们倾向于在服务器端工作。 (IE ModelState.IsValid) 客户端只是Jquery validate的一个实现
  • 这意味着我不需要在服务器端进行任何验证,例如,我没有使数据库中的字段唯一...并且我进行了远程验证,如果我返回 true 或 javascript 错误存在该记录,我不需要在创建操作中进行更多验证,对吗?
  • 如果您想要验证而不是使用 XML 格式而不是 json,您可以在其中针对模式进行验证。
  • 我已经完成了所有的验证...而且一切正常,我真的不想在他们身上浪费更多的时间,我只是想知道是否可以安全地将其保留为他们是,或者如果我需要做任何服务器端实现......(我将更新一个简短示例的问题)

标签: c# asp.net-core-mvc data-annotations


【解决方案1】:

在 .NET Core 中,我们有数据注释,这对服务器端和客户端都有效还是我们需要在服务器端进行验证?

那些数据注释,即[Required],将在服务器上工作。正如其他人可能已经提到的那样,客户端验证是在您包含jQuery Unobtrusive ValidationjQuery validation 插件(当然还需要它们的依赖项jQuery)时添加的奖励/好处。

因此,如果有人在浏览器上关闭 JavaScript,不必担心。当数据回传到服务器时,您仍然会得到 MVC 框架的服务器端验证。

这也意味着客户端验证不可信。您可以看到其他人很容易绕过客户端验证并将数据提交到服务器(即使用 Postman 等第三方工具)。


另外,使用 [Remote] 验证,是一样的吗?

[Remote] 属性将调用服务器上定义的方法来确定该字段是否有效。为此,您需要定义一个返回 JSON 响应的操作方法。 true 以外的任何内容都表示无效输入。


我不确定是否还需要对 create() 操作进行验证。

您需要检查ModelState.IsValid 并决定出现错误时该怎么做。如果您的意思不是检查模态状态,那么我不知道您进行验证是什么意思。


ModelState.IsValid() 是否适用于远程验证?

我不确定你的意思。远程验证需要定义一个操作方法,该方法要么返回true 表示输入有效,falseundefindnull 表示输入无效,要么返回错误消息的字符串。

ModelState 在远程验证返回后会更新。


我的经验法则

我只是从不相信客户的输入。即使您已经设置了所有验证,您仍然需要进行域验证,以确保在信息持续存在时一切都处于有效状态。

我能想到的一个例子是:您有一个表单来获取用户的电子邮件并创建一个帐户。电子邮件字段使用远程验证来检查电子邮件是否已被接收。如果只是在远程验证返回 OK 之后发生这种情况,则另一个人只需在该人提交表单之前使用相同的电子邮件快速注册一个帐户。现在,您不能盲目地使用相同的电子邮件地址创建另一个帐户,因为该电子邮件已被占用。

【讨论】:

  • 我禁用了我的javascript并且我能够插入重复记录,[远程]验证不起作用...这是我的问题,我实际上需要在创建新记录之前进行验证再次验证服务器端是否一切正常。但这是一个很好的回应,我能够消除我对数据注释的疑虑。感谢回复
猜你喜欢
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多