Welcome

首页 / 软件开发 / .NET编程技术 / .Net编程技巧:使用ADO.NET的参数集合来有效防止SQL注入漏洞

.Net编程技巧:使用ADO.NET的参数集合来有效防止SQL注入漏洞2013-08-11SQL注入漏洞是个老话题了,在以前做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 的使用方式有很多,我们这里只是举了个简单的例子让大家加以应用。