黑马程序员技术交流社区

标题: 判断字符串中是否存在SQL注入式攻击 [打印本页]

作者: guo329838627    时间: 2013-9-19 18:26
标题: 判断字符串中是否存在SQL注入式攻击

  1. #region 判断字符串中是否存在SQL注入式攻击
  2.     /// 判断字符串中是否存在SQL注入式攻击!
  3.     /// true-安全;false-有注入攻击现有;
  4.     public static bool ProcessSqlStr(string inputString)
  5.     {
  6.         string SqlStr = @"and|or|exec|execute|insert|select|delete|update|alter|create|drop|count|\*|chr|char|asc|mid|substring|master|truncate|declare|xp_cmdshell|restore|backup|net +user|net +localgroup +administrators";
  7.         try
  8.         {
  9.             if ((inputString != null) && (inputString != String.Empty))
  10.             {
  11.                 string str_Regex = @"\b(" + SqlStr + @")\b";

  12.                 Regex regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
  13.                 if ( regex.IsMatch(inputString))
  14.                     return false;

  15.             }
  16.         }
  17.         catch
  18.         {
  19.             return false;
  20.         }
  21.         return true;
  22.     }
  23.     #endregion
复制代码
为什么发帖有时候加入代码就显示不全了啊!
作者: 七里香    时间: 2013-9-19 20:13
你这个好复杂,直接让用户输入数据的数据库语句用参数的形式不是很好吗?
作者: guo329838627    时间: 2013-9-19 21:23
七里香 发表于 2013-9-19 20:13
你这个好复杂,直接让用户输入数据的数据库语句用参数的形式不是很好吗? ...

问题是你数据它有可能是文本呀!用的地方不一样而已!!呵呵~

作者: 七里香    时间: 2013-9-19 21:45
guo329838627 发表于 2013-9-19 21:23
问题是你数据它有可能是文本呀!用的地方不一样而已!!呵呵~

你是说向数据库中插入一个长字符串吧?
比如:isnert into tablename values(xx,xx,'xx')
比如我们的‘xx’是一个文本,那么如果用参数写的话就是
insert into tablename values(xx,xx,@string)
也就是说你的@string,无论你输入什么进去他都会变成一个‘’括起来的字符串对原数据库语句是没有任何影响的。
比如@string的值是‘xx’)where (列名 =xx 时如果用字符串的拼接的话就会组成一个新的数据库查询语句
insert into tablename values(xx,xx,xx)where (列名=xx),如果用参数的话
就会是insert into tablename values(xx,xx,‘xx)where (列名=xx’),所以会把数据直接存入表中。而不会发生数据注入的情况。
如果你对参数传入数据还不放心的话可以写存储过程,那样更具效率,且不存在注入攻击漏洞。{:soso_e100:}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2