国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

讓 ASP.NET JS驗證和服務端的 雙驗證 更簡單

2019-11-17 02:08:47
字體:
來源:轉載
供稿:網友

asp.net JS驗證和服務端的 雙驗證 更簡單

只用javaScript驗證安全不安全誰都知道,答案是不安全,非常的不安全。因為在客戶端進行的驗證相當于“讓用戶自己驗證自己”,很明顯是不靠譜的。你不能避免一些惡意用戶人為的修改自己的表單進行欺騙,也不能避免第三方對表單進行截獲后進行篡改再提交。所以說,從安全的角度來說,單純的依靠js驗證,是不安全的,任何健壯的系統都必須在后端進行驗證。雙驗證大大增加了工作量,如何解決?方案1:笨方法,都寫一遍方案2:現有框架 ,比如MVC自帶驗證支持雙向驗證 ,不足點是要寫 model加attrbute 也要有一定工作量方案3:自已封裝我的選擇方案:方案3思路page 加載時通過Key去存儲表 form規則,通過form規則生成前臺元素的綁定,完成前臺驗證。后臺函數通過key在獲取表單規則進行后臺驗證。(可以用緩存機質提高性能)實現后臺代碼:通過GetInitScript存儲form規則并且賦值給 ViewState["intisript"]去前臺綁定前臺調用只要綁定 viewState["intiscript"] (其實什么都不要寫,保證元素name和 viewstate中一致就可以了):
<body>    <form id="form1" runat="server" class="contact_form">    <ul>        <li>            <h2>                表單驗證</h2>            <span class="required_notification">* 表示必填項</span> </li>        <li>            <label for="name">                姓名:</label>            <input type="text" name="name" />        </li>        <li>            <label>                姓別:</label>            <input type="radio" value="1" name="sex" />男            <input type="radio" value="0" name="sex" />女 </li>        <li>            <label for="email">                電子郵件:</label>            <input type="email" name="email" />        </li>        <li>            <label for="website">                手 機:</label>            <input type="text" name="phone" />        </li>        <li>            <label for="website">                學 歷:</label>            <select name="education" >                <option value="">==請選擇==</option>                <option value="1">大學</option>            </select>        </li>        <li>            <label for="message">                備注:</label>            <textarea name="remark" cols="40" rows="6"></textarea>        </li>        <li></li>    </ul>    <br />    <asp:Button ID="Button1" runat="server" Text="submit" CSSClass="submit" OnClick="Button1_Click" />    </form>    <%=ViewState["intiscript"]%></body>

  

 ViewState["intiscript"] 將生成一段腳本 給HTML元素添加 pattern、placeholder和requierd 等屬性 ,有了這些屬性可以很方便的使用JS等插件進行前端驗證下面是通過ViewState["intiscript"] 生成出來的HTML
 
       后臺使用 PostValidation函數進行驗證

我們來看看效果: 

提交成功驗證通過了,下面我來改下前端元素采 用惡意參數 提交后臺

前臺驗證通過: 

后臺還是要把你給揪出來

最后附上C#驗證類代碼:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExPRessions;namespace SyntacticSugar{    /// <summary>    /// ** 描述:可以方便實現前后端雙驗證,基于jquery    /// ** 創始時間:2015-6-4    /// ** 修改時間:-    /// ** 作者:sunkaixuan    /// ** 使用說明:http://m.survivalescaperooms.com/sunkaixuan/p/4550580.html    /// </summary>    public class ValidationSugar    {        private static List<ValidationOption> ValidationOptionList = new List<ValidationOption>();        /// <summary>        /// 前臺注入        /// </summary>        /// <param name="pageKey"></param>        /// <param name="itemList"></param>        public static string GetInitScript(string pageKey, List<OptionItem> itemList)        {            //初始化后不在賦值            if (ValidationOptionList.Any(it => it.PageKey == pageKey))            {                return (ValidationOptionList.Single(c => c.PageKey == pageKey).Script);            }            else            {                ValidationOption option = new ValidationOption();                string uk = Guid.NewGuid().ToString().Replace("-", "");//唯一函數名                string script = @"<script>var bindValidation{1}=function(name,params){{     var selectorObj=$(""[name='""+name+""']"");     selectorObj.after(""<span class=/""form_hint/"">""+params.tip+""</span>"");     if(params.pattern!=null)     selectorObj.attr(""pattern"",params.pattern);     if(params.placeholder!=null)     selectorObj.attr(""placeholder"",params.placeholder);     if(params.isRequired==true)     selectorObj.attr(""required"",params.isRequired);}}{0}</script>";                StringBuilder itemsCode = new StringBuilder();                foreach (var item in itemList)                {                    switch (item.Type)                    {                        case OptionItemType.Mail:                            item.Pattern = @"^[//w-]+(//.[//w-]+)*@[//w-]+(//.[//w-]+)+$";                            break;                        case OptionItemType.Int:                            item.Pattern = @"^//d{1,11}$";                            break;                        case OptionItemType.Double:                            item.Pattern = @"^//d{1,11}$";                            break;                        case OptionItemType.IdCard:                            item.Pattern = @"^(//d{15}$|^//d{18}$|^//d{17}(//d|X|x))$";                            break;                        case OptionItemType.Date:                            item.Pattern = @"^(((1[8-9]//d{2})|([2-9]//d{3}))([-///])(10|12|0?[13578])([-///])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]//d{2})|([2-9]//d{3}))([-///])(11|0?[469])([-///])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]//d{2})|([2-9]//d{3}))([-///])(0?2)([-///])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-///])(0?2)([-///])(29)$)|(^([3579][26]00)([-///])(0?2)([-///])(29)$)|(^([1][89][0][48])([-///])(0?2)([-///])(29)$)|(^([2-9][0-9][0][48])([-///])(0?2)([-///])(29)$)|(^([1][89][2468][048])([-///])(0?2)([-///])(29)$)|(^([2-9][0-9][2468][048])([-///])(0?2)([-///])(29)$)|(^([1][89][13579][26])([-///])(0?2)([-///])(29)$)|(^([2-9][0-9][13579][26])([-///])(0?2)([-///])(29))|(((((0[13578])|([13578])|(1[02]))[//-/////s]?((0[1-9])|([1-9])|([1-2][0-9])|(3[01])))|((([469])|(11))[//-/////s]?((0[1-9])|([1-9])|([1-2][0-9])|(30)))|((02|2)[//-/////s]?((0[1-9])|([1-9])|([1-2][0-9]))))[//-/////s]?//d{4})(//s(((0[1-9])|([1-9])|(1[0-2]))//:([0-5][0-9])((//s)|(//:([0-5][0-9])//s))([AM|PM|am|pm]{2,2})))?$";                            break;                        case OptionItemType.Mobile:                            item.Pattern = @"^[0-9]{11}$";                            break;                        case OptionItemType.Telephone:                            item.Pattern = @"^(//(//d{3,4}//)|//d{3,4}-|//s)?//d{8}$";                            break;                        case OptionItemType.Fax:                            item.Pattern = @"^[+]{0,1}(//d){1,3}[ ]?([-]?((//d)|[ ]){1,12})+$";                            break;                        case OptionItemType.Regex:                            break;                    }                    itemsCode.AppendFormat("bindValidation{0}('{1}',{{   tip:'{2}',pattern:'{3}',placeholder:'{4}',isRequired:{5} }})", uk, item.FormFiledName, item.Tip, item.Pattern, item.Placeholder,item.IsRequired?"true":"false");                    itemsCode.AppendLine();                }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绍兴县| 防城港市| 舟曲县| 屏边| 广东省| 鹰潭市| 高州市| 玉门市| 乌拉特前旗| 罗甸县| 介休市| 虹口区| 蒙阴县| 潞城市| 宝清县| 桐乡市| 阿尔山市| 河津市| 阳高县| 宜良县| 若尔盖县| 云梦县| 贵溪市| 三原县| 铜陵市| 巴南区| 沿河| 鹰潭市| 娄底市| 道孚县| 海原县| 乌审旗| 福建省| 奉化市| 托克逊县| 呈贡县| 潞西市| 天祝| 湾仔区| 永丰县| 郓城县|