国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

利用“參數賦值”防范SQL注入漏洞攻擊

2024-07-21 02:50:01
字體:
來源:轉載
供稿:網友
利用“參數賦值”防范SQL注入漏洞攻擊

<<年輕,無權享受》————送給每一個看到此文的同僚們

在這無精打采的炎夏

我躺在陽臺上房東的舊沙發

回想幾個月來遇到的問題

我不禁內心開始慌張喘著粗氣

還有大把時間去打拼 沒有到只能總結過去的年紀

我可不想現在是束縛的 我了解自己應該是自由的

美好都被我親手搞砸 我明白我沒有時間貪去揮霍了

我可不想老了以后 自己是孤獨的

年少的時候 沒理由去享受

等到你老了 頭發掉落了

牽著老伴 坐在公園的長凳 靜看人閑花落;

————————————————————————————————————————————————————————————————————————

冗言不再贅述了,直接開拔進入我們今天的主題

先不講原理,首先我給大家引出一個經典案例,利用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注入的漏洞攻擊了,當我們再次輸入空字符的時候就會報如下錯誤:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 枣强县| 页游| 威信县| 从化市| 镇远县| 和政县| 越西县| 霞浦县| 阳曲县| 太康县| 玉龙| 广丰县| 连平县| 寻乌县| 商洛市| 庄浪县| 土默特左旗| 江西省| 朝阳区| 湟中县| 甘洛县| 通河县| 遵义县| 儋州市| 类乌齐县| 高密市| 元谋县| 历史| 清水河县| 蒲江县| 拉萨市| 桐柏县| 蓬安县| 苏尼特右旗| 兴安县| 甘孜县| 陆河县| 天门市| 遂川县| 阿巴嘎旗| 和平区|