<<年輕,無權享受》————送給每一個看到此文的同僚們
在這無精打采的炎夏
我躺在陽臺上房東的舊沙發
回想幾個月來遇到的問題
我不禁內心開始慌張喘著粗氣
還有大把時間去打拼 沒有到只能總結過去的年紀
我可不想現在是束縛的 我了解自己應該是自由的
美好都被我親手搞砸 我明白我沒有時間貪去揮霍了
我可不想老了以后 自己是孤獨的
年少的時候 沒理由去享受
等到你老了 頭發掉落了
牽著老伴 坐在公園的長凳 靜看人閑花落;
————————————————————————————————————————————————————————————————————————
冗言不再贅述了,直接開拔進入我們今天的主題
先不講原理,首先我給大家引出一個經典案例,利用sql語句我們來實現注冊和登陸的窗體應用程序,兩個窗體應用程序做好之后,我們來運行看看到底程序存在哪些漏洞,我們先點擊“注冊”結果如圖所示:
再點擊 登陸按鈕 結果如圖所示:
我們會驚奇的發現注冊時不輸入字符,也能注冊成功;登錄時我們沒有輸入數據庫里保存的賬戶和密碼,而是輸入hello' or 1=1 -- 卻也能登陸成功??吹竭@,你們當中有人肯定會說。這有什么好奇怪的,你給他們的屬性設置為null了嗎?但是我要跟你們說得是,其實不然,我們知道這樣的結果并不是我們想要的,那如何去解決呢?有人會說這容易,去判斷就行了呀?然而事實果如你說的容易嗎?數據庫是海量存儲的,里面的數據包羅萬象,按照你的做法你要去一個個判斷,那得判斷到何年馬月啊?這就是我們看到的SQL注入的漏洞攻擊,所以在這里就要引出我們今天的話題,如何來繞過SQL注入的漏洞攻擊呢?
好了,接下來我們就要運用“參數賦值”的方法來防范SQL注入漏洞攻擊:語法:運用@+參數 (@表示在SQL語句中申明一個變量來替代),SqlParameter
具體注冊代碼如下所示:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.SqlClient;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace 登錄注冊{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } PRivate void btnReg_Click(object sender, EventArgs e) { //object num=100; //SqlParameter sp=(SqlParameter)num; string connStr = "Data Source=.;Initial Catalog=MySchoolMoreData;Integrated Security=True"; using(SqlConnection conn=new SqlConnection(connStr)) { conn.Open(); string sql = "insert into [user] values(@name,@pwd,@email,@phone)"; //SqlParameter就是我們需要運用到的關鍵字,通過它我們對參數賦值;注意他返回的是一個數組 所以我們要用數組對象來接收 //@ 可寫可不寫 SqlParameter[] ps = { new SqlParameter("name",txtName.Text.Trim()), new SqlParameter("pwd",txtPwd.Text.Trim()), new SqlParameter("email",string.IsNullOrEmpty(txtEmail.Text.Trim())?DBNull.Value:(object)txtEmail.Text.Trim()), new SqlParameter("phone",string.IsNullOrEmpty(txtPhone.Text.Trim())?DBNull.Value:(object)txtPhone.Text.Trim()) }; SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddRange(ps); int num = command.ExecuteNonQuery(); MessageBox.Show(num == 1 ? "ok" : "no ok"); } } private void btnLog_Click(object sender, EventArgs e) { FrmLogin frm = new FrmLogin(); frm.Show(); } }}
登陸事件代碼如圖:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Data.SqlClient;namespace c01作業_登錄注冊{ public partial class FrmLogin : Form { public FrmLogin() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { string connStr = "Data Source=.;Initial Catalog=MySchoolMoreData;Integrated Security=True"; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); //1.創建命令語句 .使用了參數占位。以后服務器在執行這條sql命令的時候,就需要你也傳遞了對應名稱的參數 string sql = string.Format("select COUNT(*) from [User] where UserName=@name and Pass=@pwd"); //2.創建出對應的參數,以后服務器執行命令的時候,會來找@name參數值 SqlParameter p = new SqlParameter("@name", txtName.Text.Trim()); //@可以省略,名稱也不區分大小寫,但是字符的組成要一樣 SqlParameter p2 = new SqlParameter("pwd",txtPwd.Text.Trim()); //創建命令對象 SqlCommand command = new SqlCommand(sql, conn); //3.同時需要將配套的參數對象傳遞給服務器來使用 command.Parameters.Add(p); command.Parameters.Add(p2); int num=Convert.ToInt32(command.ExecuteScalar()); //判斷 if (num > 0) { MessageBox.Show("登錄成功"); } else { MessageBox.Show("登錄失敗"); } } } }}
使用參數賦值方法后就可以防范SQL注入的漏洞攻擊了,當我們再次輸入空字符的時候就會報如下錯誤:
新聞熱點
疑難解答