• 使用MVC Remote验证


    直接上关键代码:

     public class RegisterModel

    复制代码
    {        
            [Required(ErrorMessage =  " *邮箱地址不能为空 ")] 
            [DataType(DataType.EmailAddress)] 
            [RegularExpression( @" ^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$ ", ErrorMessage =  " *请输入正确的邮箱格式 ")] 
            [ Remote( " IsExistEmail ",  " Validator ",ErrorMessage= " *该邮箱地址已经被注册过 ")] 
              public  string email {  get;  set; }

    ... 

    复制代码
    复制代码
    ///   <summary> 
             ///  验证该EMail账户是否已经被注册过了
             ///   </summary> 
             ///   <param name="email"></param> 
             ///   <returns></returns> 
            
             public JsonResult IsExistEmail( string email) 
            { 
                 bool valid =  false; 
                 if (!AccountServices.IsExistMail(email)) 
                    valid =  true; 
                 
                 return Json(valid,JsonRequestBehavior.AllowGet); 

            }
    复制代码

    前端的代码如下:

    @Html.TextBoxFor(m => m.email) 
    @Html.ValidationMessageFor(m => m.email)

    代码很简单,我想大家都很容易懂,但问题在哪里呢?

    问题就是注册完成后,如果你直接点浏览器后退,就能绕开这个验证机制,因为验证通过这个过程被缓存起来了。

    这样就很容易在后端出现冗余数据,甚至搞乱程序的业务规则,当然健壮的程序会在业务层再次验证是否存在email,存在则抛出异常,但往往这是避免恶意注册和攻击之类的,返回到用户这边是出错页面,非常的不友好。此类问题在注册码等场景上问题更大,明明用户输入的是正确的验证码,由于缓存了之前的,所以怎么输都不对,从而让这些用户流失,所以还是要从本源上去解决:

    解决思路其实很简单:你缓存是吧,我不让你缓存不就行了?ValidatorController中代码如下: 

    复制代码
    using System.Web.UI; 
    ///  < summary > 
            /// 验证该EMail账户是否已经被注册过了 
            ///  </ summary > 
            ///  < param  name ="email" ></ param > 
            ///  < returns ></ returns > 
             [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]   //清除缓存 
            public JsonResult IsExistEmail(string email) 
            { 
                bool valid = false; 
                if (!AccountServices.IsExistMail(email)) 
                    valid = true; 
                 
                return Json(valid,JsonRequestBehavior.AllowGet); 
    }
  • 相关阅读:
    Python编程知识
    Ubuntu 20.04.3 LTS + Intel Realsense 400系列
    Kubectl
    在Debian Buster中安装redis-cli
    MySQL中最近执行的查询的信息
    EntityFramework 在脚本中使用in
    CLDR TimeZone Mapper
    Skyspark Axon
    Async Restsharp call
    HTTP 1.1 中的Accept-Language header
  • 原文地址:https://www.cnblogs.com/cylblogs/p/5029175.html
Copyright © 2020-2023  润新知