正则表达式防止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
    评论
C# 中,可以采取以下措施来防止 SQL 注入攻击: 1. 使用参数化查询:使用参数化查询可以将用户提供的输入值作为参数绑定到查询语句中,而不是直接将输入值嵌入到 SQL 查询字符串中。这样可以防止恶意输入被解释为 SQL 代码。例如,在使用 SqlCommand 执行查询时,可以使用 SqlParameter 对象来设置查询参数。 以下是使用参数化查询的示例代码: ```csharp string sqlQuery = "SELECT * FROM Users WHERE Username = @username AND Password = @password"; using (SqlCommand command = new SqlCommand(sqlQuery, connection)) { command.Parameters.AddWithValue("@username", username); command.Parameters.AddWithValue("@password", password); // 执行查询... } ``` 2. 输入验证和过滤:在接受用户输入之前,进行输入验证和过滤是一种重要的安全措施。可以使用正则表达式、白名单过滤或其他校验机制来验证用户输入。确保只接受预期的输入,并拒绝或处理任何异常或恶意的输入。 3. 限制数据库权限:为了最小化攻击面,应该为数据库连接使用具有最低权限的账户。确保数据库账户只有执行必要操作的权限,并限制对敏感数据的访问。 4. 避免拼接 SQL 字符串:尽量避免直接拼接用户输入的值到 SQL 查询字符串中。如果需要动态构建查询语句,可以使用 StringBuilder 或类似的工具来安全地构建查询字符串。 5. 使用存储过程:存储过程是预编译的 SQL 代码,可以防止 SQL 注入攻击。通过使用存储过程,可以将用户输入的值作为参数传递给存储过程,而不是直接嵌入到 SQL 查询中。 综上所述,采取这些措施可以帮助您有效地防止 SQL 注入攻击。但是请记住,安全是一个持续的过程,需要综合考虑多种安全性措施来保护应用程序和数据。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值