加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

sql注入之关键字过滤

(2017-04-27 14:54:47)
标签:

sql注入

sql

防止注入

防止sql注入

分类: 数据库技术(SQL2000/2005)
转自:http://www.oschina.net/code/snippet_2623534_54893

#region 防止sql注入式攻击(可用于UI层控制)
 
/// 
/// 判断字符串中是否有SQL攻击代码
/// 
/// 传入用户提交数据
/// true-安全;false-有注入攻击现有;
public bool ProcessSqlStr(string inputString)
{
    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";
    try
    {
        if ((inputString != null) && (inputString != String.Empty))
        {
            string str_Regex = @"\b(" + SqlStr + @")\b";
 
            Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
            //string s = Regex.Match(inputString).Value; 
            if (true == Regex.IsMatch(inputString))
                return false;
 
        }
    }
    catch
    {
        return false;
    }
    return true;
}
 
 
/// 
/// 处理用户提交的请求,校验sql注入式攻击,在页面装置时候运行
/// System.Configuration.ConfigurationSettings.AppSettings["ErrorPage"].ToString(); 为用户自定义错误页面提示地址,
/// 在Web.Config文件时里面添加一个 ErrorPage 即可
/// 
///     
/// 
public void ProcessRequest()
{
    try
    {
        string getkeys = "";
        string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["ErrorPage"].ToString();
        if (System.Web.HttpContext.Current.Request.QueryString != null)
        {
 
            for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
            {
                getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
                if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
                {
                    System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=" + getkeys + "有SQL攻击嫌疑!");
                    System.Web.HttpContext.Current.Response.End();
                }
            }
        }
        if (System.Web.HttpContext.Current.Request.Form != null)
        {
            for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
            {
                getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
                if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
                {
                    System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "?errmsg=" + getkeys + "有SQL攻击嫌疑!");
                    System.Web.HttpContext.Current.Response.End();
                }
            }
        }
    }
    catch
    {
        // 错误处理: 处理用户提交信息!
    }
}
#endregion
 
 
 
 
#region 转换sql代码(也防止sql注入式攻击,可以用于业务逻辑层,但要求UI层输入数据时候进行解码)
/// 
/// 提取字符固定长度
/// 
/// 
/// 
/// 
public string CheckStringLength(string inputString, Int32 maxLength)
{
    if ((inputString != null) && (inputString != String.Empty))
    {
        inputString = inputString.Trim();
 
        if (inputString.Length > maxLength)
            inputString = inputString.Substring(0, maxLength);
    }
    return inputString;
}
 
/// 
/// 将输入字符串中的sql敏感字,替换成"[敏感字]",要求输出时,替换回来
/// 
/// 
/// 
public string MyEncodeInputString(string inputString)
{
    //要替换的敏感字
    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";
    try
    {
        if ((inputString != null) && (inputString != String.Empty))
        {
            string str_Regex = @"\b(" + SqlStr + @")\b";
 
            Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
            //string s = Regex.Match(inputString).Value; 
            MatchCollection matches = Regex.Matches(inputString);
            for (int i = 0; i < matches.Count; i++)
                inputString = inputString.Replace(matches[i].Value, "[" + matches[i].Value + "]");
 
        }
    }
    catch
    {
        return "";
    }
    return inputString;
 
}
 
/// 
/// 将已经替换成的"[敏感字]",转换回来为"敏感字"
/// 
/// 
/// 
public string MyDecodeOutputString(string outputstring)
{
    //要替换的敏感字
    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";
    try
    {
        if ((outputstring != null) && (outputstring != String.Empty))
        {
            string str_Regex = @"\[\b(" + SqlStr + @")\b\]";
            Regex Regex = new Regex(str_Regex, RegexOptions.IgnoreCase);
            MatchCollection matches = Regex.Matches(outputstring);
            for (int i = 0; i < matches.Count; i++)
                outputstring = outputstring.Replace(matches[i].Value, matches[i].Value.Substring(1, matches[i].Value.Length - 2));
 
        }
    }
    catch
    {
        return "";
    }
    return outputstring;
}
#endregion

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有