首页 > 解决方案 > .Net Core 中的数据注释只是客户端还是它们也验证服务器端?

问题描述

我读过人们可以从浏览器或其他东西中删除 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属性是否适用于服务器/客户端?安全吗?

标签: c#asp.net-core-mvcdata-annotations

解决方案


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

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

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

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


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

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


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

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


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

我不确定你的意思是什么。远程验证需要定义一个操作方法,该方法要么返回true以指示输入有效,false要么undefind指示null输入无效,或者返回错误消息的字符串。

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


我的经验法则

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

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


推荐阅读