A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© guo329838627 中级黑马   /  2013-9-19 18:26  /  1534 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  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
复制代码
为什么发帖有时候加入代码就显示不全了啊!

评分

参与人数 1技术分 +1 收起 理由
曹伟 + 1

查看全部评分

3 个回复

倒序浏览
你这个好复杂,直接让用户输入数据的数据库语句用参数的形式不是很好吗?
回复 使用道具 举报
七里香 发表于 2013-9-19 20:13
你这个好复杂,直接让用户输入数据的数据库语句用参数的形式不是很好吗? ...

问题是你数据它有可能是文本呀!用的地方不一样而已!!呵呵~
回复 使用道具 举报
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:}

评分

参与人数 1技术分 +1 收起 理由
曹伟 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马