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
string strSql = "Select * From Users Where UserName='"+name+"' and UserPwd
'"+pwd +"';
如果在登录时输入or 1=1这样的内容的话,name和pwd的值就会跟着改变,那我们来看
如果在登录时输入or 1=1这样的内容的话,name和pwd的值就会跟着改变,那我们来看
下这条SQL语句:
SELECT * from Users WHERE UserName = '' or '1'='1' AND UserPwd = '' or '1'='1'
SELECT * from Users WHERE UserName = '' or '1'='1' AND UserPwd = '' or '1'='1'
这样的话可以直接查出记录,那自然就会登录成功,这样的程序简直是不设防的:),
当然,SQL注入漏洞还有很多方式,我们就不在这里详细表述,我们的主题是如何
在.NET的ASP.NET或WINFROM中使用ADO.ENT来解决这个问题。
问题的解决办法:
还是我们刚刚的Users表,现在我要写个方法,为该表里插入记录,如下:
还是我们刚刚的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;
}
{
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;
}
{
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;
}
{
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