使用ADO.NET的参数集合来有效防止SQL注入漏洞
生活随笔
收集整理的這篇文章主要介紹了
使用ADO.NET的参数集合来有效防止SQL注入漏洞
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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的命令對象中,是可以使用參數集合的,如:(例如 )該集合中包含一組類型為 、、 或 的對象。對于需要傳遞的每個參數,集合中均有一個對應的參數對象。 參數的數據類型特定于 .NET Framework 數據提供程序。 如果指定類型,則會在將 Parameter 的值傳遞給數據源之前,將該值轉換為 .NET Framework 數據提供程序類型。 您還可以通用形式指定 Parameter 的類型,方法是將 Parameter 對象的 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 的使用方式有很多,我們這里只是舉了個簡單的例子讓大家加以應用。
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的命令對象中,是可以使用參數集合的,如:(例如 )該集合中包含一組類型為 、、 或 的對象。對于需要傳遞的每個參數,集合中均有一個對應的參數對象。 參數的數據類型特定于 .NET Framework 數據提供程序。 如果指定類型,則會在將 Parameter 的值傳遞給數據源之前,將該值轉換為 .NET Framework 數據提供程序類型。 您還可以通用形式指定 Parameter 的類型,方法是將 Parameter 對象的 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 的使用方式有很多,我們這里只是舉了個簡單的例子讓大家加以應用。
轉載于:https://blog.51cto.com/jianle/131754
總結
以上是生活随笔為你收集整理的使用ADO.NET的参数集合来有效防止SQL注入漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 128位加密SSL证书
- 下一篇: asp.net 动态添加JavaScri