關于SQL注入,師父給驗收項目的時候就提過。但一直也沒深入去想是怎麼回事~~在學ASP.NET,做新聞釋出系統的時候,又遇到了,這次不能放過了~~
定義
所謂SQL注入,就是通過把SQL指令插入到Web表單送出或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL指令。具體來說,它是利用現有應用程式,将(惡意)的SQL指令注入到背景資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。[1] 比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特别容易受到SQL注入式攻擊.——百度百科
實驗
系統中增加新聞類别SQL語句:
insert intocategoryinfo(name)values ('" + caName + "')
當我們在界面輸入:娛樂八卦,點選增加新聞類别時
娛樂八卦将替換" + caName + "而執行。
于是,當我們在文本框中輸入:
娛樂新聞')delete categoryinfo where id=13--
這段替換了" + caName + "會形成:
insert into categoryinfo(name)values ('娛樂新聞')delete categoryinfo where id=4--')";
相當于:
insert into categoryinfo(name)values ('娛樂新聞');
delete categoryinfo where id=4--')";
于是執行後前後對比效果為:
前: 後:
這就是SQL注入的一種效果。通過這種方法,将我們的資料庫進行了破壞。通過SQL注入,是黑客得到資料庫内部資訊的一種方法,為了咱們系統的安全性,我們需要做好防護。
如何避免:
對于上面的這種SQL注入,有效的方法就是:用傳參進行SQL語句,不用拼接字元串。
傳字元串語句:
public int test() {
int res;
using (cmd = new SqlCommand("insert into categoryinfo(name)values (@caName)",GetConn()))
{
cmd.Parameters .Add(new SqlParameter ("@caName","SQL注入成功"));
res = cmd.ExecuteNonQuery();
}
return res;
}
改為傳參:
public int test() {
int res;
using (cmd = new SqlCommand("insert into categoryinfo(name)values (@caName)",GetConn()))
{
cmd.Parameters.Add(new SqlParameter("@caName", "'娛樂新聞')delete categoryinfo where id=4--"));//SQL注入失敗
res = cmd.ExecuteNonQuery();
}
return res;
}
這隻是一種避免方法。
那平時我們需要做哪些防護呢:
1.限制使用者非正确格式輸入。
2.對特殊字元進行轉換。即“’”在SQL語句運作時,已不再是“‘”,可能是一個數字,這樣就不會再對SQL語句造成混亂。
3.報錯時,盡可能減少資訊量。最好将錯誤資訊進行包裝。因為專業人可以根據報的黃頁分析出庫裡有哪些表等資訊......
4.将重要資訊進行加密。以免輕易洩露。
5.不用拼接字元串... ......
這是我所能想到的一些特别基礎的預防方法~肯定還有更進階的手段。這還需要我們繼續探索!