在我们项目中使用sql语句来查询数据的时候,对于新手来说,不会考虑sql注入等一系列可能存在的问题,那么可能就是用最容易被攻击的方式来。这样写出来的项目很容易被注入攻击,从而使你的数据库受到威胁。
那么接下来我就记录下我用到的sql语句参数化。首先我不会直接去拼接字符串,因为这样很容易就被注入攻击,所以我自写了一个方法类,sql语句中放入参数。在查询语句里放入对应参数,这样就很大程度上避免了被注入的可能。接下来直接上代码,不懂的可以留言交流。
sql = " select * from 表名 where CarNum like @carNums or ApplyName like @carNums"; //定义参数@carNums
SqlParameter[] parameters = {
new SqlParameter("@carNums","%"+carNums+"%") //模糊查询在参数化赋值这里写入,避免sql语句内认为你的参数是字符串
};
设置参数为@carnums ,进行赋值 然后查询语句引用相应查询或增删改方法,带入语句跟参数集合
foreach (SqlParameter item in parameters)
{
if (item.Value == null)
{
item.Value = DBNull.Value;
}
} //防止出现Null 这里做一个判断
DataTable data = DBHelp.ExecuteDataTable(sql, parameters); //查询数据
/// 查询 ///
///
///
///
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
{
String connectionString = lian;
SqlConnection conn = null;
using (conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
//cmd.Parameters.Clear();
foreach (SqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
DataSet dataset = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dataset);
DataTable dt = dataset.Tables[0];
cmd.Parameters.Clear();//最后清空集合 因为重复使用会造成之前的集合未被清理,无法插入新的数据
return dt;
}
}
/// /// 增删改 ///
///
///
///
public static bool ExecuteUpdate(string sql, params SqlParameter[] parameters)
{
String connectionString = lian;
SqlConnection conn = null;
using (conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
//cmd.Parameters.Clear();
foreach (SqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
int i = cmd.ExecuteNonQuery();
cmd.Parameters.Clear(); //最后清空集合
return i>0;
}
}