在“十大负面测试用例”一文中,提到:为了防止SQL注入,需要有对特殊字符进行处理的通用函数。事实上,用正则表达式就可以很容易地检测到是否包含特殊字符的。而这种方法在网上也随处可见,如:
public bool CheckParams(params object[] args)
{
//string[] Lawlesses = { "=", "'" };
//if (Lawlesses == null || Lawlesses.Length <= 0) return true;
////构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].* (正则表达式相关内容请见MSDN)
////由于要做通用且易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式即可
//string str_Regex = ".*[";
//for (int i = 0; i < Lawlesses.Length - 1; i++)
// str_Regex += Lawlesses[i] + "|";
//str_Regex += Lawlesses[Lawlesses.Length - 1] + "].*";
//-----by ziteng 检测单引号、等号------
string str_Regex = ".*[=}'].*";
foreach (object arg in args)
{
if (arg is string)//如果是字符串,直接检查
{
if (System.Text.RegularExpressions.Regex.Matches(arg.ToString(), str_Regex).Count > 0)
return false;
}
else if (arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
{
foreach (object obj in (ICollection)arg)
{
if (obj is string)
{
if (System.Text.RegularExpressions.Regex.Matches(obj.ToString(), str_Regex).Count > 0)
return false;
}
}
}
}
return true;
}
上述方法中,返回true表示未检测到正则表达式中定义的特殊字符,即合法。如果我们一时不能直接写出检测特殊字符的表达式str_Regex,则可以定义Lawlesses数组的值。
方法本身不难理解,它也不是解决问题的唯一途径---使用字符串自带的String.IndexOf方法,在开发效率上,或许会更高一点:)至于这两种方法的执行效率,我也不好说孰优孰劣,也不想去深究。毕竟,这个正则式不算复杂,数据源也不算大,对性能的影响应该可以忽略不计了。若以后真有心去了解,可以瞄瞄这本《Mastering Regular Expressions》。