防止sql数据库注入js木马解决方案

以前写过一些网站,有漏洞,到了五一、十一这些节日的时候老被注入js木马,但是通过在Global.asax加入一些过滤字符就解决了,但是最近又出现了这种现象,加了Global.asax也没用了,最后通过网友的帮忙和自己在网上找的一些资料解决了一下,目前还没出问题,现在贴出来供大家分享下。

以前的Global.asax过滤:

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e)
    {
        // 在应用程序启动时运行的代码

    }
   
    void Application_End(object sender, EventArgs e)
    {
        //  在应用程序关闭时运行的代码

    }
       
    void Application_Error(object sender, EventArgs e)
    {
        // 在出现未处理的错误时运行的代码

    }

    void Session_Start(object sender, EventArgs e)
    {
        // 在新会话启动时运行的代码

    }

    void Session_End(object sender, EventArgs e)
    {
        // 在会话结束时运行的代码。
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
        // 或 SQLServer,则不会引发该事件。

    }
     void Application_BeginRequest(Object sender, EventArgs e)  
    {  
        StartProcessRequest();  

    }  

    #region SQL注入式攻击代码分析  
    ///    <summary>  
    /// 处理用户提交的请求  
    ///    </summary>  
    private void StartProcessRequest()  
    {  
        try  
        {  
            string getkeys = "";  
            string sqlErrorPage = "err.html";//转向的错误提示页面  
            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];   //post 提交
                    if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))  
                    {  
                        System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);  
                        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];   //get 提交
                    if (getkeys == "__VIEWSTATE") continue;  
                    if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))  
                    {  
                        System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);  
                        System.Web.HttpContext.Current.Response.End();  
                    }  
                }  
            }  
        }  
        catch  
        {  
            // 错误处理: 处理用户提交信息!  
        }  
    }  
    ///    <summary>  
    /// 分析用户请求是否正常  
    ///    </summary>  
    ///    <param name="Str">传入用户提交数据   </param>  
    ///    <returns>返回是否含有SQL注入式攻击代码   </returns>  
    private bool ProcessSqlStr(string Str)  
    {  
        bool ReturnValue = true;  
        try  
        {  
            if (Str.Trim() != "")  
            {  
                string SqlStr = "and¦exec¦insert¦select¦delete¦update¦count¦*¦chr¦mid¦master¦truncate¦char¦declare¦net user¦xp_cmdshell¦/add¦exec master.dbo.xp_cmdshell¦net localgroup administrators";  

                string[] anySqlStr = SqlStr.Split('¦');  
                foreach (string ss in anySqlStr)  
                {  
                    if (Str.ToLower().IndexOf(ss) >= 0)  
                    {  
                        ReturnValue = false;  
                        break;  
                    }  
                }  
            }  
        }  
        catch  
        {  
            ReturnValue = false;  
        }  
        return ReturnValue;  
    }  
    #endregion
      
</script>

这种方法对一些低手黑客就够用了,可是对高手还是有点缺。

新的解决方法:

1、新建一个名字为WebUtils.cs的类,在类中添加一个GetQueryInt的方法,用于获取Url中的int类型值。

   /// <summary>
    /// 获得指定Url参数的int类型值
    /// </summary>
    /// <param name="strName">Url参数</param>
    /// <param name="defValue">缺省值</param>
    /// <returns>Url参数的int类型值</returns>
    public static int GetQueryInt(string strName, int defValue)
    {
        return DataConverter.StrToInt(HttpContext.Current.Request.QueryString[strName], defValue);
    }

2、新建一个名字为DataConvert.cs的操作类,在类中添加一个StrToInt的方法,用于将Url中获取值转化成int类型值

        /// <summary>
        /// string型转换为int型
        /// </summary>
        /// <param name="strValue">要转换的字符串</param>
        /// <param name="defValue">缺省值</param>
        /// <returns>转换后的int类型结果</returns>
        public static int StrToInt(object strValue, int defValue)
        {
            if ((strValue == null) || (strValue.ToString() == string.Empty) || (strValue.ToString().Length > 10))
            {
                return defValue;
            }

            string val = strValue.ToString();
            string firstletter = val[0].ToString();

            if (val.Length == 10 && DataValidate.IsNumber(firstletter) && int.Parse(firstletter) > 1)
            {
                return defValue;
            }
            else if (val.Length == 10 && !DataValidate.IsNumber(firstletter))
            {
                return defValue;
            }


            int intValue = defValue;
            if (strValue != null)
            {
                bool IsInt = new Regex(@"^([-]|[0-9])[0-9]*$").IsMatch(strValue.ToString());//正则判断,过滤字符
                if (IsInt)
                {
                    intValue = Convert.ToInt32(strValue);
                }
            }

            return intValue;
        }

        /// <summary>
        /// 判断给定的字符串(strNumber)是否是数值型
        /// </summary>
        /// <param name="strNumber">要确认的字符串</param>
        /// <returns>是则返加true 不是则返回 false</returns>
        public static bool IsNumber(string strNumber)
        {
            return Regex.IsMatch(strNumber, "^[0-9]+$");
        }

3、在资讯或者产品的终极展示页面获取其编号并进行转换

int id = WebUtils.GetQueryInt("id", -1);

posted on 2010-12-06 14:14  lwt2005qq  阅读(949)  评论(1编辑  收藏  举报

导航