Sql注入.
簡介.
我們很容易從網上查找到sql注入的定義: 就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令,很容易遭到SQL注入式攻擊.
用戶可以提交一段數據庫的查代碼,根據程序返回結果,獲得一些敏感的信息或是控制整個服務器.sql注入就發生了.
當然我們要魔高一尺,道高一丈.
防止sql注入:
永遠不要信任用戶的輸入,對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和雙 - - (在數據庫中認為是數據庫語句的連接)進行轉換等.
永遠不要動態拼接sql,可以使用參數化的sql或者直接使用存儲過程來進行數據查詢存取.
永遠不要使用管理員權限的數據庫的連接,為每個應用使用單獨的權限書庫連接.
不要把機密的信息直接存放,加密.
應用的異常信息應該處僅少量的提示,最好使用自定義的錯誤信息對原始的錯誤進行封裝.
采用軟件和有效的網站平臺來檢測sql注入.
實例.(用參數化的sql進行插入來防止Sql注入)
向數據庫的新聞類別表(category)通過字符串拼接的方法插入一條語句。
插入函數的代碼.
- <span style="font-size:16px;">public bool Insert(string caName)
- {
-
- bool flag = false;
- string sql = "insert into category(name) values('" + caName + "')";
- flag = sqlhelper.ExecuteNonQuery(sql);
-
- return flag;
- }</span>
我們的界面:
我們在調試中可以看到傳入數據庫中的sql語句。

Ctrl+F5我們不調試直接執行,或是我們把此sql語句復制在查詢分析器中執行。界面中我們可以看到。
在增加一行的基礎同時我們id為3的記錄消失了,被刪除了。
讓我們對插入數據庫的插入代碼修改,用參數傳遞來代替數據庫字符串的拼接。
在SQLHelper加上個ExecuteQuery(string sql ,sqlParam[] paras)的重載.
- <span style="font-size: 14pt; "> </span><span style="font-size:16px;">
-
-
-
-
-
- public bool ExecuteNonquery(string sql, SqlParameter[] paras)
- {
- bool flag=false ;
- using (cmd = new SqlCommand(sql, GetConn()))
- {
-
- cmd.Parameters .Add (paras );
- if (cmd.ExecuteNonQuery()>0)
- {
- flag =true;
- }
- }
-
- return flag;
- }</span><span style="font-size: 14pt;">
- </span>
- <span style="font-size:16px;">
-
-
-
-
- public bool Insert(string caName)
- {
-
- bool flag = false;
- string sql = "insert into category(name) values(@caName)";
- SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@caName", caName) };
- flag = sqlhelper.ExecuteNonQuery(sql);
-
- return flag;
- }</span><span style="font-size: 14pt;">
- </span>
這次我們再進行插入,結果如下.

posted on 2012-07-09 23:13
zhanghu198901 閱讀(782)
評論(0) 編輯 收藏