博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通用防SQL注入漏洞程序(Global.asax方式)
阅读量:7222 次
发布时间:2019-06-29

本文共 2358 字,大约阅读时间需要 7 分钟。

原理很简单:使用Global.asax中的Application_BeginRequest(object sender, EventArgs e)事件,实现表单或URL提交数据的获取,然后通过SQLInjectionHelper类完成恶意代码的检查。

本代码只是考虑到通用性和部署简易性,因为项目已经开发完毕,并已经上线,为避免大量修改,才写的这个通用程序,大家可以在这里面加入不需要检查的表单值,这样不检查某些字段也是可以实现的。

直接贴代码:

Global.ascx.cs

//在接收到一个应用程序请求时触发。对于一个请求来说,它是第一个被触发的事件,请求一般是用户输入的一个页面请求(URL)。

    void Application_BeginRequest(object sender, EventArgs e)
    {
        //Response.Write("通用注入检查");
        bool result = false;
       
        if (Request.RequestType.ToUpper() == "POST")
        {
            result = SQLInjectionHelper.ValidUrlPostData();//Post数据检查
        }
        else
        {
            result = SQLInjectionHelper.ValidUrlGetData();//Get数据检查
        }
       
        if (result)
        {
            Response.Write("您提交的数据有恶意字符!");           
            Response.Write("<script>alert('您提交的数据有恶意字符!');<//script>");
            Response.End();
        }
    }

SQLInjectionHelper.cs注入检测辅助类

 

/// <summary>

    /// 获取Post的数据
    /// </summary>
    public static bool ValidUrlPostData()
    {
        bool result = false;

        for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++)

        {
            result = ValidData(HttpContext.Current.Request.Form[i].ToString());
            if (result)
            {
                break;
            }//如果检测存在漏洞
        }
        return result;
    }

    /// <summary>

    /// 获取QueryString中的数据
    /// </summary>
    public static bool ValidUrlGetData()
    {
        bool result = false;

        for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)

        {
            result = ValidData(HttpContext.Current.Request.QueryString[i].ToString());
            if (result)
            {
                break;
            }//如果检测存在漏洞
        }
        return result;
    }

    /// <summary>

    /// 验证是否存在注入代码
    /// </summary>
    /// <param name="inputData"></param>
    public static bool ValidData(string inputData)
    {
        //里面定义恶意字符集合
        //验证inputData是否包含恶意集合
        if (Regex.IsMatch(inputData, GetRegexString()))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /// <summary>

    /// 获取正则表达式
    /// </summary>
    /// <param name="queryConditions"></param>
    /// <returns></returns>
    private static string GetRegexString()
    {
        //构造SQL的注入关键字符
    string[] strBadChar = {"and"
    ,"exec"
    ,"insert"
    ,"select"
    ,"delete"
    ,"update"
    ,"count"
    ,"from"
    ,"drop"
    ,"asc"
    ,"char"
    ,"or"
    //,"*"
    ,"%"
    ,";"
    ,":"
    ,"\'"
    ,"\""
    ,"-"
    ,"chr"
    ,"mid"
    ,"master"
    ,"truncate"
    ,"char"
    ,"declare"
    ,"SiteName"
    ,"net user"
    ,"xp_cmdshell"
    ,"/add"
    ,"exec master.dbo.xp_cmdshell"
    ,"net localgroup administrators"};

        //构造正则表达式

        string str_Regex = ".*(";
        for (int i = 0; i < strBadChar.Length - 1; i++)
        {
            str_Regex += strBadChar[i] + "|";
        }
        str_Regex += strBadChar[strBadChar.Length - 1] + ").*";

        return str_Regex;

    }

转载于:https://www.cnblogs.com/tianlangshu/archive/2012/05/04/2482707.html

你可能感兴趣的文章
Fast-Track之Microsoft SQL 注入篇
查看>>
MySQL year函数
查看>>
ASA 5500系列防火墙忘记密码之后的恢复步骤
查看>>
NLPIR文本智能分词是语义挖掘的关键
查看>>
LR对Tuxedo/Weblogic/websphere/Apache/MQ的性能监控
查看>>
关于NTFS文件夹的安全权限分配的一些总结
查看>>
Hadoop开发者入门专刊(pdf)
查看>>
从外部文件批量处理AD帐号属性
查看>>
MySQL复制和性能优化
查看>>
linux文件查找利器 非find莫属
查看>>
Unity3D插件大全
查看>>
c++中打乱数组的顺序输出
查看>>
极速理解设计模式系列:8.策略模式(Strategy Pattern)
查看>>
Hyper-V Server --SMB3.0
查看>>
IT草根的江湖之路之五:鉴于现实,屈服!
查看>>
编译报错 /usr/bin/ld: cannot find -lc 解决
查看>>
系统自带的系统工具
查看>>
Weblogic Jms简单应用
查看>>
openStack 云平台管理节点管理网口流量非常大 出现丢包严重 终端总是时常中断问题调试及当前测试较有效方案...
查看>>
浅谈专心只学一门C#的优缺点[邀月补充:一精胜于十专]
查看>>