正则表达式防止SQL注入(C#版的)

 本来对正则表达式不是很了解,但由于项目需要,项目主要没有采用存储过程方式来存储 SQL语句,所以很有可能被黑客用SQL注入攻击,现在就在网上找了找解决办法,在业务层来过滤SQL语句,防止SQL注入攻击,主要是采用了正则表达式,因为正则表达式对字符串的操作是很强大的.

首先用一个Validate()类来封装正则表达式和相关操作:

    //验证是否有SQL注入字符
    private bool ValidateQuery(Hashtable queryConditions)
    {
    //构造SQL的注入关键字符
    #region 字符
    string[] strBadChar = {"and"
    ,"exec"
    ,"insert"
    ,"select"
    ,"delete"
    ,"update"
    ,"count"
    ,"or"
    //,"*"
    ,"%"
    ,":"
    ,"/'"
    ,"/""
    ,"chr"
    ,"mid"
    ,"master"
    ,"truncate"
    ,"char"
    ,"declare"
    ,"SiteName"
    ,"net user"
    ,"xp_cmdshell"
    ,"/add"
    ,"exec master.dbo.xp_cmdshell"
    ,"net localgroup administrators"};
    #endregion

    //构造正则表达式
    string str_Regex = ".*("
    for (int i = 0; i < strBadChar.Length - 1; i++)
    {
    str_Regex += strBadChar[i] + "|"
    }
    str_Regex += strBadChar[strBadChar.Length - 1] + ").*"
    //避免查询条件中_list情况
    foreach (string str in queryConditions.Keys)
    {
    if(str.Substring(str.Length - 5)=="_list")
    {
    //去掉单引号检验
    str_Regex = str_Regex.Replace("|'|", "|");
    }
    string tempStr = queryConditions[str].ToString();
    if (Regex.Matches(tempStr.ToString(), str_Regex).Count > 0)
    {
    //有SQL注入字符
    return true;
    }
    }
    return false;
    }

queryConditions 是一个hashtable,用于传入查询条件,hashtable中的键值(key)为:@name,相对应SQL中的参数,那Value则对应为参数的实际值了.

正则表达式的应用主要是按这样的规律来过滤字符串的:

.*(and|exec|select|update|or|'|''|).*   // str_Regex

核心函数主要是: Regex.Matches(tempStr.ToString(), str_Regex).

要是在 tempStr 字符串中含有非法字符, 则函数的Count值将大于0

好了,就这样就可以判断是否含有SQL注入攻击字符了.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值