处理特殊字符的通用函数

2010-03-08  籽藤 

 在“十大负面测试用例”一文中,提到:为了防止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》。

366°/3665 人阅读/0 条评论 发表评论

登录 后发表评论