引入:数据校验在软件开发中是不可或缺的部分,数据校验也有前后台校验之分。今天就结合自己所做的项目为大家简单讲解一下(大牛请绕过,下面所述内容只是我自己遇到、总结的,如果哪部分说的不正确,欢迎各位朋友留言指出,共同学习、进步)。
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、总结
经过以上的讲解,我们可以看出:
前台负责校验数据格式,降低网络负载、减轻服务器压力。
后台主要负责校验数据内容,同时在前台校验失灵时进行数据格式的校验。
去掉前台校验会加重网络负载和服务器压力,去掉后台校验会造成服务器、数据库安全性降低。
前后台校验,他们各司其职,缺一不可。
相关文章: