一个简单的后台与数据库交互的登录与注册[sql注入处理、以及MD5加密]
一、工具:
vs2013[因为我现在用的也是2013,版本随便你自己开心]
sql2008[准备过久升级]
二、用到的语言
html+css+jquery+ajax+sqlserver
html[相当于一个人]
css[要穿衣服]
jquery[人要做一些动作,jquery是对js一些常用方法的封装]
ajax[建立前端页面与数据库的交互]
sqlserver[数据库]
三、过程
html部分代码:
<body> <div id="header"> <div id="header_con"> <a href="javascript:;" onclick="showregbox()">注册</a> <a href="javascript:;" onclick="showloginbox()">登录</a> </div> </div> <div id="loginbox"> <div class="login_item"> <input type="text" id="txtusername" placeholder="手机邮箱/用户名" /> </div> <div class="login_item"><input type="password" id="txtpwd" placeholder="请输入密码" /></div> <div class="login_item"><a href="javascript:;" onclick="login()">登录</a></div> </div> <div id="regbox"> <div class="login_item"><input type="text" id="txtregusername" placeholder="手机邮箱/用户名" /></div> <div class="login_item"><input type="password" id="txtregpwd" placeholder="请输入密码" /></div> <div class="login_item"><input type="text" id="txtregqq" placeholder="qq号"/></div> <div class="login_item"><input type="text" id="txtregemail" placeholder="邮箱" /></div> <div class="login_item"><a href="javascript:;" onclick="reglogin()">注册</a></div> </div> </body>
css代码:
* { margin:0px; padding:0px; } #header { height:40px; width:100%; background:#000000; } a { text-decoration:none; } #header a { float:right; color:#ffffff; line-height:40px; margin-left:10px; } #header_con { width:1200px; margin:0px auto; } .login_item { margin-left:20px; } .login_item input { width:348px; height:40px; margin-top:10px; border:solid 1px #04a6f9; } .login_item a { margin-top:20px; width:350px; height:40px; display:block; background:#04a6f9; color:#ffffff; line-height:40px; text-align:center; } #loginbox { display:none;/*//隐藏状态*/ margin:0px auto; } #regbox { display:none; }
js代码:[用了layer插件]
/// <reference path="_references.js" /> /// <reference path="jquery.md5.js" /> function showloginbox() { layer.open({ type: 1, title: "用户登录", //设置div大小 area: ["390px", "300px"], content: $("#loginbox") }); } function login() { //1.获取到用户名和密码 var username = $.trim($("#txtusername").val()); var pwd =$.md5( $.trim($("#txtpwd").val())); //2.判断用户名和密码是否为空 if (username == "" || pwd == "") { layer.alert("用户名或密码不能为空!", { title: "提示:", icon: 5 }); } else { $.post("/handler1.ashx", { "username": username, "pwd": pwd,"cmd":"login" }, function (data) { if (data == "登录成功") { //layer.alert("登录成功!", layer.msg("登录成功!", { //title: "提示:", icon: 6 }); } else { layer.msg("用户名或密码不正确", { //title: "提示:", icon: 5 }); } }); } } function showregbox() { layer.open({ type:1, title:"注册", area: ["390px", "350px;"], //div的内容 content:$("#regbox") }); } function reglogin() { //1.获取到输入的内容 var username = $.trim($("#txtregusername").val()); var pwd =$.md5($.trim($("#txtregpwd").val())); var qq = $.trim($("#txtregqq").val()); var email = $.trim($("#txtregemail").val()); //并做判断 if (username == "" || pwd == "") { layer.msg("用户名或密码不能为空!"); } else {//cmd用做标示,判断是注册还是登录 $.post("/handler1.ashx", { "username": username, "pwd": pwd,"qq":qq,"email":email,"cmd": "reg" }, function (data) { if (data == "注册成功") { layer.msg("恭喜你,注册成功!", { icon: 6 }); } else { layer.msg(data, { icon:5 }); } }); } }
ajax代码:
using system; using system.collections.generic; using system.linq; using system.web; using system.data; using system.data.sqlclient; namespace baidu20160707 { /// <summary> /// handler1 的摘要说明 /// </summary> public class handler1 : ihttphandler { public httpcontext context; public string strresult = ""; public void processrequest(httpcontext context) { this.context = context; string cmd=context.request.form["cmd"]; switch (cmd) { case "login": strresult = loginajax(); break; case "reg": strresult = regajax(); break; } context.response.write(strresult); } //登录 public string loginajax() { //1.接收传过来的用户名和密码 string username = context.request.form["username"]; //类名调用方法,32位,再做加盐处理 string pwd =md5class.getmd5( context.request.form["pwd"]+"傻逼玩意",32); //所在对应的id是否存在 //string strsql = string.format("select id from users where username='{0}' and pwd='{1}'", username, pwd); //sql注入处理1.@传参的方式,, username, pwd不要,'分号也不要' string strsql = string.format("select id from users where username=@username and pwd=@pwd"); //sql注入处理2.调用sqlparameter[]数组对数据进行过滤 sqlparameter[] paras = new sqlparameter[] { new sqlparameter("@username",sqldbtype.nvarchar), new sqlparameter("@pwd",sqldbtype.nvarchar) }; //sql注入处理3.指定它的值 paras[0].value = username; paras[1].value = pwd; //sql注入处理,4.不能忘记把数组对象传进去 if (sqlhelper.exists(strsql,paras)) { //context.response.write("登录成功"); return "登录成功"; } else { //context.response.write("用户名或密码不正确"); return "用户名或密码不正确"; } } //注册 public string regajax() { //接收传过来的用户名和密码 string username=context.request.form["username"]; string pwd=md5class.getmd5(context.request.form["pwd"]+"傻逼玩意",32); string qq=context.request.form["qq"]; string email = context.request.form["email"]; //string strsql1 = string.format("select id from users where username='{0}' ",username,pwd); string strsql1 = string.format("select id from users where username=@username "); sqlparameter[] paras1 = new sqlparameter[] { new sqlparameter("@username",sqldbtype.nvarchar) }; paras1[0].value = username; if (sqlhelper.exists(strsql1, paras1)) //if (sqlhelper.exists(strsql1)) { return "该用户已注册,请重新输入"; } else { //不存在就注册 //string strsql2 = string.format("insert into users (username,pwd,qq,email) values('{0}','{1}','{2}','{3}')", username, pwd, qq, email); //, username, pwd, qq, email string strsql2 = string.format("insert into users (username,pwd,qq,email) values(@username,@pwd,@qq,@email)"); sqlparameter[] paras2 = new sqlparameter[] { new sqlparameter("@username",sqldbtype.nvarchar), new sqlparameter("@pwd",sqldbtype.nvarchar), new sqlparameter("@qq",sqldbtype.nvarchar), new sqlparameter("@email",sqldbtype.nvarchar), }; paras2[0].value = username; paras2[1].value = pwd; paras2[2].value = qq; paras2[3].value = email; //插入处理 if (sqlhelper.exectenonquerytext(strsql2, paras2) > 0) { return "注册成功"; } else { return "注册失败"; } } } public bool isreusable { get { return false; } } } }
效果:点击登录弹出登录框,点击注册,弹出注册框
四、md5加密算法
md5加密算法:大多数情况下,用户的密码是存储在数据库中的,如果不采取任何的保密措施,以明文的方式保存密码,查找数据库的人员就可以轻松获取用户的信息,所以为了增加安全性,对数据进行加密是必要的。md5,是一种用于产生数字签名的单项散列算法,它以512位分组来处理输入的信息,且每一分组又被划分为16位子分组,经过一系列处理,算法的输入由4个32位分组级联后生成一个128位散列值。
没有加密之前的明文通过解析的效果:
注册信息:
建议:从源头解决这种问题,运用正则表达式从源头入手,尽量设置一些含有特殊字符的密码。
虽然md5加密是单项加密,但其结构还是可以破解的。所以,通常情况下,我们后做[两次md5加密,再做加盐处理]。
用了sql注入处理+md5两次加密以及加盐处理之后的效果:
数据库显示的该条数据:
五、sql注入
sql注入是指攻击者利用数据库数据的漏洞进行攻击,特别是在登录时,用户常利用sql语句中的特定字符创建一个恒等条件,从而不需要任何用户名和密码就可以访问网站数据。
具体:http://www.cnblogs.com/wangwangwangmax/p/5551614.html
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
作者:wangwangwangmax
上一篇: for循环输出“100-999的水仙花”数和“输出九九乘法表”
下一篇: jQuery DOM操作