1.什么是SQL注入
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令.
2.如何防止SQL注入
防止SQL注入的方法有兩種:
a.把所有的SQL語句都存放在存儲過程中,這樣不但可以避免SQL注入,還能提高一些性能,並且存儲過程可以由專門的數據庫管理員(DBA)編寫和集中管理,不過這種做法有時候針對相同的幾個表有不同條件的查詢,SQL語句可能不同,這樣就會編寫大量的存儲過程。
b.使用參數化SQL查詢語句。
3.為什么參數化SQL查詢可以防止SQL注入
在使用參數化查詢的情況下,數據庫服務器不會將參數的內容視為SQL指令的一部份來處理,而是在數據庫完成 SQL 指令的編譯后,才套用參數運行,因此就算參數中含有惡意的指令,由於已經編譯完成,就不會被數據庫所運行。 有部份的開發人員可能會認為使用參數化查詢,會讓程序更不好維護,或者在實現部份功能上會非常不便,然而,使用參數化查詢造成的額外開發成本,通常都遠低於因為SQL注入攻擊漏洞被發現而遭受攻擊,所造成的重大損失。
4.如何寫參數化的SQL查詢語句(C#語句 SqlServer數據庫)
在撰寫 SQL 指令時,利用參數來代表需要填入的數值
Microsoft SQL Server 的參數格式是以 "@" 字符加上參數名稱而成,如下:
SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
Microsoft SQL Server 的參數格式是以 "@" 字符加上參數名稱而成,如下:
SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
例子1:
普通的Sql語句:
string idParam="001";
string querySql = "select count from [test] where id='"+idParam+"'";
SqlCommand com = new SqlCommand(querySql, conn);
參數化的Sql語句:
string querySql = "select count from [test] where id=@id";
SqlCommand com = new SqlCommand(querySql, conn);
com.Parameters.AddWithValue("@id", idParam);
SqlCommand com = new SqlCommand(querySql, conn);
com.Parameters.AddWithValue("@id", idParam);
例子2:
普通的Sql語句:
string updateSql= "insert into [test] (id,count,datetime) values ('" + idParam + "','" + countParam+ "','" + System.DateTime.Now.ToString() + "')";
SqlCommand com = new SqlCommand(updateSql, conn);
參數化的Sql語句:
updateSql = "insert into [test] (id,count,datetime) values (@id,@count,@datetime)";
updateComm = new SqlCommand(updateSql, conn);
updateComm.Parameters.AddWithValue("@id", idParam );
updateComm.Parameters.AddWithValue("@count", countParam);
updateComm.Parameters.AddWithValue("@datetime", System.DateTime.Now.ToString());
updateComm = new SqlCommand(updateSql, conn);
updateComm.Parameters.AddWithValue("@id", idParam );
updateComm.Parameters.AddWithValue("@count", countParam);
updateComm.Parameters.AddWithValue("@datetime", System.DateTime.Now.ToString());