我的网站是.net+sql2005的,现在常被 注进这样一些内容,​
cheap viagra 673583 viagra online 1512 
 viagra jgezdj viagra 9999 ​
程序上应该怎么处理呢?​这是SQL注入吗?感觉不是一样,我在globle.asax文件里已经加上了网上的防注入的方法的啊?
而那些内容正好又是正在我评论表的存内容的字段里,界面就是一个textarea 输入框
 

解决方案 »

  1.   

    SQL用参数化语句,一般就难以SQL注入了。
    你的问题当然也有可能是服务器漏洞,跟你程序无关。
      

  2.   

    你看下这些内容数据库里有吗?如有则应该是被sql注入了;如没有则应该是服务器问题。
      

  3.   


    上面ID>16的就应该是被搞进去的
    但它每项内容又都是按我的字段要求来对应 上的,搞不懂这到底是不是注入啊
      

  4.   

    StringBuilder sql = new StringBuilder(" insert into QT_Pinglun ( ID,userID_F,userID_T,tPF,tContent,tTime,tType )  ");
            sql.Append(" values (@id,@userID_F,@newsID,@pf,@content,@dt,@type) ");        SqlParameter[] paras = { new SqlParameter("@id", SqlDbType.VarChar, 4) ,
                new SqlParameter("@userID_F", SqlDbType.NVarChar, 6) , 
                new SqlParameter("@newsID", SqlDbType.VarChar, 4) ,
                new SqlParameter("@pf", SqlDbType.VarChar, 4) ,
                new SqlParameter("@content", SqlDbType.Text, 10000) ,
                new SqlParameter("@dt", SqlDbType.DateTime, 8) ,
                new SqlParameter("@type", SqlDbType.VarChar, 2) ,
            };
            string[] stra = { tepID.ToString(), userID_F, newsID, pf.ToString(), content, dt.ToString(), "2", };
            int j;
            for (j = 0; j < stra.Length; j++)
            {
                paras[j].Value = stra[j];        }
           
            string sqla = sql.ToString();
            try
            {
                SqlHelper.ExecuteNonQuery(sqla, paras); ////执行添加数据
                ScriptManager.RegisterStartupScript(UpdatePanel1, this.GetType(), "消息框", "<script>alert('评伦发表成功!\\n\\n谢谢您对该博文的支持!');</script>", false);
                this.tcontent.Value = "";
                //局部不刷新
                pageLoad();
            }
            catch (SqlException ex)
            {
            }
    请问下这断代码是不是已经是参数化的sql语句了?
      

  5.   

    不像是注入,应该是通过程序发送 HTTP 请求直接往你网站上提交数据的,这样的方式可以跳过你客户端的验证的。所以说,客户端验证对于真正不愿遵守规则的人是没用的。
      

  6.   


    如果不是注入而是HTTP直接 提交数据的话,应该怎么避免呢?
      

  7.   

    这个很难真正的避免,因为用户提交的是合法的数据。比较常见的是验证码方式,但验证码也可通过程序来识别,不过如果验证码程序写的好,识别率还是不高的。还有通过 IP 来限制,在限定的时间内如果用户提交的数据超过限制,则暂时不接受该 IP 来的资料,但 IP 也是可以伪造的,还有其它一些方法,你可以在网上搜一下。
      

  8.   

    自己检查一下程序的逻辑,为什么会把那些文字内容当作html内容而输出呢?为什么不做HtmlEncode之后才输出呢?
      

  9.   

    我想你这个程序的设计人员没有对tContent字段到底保存什么有比较恰当的认识,或者是开发人员胡乱使用这个字段。假设是第二种情况(既设计人员懂得tContent字段的使用规范,已经在文档上做了规定)比较好办,那么作为测试人员随便在tContent这个字段放一个html内容,例如“<span>abcd</span>”,然后应该测试到的是:应该在页面上原样显示<span>这样的文字,看不到这样的字那它就是开发人员的Bug了。
      

  10.   

    问题出在基本概念上,不用纠结编程问题,如果你把上述基本概念搞清晰(仔细定义tContent相关数据在表现层到底如何使用)就没有必要防什么“SQL注入”。所谓SQL注入是指一些sql编程的人根本没有正确地sql编程,比如说它写一个程序whereString+ "and [字段a]='" + textBox1.Text.Trim() +"'"这类代码,这个sql就根本没有考虑到textBox1.Text.Trim()之中有单引号的情况。正确地程序应该是whereString+ "and [字段a]='" + textBox1.Text.Trim().Replace("'","''") +"'"当然对于“SQL注入”从技术上来说,过滤字符纯粹是一种奇怪并且多余的做法。因为textBox1.Text.Trim()里边如果有单引号那么你就应该让它正常地录入到数据库中,至于说表现层该不该让用户录入单引号那是另外一个层面的设计问题,跟这里的数据库编程没有关系。而你的情况显然这类设计问题,而不是编程问题。
      

  11.   

    应该是SP1234说的没有进行HTML编码,会被JS脚本注入,不是SQL注入
    他还不狠,狠的话来个无限循环你就happy了
    比如内容为:
    <script>
    if(true)
    {
    alert('评伦发表成功');
    }
    </script> 
      

  12.   

    应该是注入,参数化并不一定能防止注入,
    参数化 + 不拼sql(包括参数化的sql语句)就比较安全了
      

  13.   

    明显是机器人自动提交或外部提交的。防止这个问题很简单,就是session 验证和发贴时加验证码验证。万无一失~~
    http://www.marblelog.com