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、总结

经过以上的讲解,我们可以看出:

前台负责校验数据格式,降低网络负载、减轻服务器压力。

后台主要负责校验数据内容,同时在前台校验失灵时进行数据格式的校验。

去掉前台校验会加重网络负载和服务器压力,去掉后台校验会造成服务器、数据库安全性降低。

前后台校验,他们各司其职,缺一不可。

相关文章:

正则表达式

MVC学习系列-表单数据的校验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值