sql注入有几中方式啊 除了在地址栏直接输入sql还有哪些呢  一般情况下sql注入是以为get为主还是以post为主?sql注入怎么防止注入大量的js?  一下代码防止sql注入有哪些不足?
 HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            HttpRequest Request = context.Request;
            //context.Response.Write("<h1><font color=red>Test: Beginning of Request</font></h1><hr>");
            // 过滤字符串 
            char charzero='\0';
            string zero = charzero.ToString();
            string strFilter = @"[\S|\s]*[\s|;| |" + zero + @"][and|update|select|exec|insert|delete|declare|truncate]+[\s|;| |" + zero + @"][\S|\s]*";
            strFilter += @",[\S|\s]'[\s\s|;| |" + zero + @"][or|and]+[\s|;| |" + zero + @"][\S|\s]*";
            string alttxt="and|update|select|exec|insert|delete|declare|truncate";
            // 分割后的过滤字符串数组 
            string[] strf;
            strf = strFilter.Split(',');
            String Str=Request.AppRelativeCurrentExecutionFilePath;
            if (Str.Trim() != "" && !Str.Trim().Contains("/Admin/") && !Str.Trim().Contains("/admin/"))
            {
                if (Request.RequestType == "GET")
                {
                    #region 过滤GET方式参数
                    foreach (string strTemp1 in Request.QueryString)
                    {
                        if (IsUploadRequest(Request)) break;
                        foreach (string strTemp2 in strf)
                        {
                            Regex r = new Regex(strTemp2);
                            if (r.IsMatch(Request.QueryString[strTemp1].ToLower()))
                            {
                                context.Response.Write("<hr><h1><font color=red>URL地址错误,请从正确地址进入.</font></h1>");
                                context.Response.End();
                            }
                        }
                    }
                    #endregion
                }                else if (Request.RequestType == "POST")
                {
                    #region 过滤POST方式参数
                    foreach (string strTemp1 in Request.Form)
                    {
                        if (IsUploadRequest(Request)) break;
                        foreach (string strTemp2 in strf)
                        {
                            Regex r = new Regex(strTemp2);
                            if (strTemp1.ToLower() == "__viewstate") continue;
                            if (r.IsMatch(Request.Form[strTemp1].ToLower()))
                            {
                                context.Response.Write("<hr><h1><font color=red>表单中包含非法字符</font></h1><Br>请" + alttxt.Replace("|", ",").ToString() + " 等字符转换成全角,或用空格将字符分开<Br>如and改为a nd或者and,update改为u pdate或者update<Br>如果您的帐户密码是上述字符,请联系管理员<Br><a href='javascript:history.back();'>点此返回上一页。</a>");
                                context.Response.End();
                            }
                        }
                    }
                    #endregion
                }
            }

解决方案 »

  1.   

    在ASP.NET中防止注入攻击
    http://www.cnblogs.com/darkangle/archive/2006/03/29/361903.html
      

  2.   

    一,验证方法/// <summary>
      ///SQL注入过滤
      /// </summary>
      /// <param name="InText">要过滤的字符串</param>
      /// <returns>如果参数存在不安全字符,则返回true</returns>
      public static bool SqlFilter2(string InText)
      {
      string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join";
      if(InText==null)
        return false;
      foreach(string i in word.Split('|'))
      {
        if((InText.ToLower().IndexOf(i+" ")>-1)||(InText.ToLower().IndexOf(" "+i)>-1))
        {
        return true;
        }
      }
      return false;
      }二,Global.asax 事件  /// <summary>
      /// 当有数据时交时,触发事件
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      protected void Application_BeginRequest(Object sender, EventArgs e)
      {
      //遍历Post参数,隐藏域除外
      foreach(string i in this.Request.Form)
      {
        if(i=="__VIEWSTATE")continue;
        this.goErr(this.Request.Form.ToString());    
      }
      //遍历Get参数。
      foreach(string i in this.Request.QueryString)
      {
        this.goErr(this.Request.QueryString.ToString());    
      }
      }三,Global中的一个方法  /// <summary>
      /// 校验参数是否存在SQL字符
      /// </summary>
      /// <param name="tm"></param>
      private void goErr(string tm)
      {
      if(WLCW.Extend.CValidity.SqlFilter2(tm))
        this.Response.Redirect("/error.html");
      }
      

  3.   

    防注入:参数化sql语句或存储过程
      

  4.   

    http://topic.csdn.net/u/20090729/14/26381958-0D6E-4B90-BC90-D275E9621F93.html
      

  5.   

    用textbox.maxlength是个好方法. 
    限制长度还有就是验证码控件.防止一次性注册很多.因为如果他们不够长的话,就减少了贴入大量脚本的可能性。 
    防止用户输入过长的字符.textbox.maxlength(). 
    限制错误信息给出的提示比如捕获到异常时,只显示一些通用的信息比如"数据源错误",而不是显示"exception.message"的信息,它可能会暴露出你系统的攻击点. 
    还有就是要小心的去掉特殊字符. 
    可以将单引号替换为2个单引号. 
    还有就是使用参数化命令啊,用存储过程执行转换来防止啊 
    限制用户访问数据库的帐号的权限啊.