亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET中的SQL注入攻擊與防護

2019-11-17 01:26:59
字體:
來源:轉載
供稿:網友

asp.net中的SQL注入攻擊與防護

什么是SQL注入攻擊?

它是在執行SQL查詢的時候,由于接收了用戶的非法參數從而導致,所執行的SQL語義與業務邏輯原本所要查詢的語義不相符,從而實現的攻擊。

例如我們經常使用的用戶登錄,通常會出現這樣的表單:

用戶名:________________

密碼:________________

登錄

正常情況下,我們需要讓用戶填寫他們自己的用戶名和密碼之后,程序會接收用戶輸入的參數 執行查詢操作,然后根據查詢結果,判斷用戶是否能夠登錄。

但是,如果程序員在編寫SQL查詢操作時候,沒有注意SQL注入問題的話,那么用戶可以通過這個表單很輕易的實現一些非正常的訪問,下面我們據具體的例子來說明。

我們先來布局一個簡單的表單:

其中這個表單中包含了用戶名 密碼的輸入文本框,為了大家便于觀看,密碼我沒有使用passWord,明文顯示。其中防止注入的復選框是為了我寫第二段 防止注入的登錄邏輯時,可以用一個按鈕來表示,而用了單選框是否被選中來進行區別。

我們先來看第一段登錄代碼:

 1     //聲明連接 2     PRivate static OleDbConnection ConnAcc; 3     protected void Page_Load(object sender, EventArgs e) 4     { 5  6     } 7  8     /// <summary> 9     /// 按鈕點擊事件10     /// </summary>11     /// <param name="sender"></param>12     /// <param name="e"></param>13     protected void Button1_Click(object sender, EventArgs e)14     {15         string name = tbx_name.Text;16         string pwd = tbx_pwd.Text;17 18         UserLogin(name, pwd);19     }20 21 22 23     /// <summary>24     /// 第一種登錄驗證操作25     /// </summary>26     /// <param name="_loginname"></param>27     /// <param name="_loginpwd"></param>28     private void UserLogin(string _loginname,string _loginpwd)29     {30         DataSet ds = new DataSet(); //聲明數據集31         string sql = "select * from Users Where rg_LoginName='" + _loginname + "' and rg_LoginPwd='" + _loginpwd + "'"; //創建查詢語句32         try33         {34 35             Open(); //打開連接36             OleDbCommand comm = new OleDbCommand(sql, ConnAcc); //創建查詢37             new OleDbDataAdapter(comm).Fill(ds, 0, 1, "Users"); //填充數據集38         }39         catch (OleDbException exception)40         {41             ds = null;42             Label1.Text = exception.Message; //異常處理43             return;44         }45         finally46         {47             Free();48         }49         if (ds != null && ds.Tables[0].Rows.Count > 0) //如果數據集中有記錄 代表輸入的用戶名密碼組合正確50         {51             Label1.Text = "用戶[" + tbx_name.Text + "]登錄成功!"; //顯示52 53             //int uid = int.Parse(ds.Tables[0].Rows[0]["rg_ID"].ToString());54             //保存UID等用戶信息到session或者cookies中55             //由于本案例重點是登錄身份驗證通過環節,因此此處邏輯可以不繼續寫56         }57         else58         {59             Label1.Text = "用戶名或密碼錯誤";60         }61     }62 63 64 65 66     /// <summary>67     /// 打開數據庫連接68     /// </summary>69     private static void Open()70     {71         ConnAcc = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Server.MapPath("~/App_Data/db.mdb") + ";");72         if (ConnAcc.State == ConnectionState.Closed)73         {74             ConnAcc.Open();75         }76     }77 78 79     /// <summary>80     /// 關閉連接81     /// </summary>82     private static void Free()83     {84         if (ConnAcc != null)85         {86             ConnAcc.Close();87             ConnAcc.Dispose();88             ConnAcc = null;89         }90     }

我在數據庫中添加了一條記錄 用戶名為admin,密碼為123456

然后我們來看一下登錄的實際效果:

OK!登錄成功!看起來一切都很圓滿,但是事實上是這樣嗎?聰明的你一定會想到,如果就此結束了,那本文就毫無意義了,而且這種登錄我剛上學的時候就會了。

沒錯,這只是看上去功能實現了而已,但事實上,這種登錄的判斷邏輯存在著很大的SQL注入風險,下面我就以此段代碼為例,演示一個簡單的SQL注入的經典例子。

剛才我們登錄的時候是輸入的用戶名密碼,密碼如果與用戶名不匹配就無法登錄成功,那么當我不知道密碼的情況下,試試下面的這個組合:

看到這里你貌似瞬間懂了,然后驚出一身冷汗,然后背后隱隱發涼,為什么不輸入密碼也能登錄成功?那么我在程度代碼這段加上一個斷點調試一下相比你就明白了。

在填充數據集之前,加入斷點,讓程序運行時暫停在這個位置。

由于我輸入的用戶名為:admin,密碼并沒有輸入正確的123456,而是輸入的 ' or '1'='1 這意味這什么呢?請看下面的變量跟蹤信息:

這是SQL語句變成了select * from Users Where rg_LoginName='admin' and rg_LoginPwd='' or '1'='1'

我們查詢原本的意思是:select * from Users Where rg_LoginName=用戶名 and rg_LoginPwd=密碼

而現在的意思就變成了 select * from Users Where rg_LoginName='admin' and rg_LoginPwd=空 or '1'='1'

簡單的說就是相當于用戶通過輸入的密碼中帶有SQL語義的值,變相修改了我們的查詢語句,在本例中,無論用戶是否知道密碼,他只要在密碼中輸入' or '1'='1',就一定能夠登錄成功,因為有了 or '1'='1'的恒成立,所以前面的判斷語句統統失效。這就是非常典型的SQL注入攻擊,通過此種方法,可以進入后臺,篡改數據等操作。

除此以外,包括頁面間傳參,搜索的時候都有可能被多種形式的注入,這是一個相當危險的安全隱患,使你得所有用戶身份驗證形同虛設。

那么如何避免SQL語句的注入呢?

一個最簡單快捷的方法就是過濾單引號,我們來修改登錄的代碼

 1     /// <summary> 2     /// 第一種登錄驗證操作 3     /// </summary> 4     /// <param name="_loginname"></param> 5     /// <param name="_loginpwd"></param> 6     private void UserLogin(string _loginname,string _loginpwd) 7     { 8         _loginname = _loginname.Replace("'", ""); //過濾用戶輸入參數中的單引號 9         _loginpwd = _loginpwd.Replace("'", ""); //過濾用戶輸入參數中的單引號10 11         DataSet ds = new DataSet(); //聲明數據集12         string sql = "select * from Users Where rg_LoginName='" + _loginname + "' and rg_LoginPwd='" + _loginpwd + "'"; //創建查詢語句13         try14         {15 16             Open(); //打開連接17             OleDbCommand comm = new OleDbCommand(sql, ConnAcc); //創建查詢18             new OleDbDataAdapter(comm).Fill(ds, 0, 1, "Users"); //填充數據集19         }20         catch (OleDbException exception)21         {22             ds = null;23             Label1.Text = exception.Message; //異常處理24             return;25         }26         finally27         {28             Free();29         }30         if (ds != null && ds.Tables[0].Rows.Count > 0) //如果數據集中有記錄 代表輸入的用戶名密碼組合正確31         {32             Label1.Text = "用戶[" + tbx_name.Text + "]登錄成功!"; //顯示33 34             //int uid = int.Parse(ds.Tables[0].Rows[0]["rg_ID"].ToString());35             //保存UID等用戶信息到Session或者cookies中36             //由于本案例重點是登錄身份驗證通過環節,因此此處邏輯可以不繼續寫37         }38         else39         {40             Label1.Text = "用戶名或密碼錯誤";41         }42     }

通過把用戶輸入的單引號進行過濾,那么他在輸入中所帶的SQL語義的值 就不成立了,

我們繼續使用剛才的組合:admin,' or '1'='1 來斷點查看下變量:

這個時候我們可以發現,rg_LoginPwd=' or 1=1' 在把用戶輸入的單引號過濾掉之后 用戶輸入的密碼就是 or 1=1(被單引號括起來,被當作字符串處理)不具有任何的SQL語義了,當然這個密碼是不正確的,因此就不會出現SQL注入的問題了

然而利用過濾單引號的方式,只能在一定程度上避免SQL注入的攻擊,卻并不能100%的保證安全,最安全的做法就是使用微軟提供的參數數組的形式進行提交命令。下面我們再來寫一個登錄的方法。

 1 /// <summary> 2     /// 第二種登錄驗證操作(參數數組形式) 3     /// </summary> 4     /// <param name="_loginname"></param> 5     /// <param name="_loginpwd"></param> 6     private void UserLoginSafeMode(string _loginname, string _loginpwd) 7     { 8         DataSet ds = new DataSet(); 9         string sql = "select * from Users Where rg_LoginName=@rg_LoginName and rg_LoginPwd=@rg_LoginPwd"; //創建查詢語句10 11         //創建參數數組12         OleDbParameter[] parameters ={13             new OleDbParameter("@rg_LoginName",OleDbType.VarChar),14             new OleDbParameter("@rg_LoginPwd",OleDbType.VarChar)15         };16 17         //參數數組賦值18         parameters[0].Value = _loginname;19         parameters[1].Value = _loginpwd;20 21         try22         {23             Open();24             OleDbCommand comm = new OleDbCommand(sql, ConnAcc);25             if (parameters != null)26             {27                 //向comm中插入參數28                 foreach (OleDbParameter p in parameters)29                 {30                     comm.Parameters.Add(p);31                 }32             }33             new OleDbDataAdapter(comm).Fill(ds, 0, 1, "Users");34         }35         catch (OleDbException exception)36         {37             ds = null;38             Label1.Text = exception.Message; //異常處理39             return;40         }41         finally42         {43             Free();44         }45         if (ds != null && ds.Tables[0].Rows.Count > 0) //如果數據集中有記錄 代表輸入的用戶名密碼組合正確46         {47             Label1.Text = "用戶[" + tbx_name.Text + "]登錄成功!"; //顯示48 49             //int uid = int.Parse(ds.Tables[0].Rows[0]["rg_ID"].ToString());50
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人激情视频| 国产精品专区第二| 日本韩国欧美精品大片卡二| 91在线观看免费高清完整版在线观看| 久久av中文字幕| 国产精品视频免费在线观看| 欧美一区二区.| 成人欧美一区二区三区在线湿哒哒| 国产综合福利在线| 亚洲精品午夜精品| 97精品一区二区三区| 精品久久久久久国产91| 富二代精品短视频| 韩国视频理论视频久久| 欧美精品久久久久| 欧美激情xxxx性bbbb| 欧美成人免费全部观看天天性色| 国产精品久久久久久av福利| 亚洲国产成人精品久久久国产成人一区| 欧美在线视频免费播放| 欧美成人午夜激情| 日韩av中文在线| 国产精品视频大全| 久久久久久久久久久91| 亚洲精品国产精品自产a区红杏吧| 日韩欧美有码在线| 国产精品日韩专区| 日韩av影片在线观看| 在线日韩中文字幕| 91九色单男在线观看| 日韩成人性视频| 久久久免费精品视频| 日韩一级黄色av| 国产精品美乳一区二区免费| 成人精品在线视频| 亚洲xxxx做受欧美| 69久久夜色精品国产69乱青草| 日韩精品极品在线观看| 国产suv精品一区二区三区88区| 91香蕉嫩草神马影院在线观看| 国产精品久久一区| 91超碰中文字幕久久精品| 久久综合网hezyo| 日韩av电影手机在线观看| 91国产视频在线| 亚洲黄色在线看| 国产女人精品视频| 日韩精品视频在线免费观看| 69久久夜色精品国产7777| 91精品国产高清久久久久久91| 色婷婷综合久久久久中文字幕1| 亚洲伊人第一页| 精品亚洲aⅴ在线观看| 久久精品中文字幕电影| 欧美激情精品久久久久久免费印度| 亚洲女人被黑人巨大进入| 欧美丰满少妇xxxxx做受| www.日韩欧美| 亚洲一级黄色片| 成人中文字幕在线观看| 久久99国产综合精品女同| 色综合久久88色综合天天看泰| www.欧美精品| 欧美精品在线网站| 九九九久久国产免费| 亚洲天堂2020| 久久精品视频在线播放| 日韩一区二区福利| 亚洲国产精品成人va在线观看| 久久五月天色综合| 久久精品亚洲94久久精品| 国产精品视频yy9099| 亚洲午夜性刺激影院| 成人精品久久久| 国产在线精品成人一区二区三区| 伊人亚洲福利一区二区三区| 欧美日本亚洲视频| 中文字幕日韩高清| 亚洲成人性视频| 午夜精品久久久久久久男人的天堂| 97视频在线播放| 欧美激情中文字幕在线| 久久精品国产亚洲一区二区| 2019亚洲男人天堂| 5566日本婷婷色中文字幕97| 日韩精品极品视频| 精品一区二区三区四区在线| 欧美另类极品videosbest最新版本| 最近2019中文免费高清视频观看www99| 成人亚洲综合色就1024| 日韩电影免费观看在线观看| 欧美性猛交xxxxx水多| 这里只有精品在线播放| 午夜精品蜜臀一区二区三区免费| 国产成人精品优优av| 国产成一区二区| 成人免费网站在线看| 精品夜色国产国偷在线| 欧美精品久久久久久久久久| 日韩视频在线一区| 日韩在线免费高清视频| 亚洲欧美综合图区| 日韩av123| 日本中文字幕不卡免费| 欧美成人精品在线视频| 国产精品对白刺激| 另类视频在线观看| 国产精品影院在线观看| 欧美成人高清视频| 狠狠躁天天躁日日躁欧美| 国产在线精品一区免费香蕉| 亚洲精品成人av| 国产精品久久久久久久久久尿| 欧美黑人狂野猛交老妇| 国产91精品视频在线观看| 九九热精品视频在线播放| 久久久黄色av| 成人自拍性视频| 国产成人精品视频| 亚洲精品福利在线| 成人欧美一区二区三区在线湿哒哒| 色吧影院999| 成人免费黄色网| 日韩免费在线电影| 国产精品天天狠天天看| 国产香蕉97碰碰久久人人| 大胆欧美人体视频| 日韩av在线影视| 亚洲国产精品va| 久久久国产精品亚洲一区| 疯狂欧美牲乱大交777| 精品国产自在精品国产浪潮| 亚洲精品中文字幕av| 欧美大全免费观看电视剧大泉洋| 性金发美女69hd大尺寸| 91国产一区在线| 欧美视频一区二区三区…| 久久躁日日躁aaaaxxxx| 欧美午夜久久久| 欧美精品手机在线| 精品久久久久久久久久久| 久久99精品久久久久久青青91| 欧美日韩美女视频| 91久久久亚洲精品| www.久久撸.com| 欧美激情视频网站| 91精品国产沙发| 中文字幕亚洲一区二区三区| 国产亚洲欧洲高清一区| 久久精品电影网| 韩国一区二区电影| 亚洲网站在线播放| 伊人久久久久久久久久久| 亚洲情综合五月天| 91精品国产乱码久久久久久久久| 久久九九热免费视频| 久久精品国产v日韩v亚洲| 日韩中文字在线| 国产精品久久久久一区二区| 国产91精品黑色丝袜高跟鞋| 久久躁日日躁aaaaxxxx| 免费99精品国产自在在线| 精品一区二区三区电影| 国产成人精品视|