使用MVC Remote驗證的注意點

這實際上是一個比較簡單的問題,但每每挺容易被忽略,此次咱們在推廣咱們的互聯網平臺的時候就吃了這麼一個大虧。 通常用戶註冊過程當中,前端註冊每每會檢驗用戶名、暱稱是否已存在,甚至驗證碼是否匹配,咱們均可以用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 {  getset; }

... 瀏覽器

緩存

複製代碼
複製代碼
///   <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);

        }
複製代碼

前端的代碼以下:ui

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

代碼很簡單,我想你們都很容易懂,但問題在哪裏呢?spa

問題就是註冊完成後,若是你直接點瀏覽器後退,就能繞開這個驗證機制,由於驗證經過這個過程被緩存起來了。code

這樣就很容易在後端出現冗餘數據,甚至搞亂程序的業務規則,固然健壯的程序會在業務層再次驗證是否存在email,存在則拋出異常,但每每這是避免惡意註冊和攻擊之類的,返回到用戶這邊是出錯頁面,很是的不友好。此類問題在註冊碼等場景上問題更大,明明用戶輸入的是正確的驗證碼,因爲緩存了以前的,因此怎麼輸都不對,從而讓這些用戶流失,因此仍是要從本源上去解決:blog

解決思路其實很簡單:你緩存是吧,我不讓你緩存不就好了?ValidatorController中代碼以下: get

複製代碼
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);
}
複製代碼


到此,這個場景下的問題能夠解決,由於想讓你們更從實際場景的思惟方式去考慮問題,寫的有點羅嗦了,請見諒! string

相關文章
相關標籤/搜索