最近公司网站老是被黑,帮忙优化下,但是公司网站是用.net写的,一点都不懂,在网上查了个方法,说是在global.asax里面加个方法,于是去找,没找到那个文件,于是把原系统加载到编译器中重新生成了这个文件,复制上去那段代码,结果没用,代码如下
<%@ Application Language="C#" %><script runat="server">   void Application_BeginRequest(object sender, EventArgs e)
    {
        Response.Write("您提交的内容中含有非法字符,已经被拒绝.");
        //遍历Post参数,隐藏域除外 
        if (Regex.IsMatch(Request.RawUrl.ToLower(), @"/manager/")==false)
            for (int i=0; i < Request.Form.Count;i++)
            {
                if (Request.Form[i].ToString() == "__VIEWSTATE") continue;
                if (IsDanger(Request.Form[i].ToString()))
                {
                    Response.Write("您提交的内容中含有非法字符,已经被拒绝.");
                    Response.End();
                }            } 
        //过滤所有Url中的危险字符串
        if (Request.QueryString.Count > 0 && Regex.IsMatch(Request.RawUrl.ToLower(), @"\.aspx") == true && Regex.IsMatch(Request.RawUrl.ToLower(), @"fckeditor") == false)//如果防止截获fckeditor正常的Url,必须验证".aspx"
        {
            string Temp = "";
            //string Url = Request.Url.AbsoluteUri.Substring(0, Request.Url.AbsoluteUri.LastIndexOf("?"));
            string Url = Request.RawUrl.Substring(0, Request.RawUrl.LastIndexOf("?"));
            for (int i = 0; i < this.Request.QueryString.Count; i++)
            {
                try
                {
                    Temp = HandleRequestParam(this.Request.QueryString[i].ToString());
                    Url += i == 0 ? "?" : "&";
                    Url += Request.QueryString.Keys[i].ToString() + "=" + Temp;
                }
                catch { }
            }
            //if (Url.Length < Request.Url.AbsoluteUri.Length)
            //    Response.Redirect(Url);
            Context.RewritePath(Url);//可以用Response.Redirect和Context.RewritePath
        }        //全站防止页面缓存
        Response.Buffer = true;
        Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
        Response.Expires = 0;
        Response.CacheControl = "no-cache";
    }    protected string HandleRequestParam(string str)
    {
        string RetStr = "";
        char[] strC = str.ToLower().ToCharArray();
        for (int i = 0; i < strC.Length; i++)
        {
            if (Convert.ToInt32(strC[i]) >= 48 && Convert.ToInt32(strC[i]) <= 57)
                RetStr += strC[i].ToString();
            else
                break;
        }
        return RetStr;
    }    protected bool IsDanger(string InText)
    {
        string word = @"exec|insert|select|delete|update|master|truncate|char|declare|join|iframe|href|script|<|>|request";
        if (InText == null)
            return false;
        if (Regex.IsMatch(InText,word))
            return true;
        return false;
    }      
</script>
网上说要什么编译之类的,我都没有,我直接把源码放到服务器上(因为服务器就是公司单独的一台机子),iis设置下就能访问了,但是我加那段代码是要过滤请求传过来的危险字符,但是我在浏览器中输入类似如下的包含select的路径
http://localhost/Company/News.aspx?id=(select Type from news where id=2)
结果还是没反应,不是我要求的提示含有非法字符。怎么改呢?我是2天前解除.net的,可能犯了基础的错误,跪求高人帮忙!

解决方案 »

  1.   

    用下我这个global文件吧 我以前用的就是这个 还不错<%@ Application Language="C#" %><script runat="server">        void Application_BeginRequest(object sender, EventArgs e)
            {            //SQL防注入 
                string Sql_1 = "and|or|join|exec|insert+|select+|delete+|update+|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|creat+table";
                string Sql_2 = "exec+|insert|insert+|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|truncate+|char+|+char(|declare+|drop+|creat+|drop+table|creat+table";
                string[] sql_c = Sql_1.Split('|');
                string[] sql_c1 = Sql_2.Split('|');            if (Request.QueryString != null)
                {
                    foreach (string sl in sql_c)
                    {
                        if (Request.QueryString.ToString().ToLower().IndexOf(sl.Trim()) >= 0)
                        {
                            Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");// 
                            Response.Write(sl);
                            Response.Write(Request.QueryString.ToString());
                            Response.End();
                            break;
                        }
                    }
                }
                if (Request.Form.Count > 0)
                {
                    string s1 = Request.ServerVariables["SERVER_NAME"].Trim();//服务器名称 
                    if (Request.ServerVariables["HTTP_REFERER"] != null)
                    {
                        string s2 = Request.ServerVariables["HTTP_REFERER"].Trim();//http接收的名称 
                        string s3 = "";
                        if (s1.Length > (s2.Length - 7))
                        {
                            s3 = s2.Substring(7);
                        }
                        else
                        {
                            s3 = s2.Substring(7, s1.Length);
                        }
                        if (s3 != s1)
                        {
                            Response.Write("警告!你的IP已经被记录!不要使用敏感字符!");// 
                            Response.End();
                        }
                    }
                } 
                
            }
        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,则不会引发该事件。    }
           
    </script>
      

  2.   

    谢谢,但是我已经用了你的了,还是没反应额,我在浏览器输入框内输入包含select之类的字符还是没有提示额,为什么呢?
      

  3.   


    谢谢,但是我已经用了你的了,还是没反应额,我在浏览器输入框内输入包含select之类的字符还是没有提示额,为什么呢?
      

  4.   

    如果global行不通 可以用其他的办法  防注入又不是只能通过这个办法。。