大家好,今天跟大家一起學習什麼是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資料隱碼攻擊