iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0

大家好,今天跟大家一起學習什麼是SQL injection。

維基百科解釋如下:
SQL資料隱碼攻擊(英語:SQL injection),簡稱SQL攻擊或隱碼攻擊,是發生於應用程式與資料庫層的安全漏洞。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了字元檢查,那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵。

範例程式碼,取自黑暗執行序的講義-
https://blog.darkthread.net/Files/ASP.NET%20Security.pdf

一、 有 SQL injection 風險的設計方式 (帳密欄位 未使用參數化的方式)

 protected void Button1_Click(object sender, EventArgs e)
 {
 using (SqlConnection cn = new SqlConnection("Data Source=(local);User Id=sa;
Password=mypassword; Initial Catalog=Lab;"))
 {
 cn.Open();
 string sqlText = "SELECT UserName FROM tblAccount WHERE Account='" + txtUID.Text + "' AND
Password='" + txtPWD.Text + "'";
 SqlCommand cmd = new SqlCommand(sqlText, cn);
 SqlDataReader dr = cmd.ExecuteReader();
 if (dr.Read())
 Response.Write("歡迎登入! " + dr["UserName"].ToString());
 else
 Response.Write("帳號或密碼錯誤!");
 dr.Close();
 cn.Close();
 }
 }
 

二、 使用參數化的方式(@account、@password)

   protected void Button1_Click(object sender, EventArgs e)
     {
     using (SqlConnection cn = new SqlConnection("Data Source=(local);User Id=sa;
    Password=mypassword; Initial Catalog=Lab;"))
     {
    cn.Open();
     string sqlText = "SELECT UserName FROM tblAccount WHERE Account=@account AND
    Password=@password";
     SqlCommand cmd = new SqlCommand(sqlText, cn);
     cmd.Parameters.Add("@account", SqlDbType.NVarChar).Value = txtUID.Text;
     cmd.Parameters.Add("@password", SqlDbType.NVarChar).Value = txtPWD.Text;
     SqlDataReader dr = cmd.ExecuteReader();

     if (dr.Read())
     Response.Write("歡迎登入! " + dr["UserName"].ToString());
     else
     Response.Write("帳號或密碼錯誤!");
     dr.Close();
     cn.Close();
     }
     }
 

為了避免C#語法開發的網站遇到SQL injection,必須使用參數化的方式 查詢欄位,或是使用Language Integrated Query (LINQ) 去查詢,避免被駭客入侵。

參考網址:
SQL資料隱碼攻擊


上一篇
【Day 20】帳號攻防淺談
下一篇
【Day 22】在Visual Studio 2017 寫一個圖形驗證碼
系列文
What a good thing we lose? What a bad thing we knew?30

尚未有邦友留言

立即登入留言