为了屏蔽危险Sql语句的执行,可能需要对进行严格的转换,例如如果是整形的,严格把它转换为整数,然后在操作,这样可以避免一些潜在的危险,另外对构造的sql语句必须进行Sql注入语句的过滤,如我的框架(Winform开发框架、Web开发框架等)里面内置了对这些有害的语句和符号进行清除工作,由于是在基类进行了过滤,因此基本上子类都不用关心也可以避免了这些常规的攻击了。
/// <summary>
/// 验证是否存在注入代码(条件语句)
/// </summary>
/// <param name="inputData"></param>
public bool HasInjectionData(string inputData)
{
if (string.IsNullOrEmpty(inputData))
return false;
//里面定义恶意字符集合
//验证inputData是否包含恶意集合
if (Regex.IsMatch(inputData.ToLower(), GetRegexString()))
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 获取正则表达式
/// </summary>
/// <returns></returns>
private static string GetRegexString()
{
//构造SQL的注入关键字符
string[] strBadChar =
{
//"select\s",
//"from\s",
"insert\s",
"delete\s",
"update\s",
"drop\s",
"truncate\s",
"exec\s",
"count\(",
"declare\s",
"asc\(",
"mid\(",
"char\(",
"net user",
"xp_cmdshell",
"/add\s",
"exec master.dbo.xp_cmdshell",
"net localgroup administrators"
};
//构造正则表达式
string str_Regex = ".*(";
for (int i = 0; i < strBadChar.Length - 1; i++)
{
str_Regex += strBadChar[i] + "|";
}
str_Regex += strBadChar[strBadChar.Length - 1] + ").*";
return str_Regex;
}
  上面的语句用于判别常规的Sql攻击字符,我在数据库操作的基类里面,只需要判别即可,如下面的一个根据条件语句查找数据库记录的函数。
/// <summary>
/// 根据条件查询数据库,并返回对象集合
/// </summary>
/// <param name="condition">查询的条件</param>
/// <param name="orderBy">自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序</param>
/// <param name="paramList">参数列表</param>
/// <returns>指定对象的集合</returns>
public virtual List<T> Find(string condition, string orderBy, IDbDataParameter[] paramList)
{
if (HasInjectionData(condition))
{
LogTextHelper.Error(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
...........................
}
  以上只是防止Sql攻击的一个方面,还有是坚持使用参数化的方式进行赋值,这样很大程度上减少可能受到SQL注入攻击。
  Database db = CreateDatabase();
  DbCommand command = db.GetSqlStringCommand(sql);
  command.Parameters.AddRange(param);