一個簡單的後臺與資料庫交互的登錄與註冊[sql註入處理,以及MD5加密]

来源:http://www.cnblogs.com/wangwangwangMax/archive/2016/07/09/5655892.html
-Advertisement-
Play Games

一、工具: vs2013[因為我現在用的也是2013,版本隨便你自己開心] sql2008[準備過久升級] 二、用到的語言: HTML+CSS+Jquery+Ajax+sqlserver HTML[相當於一個人] css[要穿衣服] Jquery[人要做一些動作,Jquery是對js一些常用方法的封 ...


一、工具:

     vs2013[因為我現在用的也是2013,版本隨便你自己開心]

     sql2008[準備過久升級]

二、用到的語言:

    HTML+CSS+Jquery+Ajax+sqlserver

    HTML[相當於一個人]

    css[要穿衣服]

    Jquery[人要做一些動作,Jquery是對js一些常用方法的封裝]

    Ajax[建立前端頁面與資料庫的交互]

   sqlserver[資料庫]

三、過程

   html部分代碼:

 1 <body>
 2     <div id="header">
 3         <div id="header_con">
 4             <a href="javascript:;" onclick="showRegBox()">註冊</a>
 5             <a href="javascript:;" onclick="ShowLoginBox()">登錄</a>
 6         </div>
 7     </div>
 8     <div id="loginBox">
 9         <div class="login_Item">
10             <input type="text" id="TxtUserName"  placeholder="手機郵箱/用戶名" />
11         </div>
12         <div class="login_Item"><input type="password" id="TxtPwd" placeholder="請輸入密碼" /></div>
13         <div class="login_Item"><a href="javascript:;" onclick="login()">登錄</a></div>
14     </div>
15     <div id="Regbox">
16         <div class="login_Item"><input type="text" id="TxtRegUserName"  placeholder="手機郵箱/用戶名" /></div>
17         <div class="login_Item"><input type="password" id="TxtRegPwd" placeholder="請輸入密碼" /></div>
18         <div class="login_Item"><input  type="text" id="TxtRegqq" placeholder="QQ號"/></div>
19         <div class="login_Item"><input type="text" id="TxtRegEmail" placeholder="郵箱" /></div>
20         <div class="login_Item"><a href="javascript:;" onclick="Reglogin()">註冊</a></div>
21         </div>
22 </body>

 

   css代碼:

 1 * {
 2     margin:0px;
 3     padding:0px;
 4 }
 5 #header {
 6    height:40px;
 7    width:100%;
 8    background:#000000;
 9 }
10 
11 a {
12   text-decoration:none;
13 }
14 #header a {
15    float:right;
16    color:#ffffff;
17    line-height:40px;
18    margin-left:10px;
19 }
20 #header_con {
21    width:1200px;
22    margin:0px auto;
23 }
24 .login_Item {
25     margin-left:20px;
26 }
27 .login_Item input {
28    width:348px;
29    height:40px;
30    margin-top:10px;
31    border:solid 1px #04a6f9;
32 }
33 .login_Item a {
34     margin-top:20px;
35    width:350px;
36    height:40px;
37    display:block;
38    background:#04a6f9;
39    color:#ffffff;
40    line-height:40px;
41    text-align:center;
42 }
43 #loginBox {
44    display:none;/*//隱藏狀態*/
45    margin:0px auto;
46 }
47 
48 #Regbox {
49    display:none;
50 }

 

   js代碼:[用了layer插件]

 1 /// <reference path="_references.js" />
 2 /// <reference path="jquery.md5.js" />
 3 
 4 function ShowLoginBox()
 5 {
 6     layer.open({
 7         type: 1,
 8         title: "用戶登錄",
 9         //設置div大小
10         area: ["390px", "300px"],
11         content: $("#loginBox")
12     });
13 }
14 
15 function login()
16 {
17     //1.獲取到用戶名和密碼
18     var username = $.trim($("#TxtUserName").val());
19     var pwd =$.md5( $.trim($("#TxtPwd").val()));
20     //2.判斷用戶名和密碼是否為空
21     if (username == "" || pwd == "") {
22         layer.alert("用戶名或密碼不能為空!",
23             {
24                 title: "提示:",
25                 icon: 5
26             });
27     }
28     else
29     {
30         $.post("/Handler1.ashx", { "UserName": username, "Pwd": pwd,"cmd":"login" }, function (data)
31         {
32             if (data == "登錄成功") {
33                 //layer.alert("登錄成功!",
34                 layer.msg("登錄成功!",
35                     {
36                         //title: "提示:",
37                         icon: 6
38                     });
39             }
40             else
41             {
42                 layer.msg("用戶名或密碼不正確",
43                     {
44                         //title: "提示:",
45                         icon: 5
46                     });
47             }
48         });
49     }
50 }
51 
52 function showRegBox()
53 {
54     layer.open({
55         type:1,
56         title:"註冊",
57         area: ["390px", "350px;"],
58         //div的內容
59         content:$("#Regbox")
60     });
61 }
62 
63 function Reglogin()
64 {
65     //1.獲取到輸入的內容
66     var username = $.trim($("#TxtRegUserName").val());
67     var pwd =$.md5($.trim($("#TxtRegPwd").val()));
68     var qq = $.trim($("#TxtRegqq").val());
69     var email = $.trim($("#TxtRegEmail").val());
70     //並做判斷
71     if (username == "" || pwd == "") {
72         layer.msg("用戶名或密碼不能為空!");
73     }
74     else
75     {//cmd用做標示,判斷是註冊還是登錄
76         $.post("/Handler1.ashx", { "UserName": username, "Pwd": pwd,"qq":qq,"email":email,"cmd": "reg" }, function (data)
77         {
78             if (data == "註冊成功") {
79                 layer.msg("恭喜你,註冊成功!",
80                     {
81                         icon: 6
82                     });
83             }
84             else
85             {
86                 layer.msg(data,
87                     {
88                         icon:5
89                     });
90             }
91         });
92     }
93 }

 

   ajax代碼:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Data;
  6 using System.Data.SqlClient;
  7 
  8 namespace baidu20160707
  9 {
 10     /// <summary>
 11     /// Handler1 的摘要說明
 12     /// </summary>
 13     public class Handler1 : IHttpHandler
 14     {
 15         public HttpContext context;
 16         public string strResult = "";
 17         public void ProcessRequest(HttpContext context)
 18         {
 19             this.context = context;
 20             string cmd=context.Request.Form["cmd"];
 21             switch (cmd)
 22             {
 23                 case "login":
 24                     strResult = loginAjax();
 25                     break;
 26                 case "reg":
 27                     strResult = RegAjax();
 28                     break;
 29             }
 30             context.Response.Write(strResult);
 31         }
 32 
 33         //登錄
 34         public string loginAjax()
 35         {
 36             //1.接收傳過來的用戶名和密碼
 37             string username = context.Request.Form["username"];
 38             //類名調用方法,32位,再做加鹽處理
 39             string pwd =Md5Class.GetMD5( context.Request.Form["pwd"]+"傻逼玩意",32);
 40             //所在對應的id是否存在
 41             //string strsql = string.Format("select id from Users where UserName='{0}' and Pwd='{1}'", username, pwd);
 42             //sql註入處理1.@傳參的方式,, username, pwd不要,'分號也不要'
 43             string strsql = string.Format("select id from Users where UserName=@UserName and Pwd=@Pwd");
 44             //sql註入處理2.調用SqlParameter[]數組對數據進行過濾
 45             SqlParameter[] paras = new SqlParameter[] 
 46             {
 47                 new SqlParameter("@UserName",SqlDbType.NVarChar),
 48                 new SqlParameter("@Pwd",SqlDbType.NVarChar)
 49             };
 50            //sql註入處理3.指定它的值
 51             paras[0].Value = username;
 52             paras[1].Value = pwd;
 53             //sql註入處理,4.不能忘記把數組對象傳進去
 54             if (SqlHelper.Exists(strsql,paras))
 55             {
 56                 //context.Response.Write("登錄成功");
 57                 return "登錄成功";
 58             }
 59             else
 60             {
 61                 //context.Response.Write("用戶名或密碼不正確");
 62                 return "用戶名或密碼不正確";
 63             }
 64         }
 65 
 66         //註冊
 67         public string RegAjax()
 68         {
 69             //接收傳過來的用戶名和密碼
 70             string username=context.Request.Form["username"];
 71             string pwd=Md5Class.GetMD5(context.Request.Form["pwd"]+"傻逼玩意",32);
 72             string qq=context.Request.Form["qq"];
 73             string email = context.Request.Form["email"];
 74             //string strsql1 = string.Format("select id from Users where UserName='{0}' ",username,pwd);
 75             string strsql1 = string.Format("select id from Users where UserName=@UserName ");
 76             SqlParameter[] paras1 = new SqlParameter[] 
 77             {
 78                 new SqlParameter("@UserName",SqlDbType.NVarChar)
 79             };
 80             paras1[0].Value = username;
 81             if (SqlHelper.Exists(strsql1, paras1))
 82             //if (SqlHelper.Exists(strsql1))
 83             {
 84                 return "該用戶已註冊,請重新輸入";
 85             }
 86             else
 87             {
 88                 //不存在就註冊
 89                 //string strsql2 = string.Format("insert into Users (UserName,Pwd,QQ,eMail) values('{0}','{1}','{2}','{3}')", username, pwd, qq, email);
 90                 //, username, pwd, qq, email
 91                 string strsql2 = string.Format("insert into Users (UserName,Pwd,QQ,eMail) values(@UserName,@Pwd,@QQ,@eMail)");
 92                 SqlParameter[] paras2 = new SqlParameter[] 
 93                 {
 94                     new SqlParameter("@UserName",SqlDbType.NVarChar),
 95                     new SqlParameter("@Pwd",SqlDbType.NVarChar),
 96                     new SqlParameter("@QQ",SqlDbType.NVarChar),
 97                     new SqlParameter("@eMail",SqlDbType.NVarChar),
 98                 };
 99                 paras2[0].Value = username;
100                 paras2[1].Value = pwd;
101                 paras2[2].Value = qq;
102                 paras2[3].Value = email;
103                 //插入處理
104                 if (SqlHelper.ExecteNonQueryText(strsql2, paras2) > 0)
105                 {
106                     return "註冊成功";
107                 }
108                 else
109                 {
110                     return "註冊失敗";
111                 }
112             }
113         }
114         public bool IsReusable
115         {
116             get
117             {
118                 return false;
119             }
120         }
121     }
122 }

    效果:點擊登錄彈出登錄框,點擊註冊,彈出註冊框

 

四、MD5加密演算法

     MD5加密演算法:大多數情況下,用戶的密碼是存儲在資料庫中的,如果不採取任何的保密措施,以明文的方式保存密碼,查找資料庫的人員就可以輕鬆獲取用戶的信息,所以為了增加安全性,對數據進行加密是必要的。MD5,是一種用於產生數字簽名的單項散列演算法,它以512位分組來處理輸入的信息,且每一分組又被劃分為16位子分組,經過一系列處理,演算法的輸入由4個32位分組級聯後生成一個128位散列值。

    沒有加密之前的明文通過解析的效果:

      

     註冊信息:

     

  建議:從源頭解決這種問題,運用正則表達式從源頭入手,儘量設置一些含有特殊字元的密碼。

  雖然MD5加密是單項加密,但其結構還是可以破解的。所以,通常情況下,我們後做[兩次md5加密,再做加鹽處理]。

 

  用了sql註入處理+MD5兩次加密以及加鹽處理之後的效果:

    

   資料庫顯示的該條數據:

   

 

五、sql註入

   sql註入是指攻擊者利用資料庫數據的漏洞進行攻擊,特別是在登錄時,用戶常利用SQL語句中的特定字元創建一個恆等條件,從而不需要任何用戶名和密碼就可以訪問網站數據。

   具體:http://www.cnblogs.com/wangwangwangMax/p/5551614.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1,伺服器系統的安裝會出現錯誤的地方一般都是在Raid 卡驅動 略過Raid 卡配置, 具體 http://jingyan.baidu.com/article/ca41422fddfd201eae99ed30.html 2.準備好2008R2 系統光碟 以下所舉例的是由"用安裝光碟引導啟動安裝"的方 ...
  • 在ASP.NET 2.0 站點根目錄下,只要存在 App_Offline.htm 文件,那麼所有對.aspx的請求都將轉向App_Offline.htm 。而且瀏覽器的地址欄顯示的是所請求的.aspx的URL。這樣當我們的站點需要維護時,只要把App_Offline.htm 拷貝到站點根目錄下即可。 ...
  • 3. 記憶體數據 前面我們知道了,記憶體是按位元組編址,每個地址的存儲單元可以存放8bit的數據。我們也知道CPU通過記憶體地址獲取一條指令和數據,而他們存在存儲單元中。現在就有一個問題。我們的數據和指令不可能剛好是8bit,如果小於8位,沒什麼問題,頂多是浪費幾位(或許按位元組編址是為了節省記憶體空間考慮)。 ...
  • 隨著Linux程式的增多,軟體的安裝過程中經常出現許多令人頭疼的問題,比如,重覆機械的勞動,今天來分享一些解決方法.. ...
  • 我會用幾篇博客總結一下在Linux中進程之間通信的幾種方法,我會把這個開頭的摘要部分在這個系列的每篇博客中都打出來 進程之間通信的方式 管道 消息隊列 信號 信號量 共用存儲區 套接字(socket) 進程間通信(一)—管道傳送門:http://www.cnblogs.com/lenomirei/p ...
  • 題目描述 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。 規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。 輸入輸出格式 輸入描述: 第一行:三個整數 ...
  • 0. 目錄 C#6 新增特性目錄 1. 老版本的代碼 早C#3中引入的集合初始化器,可是讓我們用上面的語法來在聲明一個字典或者集合的時候立即初始化一些項進去,其實在C#3中這是個語法糖,實質編譯後的結果是調用字典或者集合的Add方法逐一添加這些項。但是有一點小小的不直觀。先看看這個版的IL吧: 本質 ...
  • 這兩個月要做一個項目,正逢ASP.Net Core 1.0版本的正式發佈。由於現代互聯網的安全要求,HTTPS加密通訊已成主流,所以就有了這個方案。 本方案啟發於一個舊版的解決方案: ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1) http://ww ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...