asp.Net前后台校验缺一可否
引入:数据校验在软件开发中是不可或缺的部分,数据校验也有前后台校验之分。今天就结合自己所做的项目为大家简单讲解一下(大牛请绕过,下面所述内容只是我自己遇到、总结的,如果哪部分说的不正确,欢迎各位朋友留言指出,共同学习、进步)。
1、前台校验
Web页面,是一个数据进入的接口,对数据的合法性、正确性检测非常重要。前台校验,顾名思义,就是在Web页面进行数据的校验。前台有用户输入的各种表单内容,如文本框、下拉列表框、单选按钮等各种input标签。前台校验需要做的就是确保用户输入正确的数据格式。如开户名只能填写大小在2-10个之间的文字、银行卡号文本框只能输入19个数字、手机号只能填写输入11个数字。当用户输入的数据格式不满足要求时能给用户以友好的提示。
(1)方法
前台数据校验主要使用jQuery方法,可以编写js代码实现用户数据格式的正确输入。这里只是使用正则表达式进行校验(具体到asp.Net MVC 等开发模式可能还会有其他的前台校验方式),下面为大家上具体的代码举例。
$(function () { var name = $("#nickname"); //用户名 var namemsg = $("#namemsg"); var phone = $("#phoneno"); //手机 var phonenomsg = $("#phonenomsg"); var pwd = $("#pwd"); //密码 var pwdmsg = $("#msgpwd"); var repwd = $("#repwd"); //确认密码 var repwdmsg = $("#msgrepwd"); var code = $("#code"); //手机验证码 var codemsg = $("#msgcode"); var password = ""; var referee = $("#referee").val(); //推荐人id name.blur(function () { var reg = /^[0-9a-zA-Z_]*$/; if (name.val().length < 4) { namemsg.html("用户名长至少4位,数字或字母组合"); namemsg.show(); return false; } else if (!reg.test(name.val())) { namemsg.html("用户名格式不正确,数字或字母组合"); namemsg.show(); return false; } else if (name.val().length > 16) { namemsg.html("用户名长最多16位,数字或字母组合"); namemsg.show(); return false; } else if (/^\d{11}$/.test(name.val())) { namemsg.html("用户名不能是手机号码"); namemsg.show(); return false; } else if (/^[0-9a-zA-Z_\-]+@[0-9a-zA-Z_\-]+\.\w{1,5}(\.\w{1,5})?$/.test(name.val())) { namemsg.html("用户名不能是邮箱"); namemsg.show(); return false; } else { $.post($("#nickname").attr("url"), { name: name.val() }, function (msg) { if (msg == "-1") { namemsg.html("用户名不能为空"); namemsg.show(); return false; } else if (msg == "0") { namemsg.html("用户名已存在"); namemsg.show(); return false; } else if (msg == "1") { namemsg.html(""); return true; } }) } });上面是一段用户注册的代码,进行了用户名的简单校验:用户名长至少4位,用户名长最多16位,数字或字母的组合、用户名不能是手机号码、用户名不能是邮箱。其中主要用到的是正则表达式。
(2)优点
可以确保用户输入格式的正确,防止那些攻击数据以及不合理数据,降低网络负载、减轻服务器的压力。
(3)缺点
前台的数据校验只能确保用户输入格式的正确,并不能保证用户输入内容的正确。
那些攻击数据以及不合理数据可以绕过前台校验,对服务器、数据库的安全性有很大的威胁。
鉴于前台数据校验的上述缺点,我们就仍需要在后台进行数据的校验
2、后台校验
后台的校验也包含了前台校验的一部分功能:用户名必填、手机号码只能是11位、银行卡为19为,除此之外,后台还有一个前台没有的功能:校验数据内容。例如用户登录的时候,从数据库中查询用户的密码,进行比对,以判断用户密码正确与否。废话不多说,还是直接为大家上代码。
public ActionResult WithDrawMoney() { int Uid = 0; var Mid = WebHelper.GetCookie(StockFunds.Key.CookieKey.MemberId);//用户Id if (!string.IsNullOrWhiteSpace(Mid)) { Uid = Convert.ToInt32(SecureHelper.AESDecrypt(Mid)); MemberPartialInfo member = new MemberPartialInfo(); member = BLL.F_MemberBLL.GetMember.GetPartialInfo(Uid); var WithDrawMoney = Convert.ToDecimal(WebHelper.GetRequestString("withdrawalvalue")); string bank = WebHelper.GetRequestString("bankname"); string match = "^[1-9]{1}[0-9]*$"; Match ma = Regex.Match(WithDrawMoney.ToString(), match); if (!ma.Success) { AddUserLog("用户:" + Uid + "提现失败", Key.TradeType.Recharge.ToString()); return PromptView(Url.Action("withdraw", "UserPay", new { id = 1 }), "请输入正确的金额格式!", "Error"); } string password = WebHelper.GetRequestString("withdrawalpass"); if (member.AccountMoney < WithDrawMoney) { AddUserLog("用户:" + Uid + "提现失败", Key.TradeType.Recharge.ToString()); return PromptView(Url.Action("withdraw", "UserPay", new { id = 1 }), "请限制您的提现金额不大于账户金额!", "Error"); } string WithDrawPas = SecureHelper.MD5(password);//加密提现密码 if (WithDrawPas != member.WithDrawPassword) { AddUserLog("用户:" + Uid + "提现失败", Key.TradeType.Recharge.ToString()); return PromptView(Url.Action("withdraw", "UserPay", new { id = 1 }), "提现密码不正确!", "Error"); } MemberWithdraw memberwithdraw = new MemberWithdraw(); memberwithdraw.Mid = Uid; memberwithdraw.OrderMoney = WithDrawMoney; memberwithdraw.AddDate = System.DateTime.Now; memberwithdraw.WithDrawFee = 0; memberwithdraw.AddIp = WebHelper.GetIP(); memberwithdraw.EmployeeId = 0; memberwithdraw.State = -1;//未处理 memberwithdraw.OrderRemark = "用户:" + Uid + "于" + System.DateTime.Now + "申请" + WithDrawMoney + "提现金额"; var res = BLL.F_MemberBLL.GetMember.MemberWithDraw(memberwithdraw); string Zhengwen = "用户:" + Uid + "于" + System.DateTime.Now + "申请" + WithDrawMoney + "提现金额,请及时处理"; var result = StockFunds.AppCode.SMS.SendEmail.SenfEmailToAdmin("账户提现", Zhengwen, "OK"); if (res > 0) { AddUserLog("用户:" + Uid + "提现失败", Key.TradeType.Recharge.ToString()); return PromptView(Url.Action("withdraw", "UserPay", new { id = 1 }), "恭喜您,提现成功!", "Success"); } else { AddUserLog("用户:" + Uid + "提现失败", Key.TradeType.Recharge.ToString()); return PromptView(Url.Action("withdraw", "UserPay", new { id = 1 }), "提现失败!", "Error"); } } else { AddUserLog("用户未登录,提现失败", Key.TradeType.Recharge.ToString()); return PromptView(Url.Action("Index", "Home"), "请先登录!", "Error"); } }
上面是一段用户提现代码。当用户申请提现时,在后台进行了提现金额、提现密码的校验,确保了数据库的安全性和完整性。
(2)优点
后台校验的优点正是前台校验的缺点。它可以实现用户输入数据的正确校验,增强服务器和数据库的安全性。
(3)缺点
通过上面的讲解,我们也可以看到,后台校验的缺点也很明显:重复了前台校验的部分内容。但这样的缺点又是必须存在的(防止有些人绕过前段校验向后台post数据,保证服务器还有数据库的安全)。同样,后台的校验不能替代前台的校验,如果把所有的校验都放到后台,对网络负载还有服务器都是一个不小的压力。
3、总结
经过以上的讲解,我们可以看出:
前台负责校验数据格式,降低网络负载、减轻服务器压力。
后台主要负责校验数据内容,同时在前台校验失灵时进行数据格式的校验。
去掉前台校验会加重网络负载和服务器压力,去掉后台校验会造成服务器、数据库安全性降低。
前后台校验,他们各司其职,缺一不可。
相关文章:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。