只用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(); }
新聞熱點
疑難解答