这是一个"高人"说的话.就不用存储过程!   就用向SQL服务器发送SQL指令的情况下, 这样就肯定会被注入吗?
"只要你是拼SQL的,无论的玩什么花样,都会被注入."谁能推翻这句话,送出100分

解决方案 »

  1.   

    string sqlText = "select * from your_table where id=";
    string id = Request.QueryString["id"];
    if(!string.IsNullOrEmpty(id)){sqlText = sqlText += int.Parse(id);
    // do query }
      

  2.   

    支持,只有把参数每次都去转换,我一般写个函数,看是否发生异常,再加起来
    try{ConvertTo.xxxx()}catch{return false;}return true;
      

  3.   

    C# code 
    string sqlText = "select * from your_table where id="; 
    string id = Request.QueryString["id"]; 
    if(!string.IsNullOrEmpty(id)){ sqlText = sqlText += int.Parse(id).ToString(); //刚才这里写的不对,可能会编译不通过吧
    // do query } 
    我只是个人觉得这个拼出的sql就不能注入
      

  4.   

    动态字串进行特殊字符过滤,固定字串则不需要。
    如:
    "SELECT A, B, C FROM DD WHERE F='" + strFValue + "'";在拼装前对strFValue进行防注入处理,如进行过滤特殊字符。
      

  5.   

    如果对SQLSERVER及时打补丁的话,就不会有这样操作而被注入的危险,SQLSERVER对此进行了限制。
      

  6.   

    select * from ... where ... AND 1=1 ; Your Injected SQL Here (e.g. exec sp_MS...) -- 
      

  7.   


    请教一下,规则很简单:1:数字类型,判断是否为数字2:字符类型,把一个'替换成两个(必要的时候判断长度)以上这么做的目的就是不会把我拼的SQL给“曲解”了不知如何能注入?
      

  8.   

    不知道 DBParameter 以及它的子类是不是解决了这个问题。
      

  9.   


    用Parameter,是没注入的问题的
      

  10.   

    传入参数有两种:int, stringint型参数拼接:
    string sql = "select * from table1 where id=" + int.Parse(Request["id"]);string型参数拼接:
    string sql = "select * from table1 where name='" + Request["name"].Replace("'","''") + "'";========
    请问谁可以注入
      

  11.   

    把非法字符处理好了,哪可能注入啊,php里面都是拼的sql呢,倒是没听说多少被注入的啊!
      

  12.   

    ==》支持,只有把参数每次都去转换,我一般写个函数,看是否发生异常,再加起来 try{ConvertTo.xxxx()}catch{return false;}return true;敢不用try...catch做条件判断么?
    只要意识到SQL注入的问题或者你会注入,那么问题就简单了。
      

  13.   


    这里的"花样"是指过滤关键字。
    例如过滤字符串 and  
    可以并一个字符 aandnd 过滤and 后还会变成 and ,
    select * from tb where id=111111111111111111111111111111111 
    id为int型,这明显超出了int的范围,sqlserver会报错。 
    而如果sqlserver由于这种错误而引发其它方面的问题(这就是sqlserver的bug或漏洞了).......一般指定了数据类型和过虑掉单引号就ok了。缺少任何一样都是不安全的。sqlText = sqlText += int.Parse(id);
    这个是特例,我不相信整个系统都用int类型。
      

  14.   

    select * from tb where id=111111111111111111111111111111111 这样的语句最多也就是造成了一个异常
    注入不了吧
      

  15.   

    可以写个类,每次传到sql语句拼接的那里都先调用一下这个类,过滤非法字符。
      

  16.   

    字符串过滤类
    public   static   string   InputText(string   inputString,   int   maxLength)     
      {   
      StringBuilder   retVal   =   new   StringBuilder();   
        
      //   check   incoming   parameters   for   null   or   blank   string   
      if   ((inputString   !=   null)   &&   (inputString   !=   String.Empty))     
      {   
      inputString   =   inputString.Trim();   
        
      //chop   the   string   incase   the   client-side   max   length   
      //fields   are   bypassed   to   prevent   buffer   over-runs   
      if   (inputString.Length   >   maxLength)   
      inputString   =   inputString.Substring(0,   maxLength);   
        
      //convert   some   harmful   symbols   incase   the   regular   
      //expression   validators   are   changed   
      for   (int   i   =   0;   i   <   inputString.Length;   i++)     
      {   
      switch(inputString[i])   
      {   
      case   '"':   
      retVal.Append("&quot;");   
      break;   
      case   '<':   
      retVal.Append("&lt;");   
      break;   
      case   '>':   
      retVal.Append("&gt;");   
      break;   
      default:   
      retVal.Append(inputString[i]);   
      break;   
      }   
      }   
        
      //   Replace   single   quotes   with   white   space   
      retVal.Replace("'",   "   ");   
      }   
        
      return   retVal.ToString();   
      }
      

  17.   

    借用一下四楼的代码
    decimal id;//在这里,我假设id的数据类型是decimal
    decimal.TryParse(Request["id"] ?? "0", out id);//防止数字型值注入的关键。
    string name = Request["name"] ?? "";if(id == 0 || name == ""){ /* 当数据为空时的处理,这段不属于本贴主题 */ }name = name.Replace("'","''");//防止字符型值注入的关键。
    string sqlText =string.Format("select * from your_table where id={0} and name='{1}'",id,name);
    请所谓的注入高手测试过后再作评价。谢谢。
      

  18.   


                        SqlParameter[] parameters = new SqlParameter[drs.Count+1];
                        StringBuilder add1 = new StringBuilder("INSERT INTO table1(");
                        StringBuilder add2 = new StringBuilder();
                        for (int i = 0; i < drs.Count; i++)
                        {   
                                string id="field" + drs[i]["id"].ToString();
                                //......
                                if (b)
                                {
                                    parameters[i] = new SqlParameter("@" + id, value);
                                    add1.Append("[" + id + "],");
                                    add2.Append("@" + id + ",");
                                }
                                else
                                {
                                    Deny();
                                    return;
                                }
    }
                        add1.Append("[IP])VALUES(");
                        add1.Append(add2.ToString());
                        add1.Append("@IP)");
      

  19.   

    可以推翻的录入的字符串参数应把 '替换为 ''。录入的其他类型参数(如整型) 应先转换为目标类型(如整型), 再转换为字符串拼接到sql语句中。录入的sql语句(如 and、or、> 、<、=),不能直接拼到sql语句中,而应检查是否在规定的sql语句中。
    例如下拉列表框中有>,<,=三个选项,变成参数提交到服务端时应检查参数是否真的为>,<,=三者之一
      

  20.   

    "只要你是拼SQL的,无论的玩什么花样,都会被注入." 这句话太绝对了  世界上就没有绝对的事情 这句话本身就是 绝对的所以用你自己的话来推翻自己
      

  21.   

    JB,拼sql就会被注入吗?sql注入就两点,你避免了就OK,1个是数字型的,你用isinteger(id) 判断下是否是数字,如果不是就利马response.end.第2个就是替换'为'' ,如果还能注入,你来找我!!
      

  22.   

    这样行不:C#
    comm.commandtxt=select xx fron tabl10 where id=@id
    comm.parameters.add("@id",sqldbtype.decimal);
    comm.parameters["@id"].value=xxxx;//xxxx是值
      

  23.   

    拼的就是字符串拼嘛. 但你就算不用存储过程
    你可以使用SqlParameter   传参数来执行.虽然不是存储过程.但也不是拼的.所以我认为说的对
      

  24.   

    拼写SQL一样安全,问题出在安全检查容易疏漏!不是良好的习惯!
      

  25.   

    select * from member这个没入口,不会被注入了吧。哈哈
      

  26.   

    应该基于参数的sql 至少不能算作拼接sql
      

  27.   

    用参数的不会public bool DeleteOnline(Online online)
            {
                StringBuilder strSql = new StringBuilder(150);
                strSql.Append("delete Online ");
                strSql.Append(" where UserName=@UserName and SchoolID=@SchoolID");            DbParameter[] parms = new SqlParameter[2];
                parms[0] = DbHelper.ParaInstance("@UserName", (DbType)SqlDbType.NVarChar, 20, online.UserName, ParameterDirection.Input);
                parms[1] = DbHelper.ParaInstance("@SchoolID", (DbType)SqlDbType.Int, 4, online.SchoolID, ParameterDirection.Input);            return DbHelper.ExecuteNonQuery(strSql.ToString(), CommandType.Text, DbHelper.GuanBar_User_ConnString, parms);
            }
    使用严格过滤的不会/// <summary>
            /// 字符过滤编码函数,在实际编程中,建议过滤后还应该使用参数构造sql语句
            /// </summary>
            /// <param name="value">输入字符串</param>
            /// <returns></returns>
            public static string StringEnCode(string value)
            {
                if (value.Trim().Length == 0)
                    return string.Empty;
                value = value.Replace(((char)44).ToString(), "&#59;");//;
                value = value.Replace(((char)10).ToString(), "<br>");//br
                value = value.Replace(((char)32).ToString(), "&#32;");//空格
                value = value.Replace(((char)37).ToString(), "&#37;");//%
                value = value.Replace(((char)39).ToString(), "&#39;");//'
                value = value.Replace(((char)44).ToString(), "&#44;");//,
                value = value.Replace(((char)60).ToString(), "&#60;");//<
                value = value.Replace(((char)62).ToString(), "&#62;");//>
                value = value.Replace(((char)92).ToString(), "&#92;");//\\
                value = value.Replace(((char)94).ToString(), "&#94;");//^
                value = value.Replace(((char)45).ToString() + ((char)45).ToString(), "&#45;&#45;");//--
                value = Regex.Replace(value, "<a href=", "<a target=_blank href=", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                Regex regex = new Regex("<a href=", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                value = regex.Replace(value, "<a target=_blank href=");
                return value;
            }