程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .Net編程技巧:使用ADO.NET的參數集合來有效防止SQL注入漏洞

.Net編程技巧:使用ADO.NET的參數集合來有效防止SQL注入漏洞

編輯:關於.NET

SQL注入漏洞是個老話題了,在以前做ASP做開發時,就經常需要用字符串的過慮等方式來解決這個問題,但有時候確做的不夠徹底,往往讓黑客鑽了空子。

那麼目前在我們.NET中,不管是用WINFORM開發還是用WEBFORM,連接數據庫時都可以使用ADO.NET,在ADO.NET中,可以設置和獲取命令對象的參數來有效的防止SQL注入問題。不過,在網上查看很多有關ASP.NET的防注入貼子中還有很多是使用以前的老辦法,字符串的過慮,在這裡,我們再給大家推薦使用ADO.NET中的參數集合這種方式,希望能對各位有所幫助。

首先我們來了解一下SQL注入漏洞:

SQL注入就是用戶通過客戶端請求GET或POST方式將SQL語句提交到服務端,欺騙服務器去執行惡意的SQL語句。比如:

做一個用戶的登錄的SQL語句:

string strSql = "Select * From Users Where UserName='"+name+"' and UserPwd

'"+pwd +"';

如果在登錄時輸入or 1=1這樣的內容的話,name和pwd的值就會跟著改變,那我們來看下這條SQL語句:

SELECT * from Users WHERE UserName = '' or '1'='1' AND UserPwd = '' or '1'='1'

這樣的話可以直接查出記錄,那自然就會登錄成功,這樣的程序簡直是不設防的:),當然,SQL注入漏洞還有很多方式,我們就不在這裡詳細表述,我們的主題是如何在.NET的ASP.NET或WINFROM中使用ADO.ENT來解決這個問題。

問題的解決辦法:

還是我們剛剛的Users表,現在我要寫個方法,為該表裡插入記錄,如下:

public int Insert(string name, string pwd)
{
                string strSql = "Insert into Users(UserName,UserPwd)values('"+name+"','"+pwd+"')";
                OleDbCommand cmd = new OleDbCommand(strSql,Conn);
                Conn.Open();
                int i=cmd.ExecuteNonQuery();
             Conn.Close();
             return i;
}

以上的方法中就存在SQL注入的問題,那麼如何使用ADO.NET中的三數集合呢?

接下來再看一段代碼:

public int Insert(string name, string pwd)
{
                string strSql = "Insert into Users(UserName,UserPwd)values(@name,@pwd)";
                OleDbCommand cmd = new OleDbCommand(strSql,Conn);
                cmd.Parameters.Add("@name", OleDbType.VarChar).Value = name;
                cmd.Parameters.Add("@pwd", OleDbType.VarChar).Value = pwd;
                Conn.Open();
                int i=cmd.ExecuteNonQuery();
             Conn.Close();
             return i;
}

以上的方法中使用了參數集合,這樣的話就有效的避免了SQL的注入問題,接下來我們了解一下參數集合:

在ADO.NET的命令對象中,是可以使用參數集合的,如:(例如 Parameters)該集合中包含一組類型為 SqlParameter、OleDbParameter、OdbcParameter 或 OracleParameter 的對象。對於需要傳遞的每個參數,集合中均有一個對應的參數對象。參數的數據類型特定於 .NET Framework 數據提供程序。 如果指定類型,則會在將 Parameter 的值傳遞給數據源之前,將該值轉換為 .NET Framework 數據提供程序類型。 您還可以通用形式指定 Parameter 的類型,方法是將 Parameter 對象的 DbType 屬性設置為特定 DbType。Parameter 對象的 .NET Framework 數據提供程序類型是根據 Parameter 對象的 Value 的 .NET Framework 類型或 Parameter 對象的 DbType 推斷出來的。 有的朋友可能想要知道如何在DataAdapter對象中使用參數,其實也可以用Parameter 來做為參數,做法如下:

public DataTable List(int id)
{
                string strSql="Select * From Users Where id=@id";
                OleDbCommand cmd = new OleDbCommand(strSql,Conn);
                cmd.Parameters.Add("@id", SqlDbType.int).Value = id;
                OledbDataAdapter da= new OledbDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);    
             retrun dt;
}

關於這方面的問題,和Parameter 的使用方式有很多,我們這裡只是舉了個簡單的例子讓大家加以應用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved