当前位置:编程学习 > C#/ASP.NET >>

这样的情况是被SQL注入吗?

我的网站是.net+sql2005的,现在常被 注进这样一些内容,​
cheap viagra 673583 viagra online 1512 
 viagra jgezdj viagra 9999 ​
程序上应该怎么处理呢?​这是SQL注入吗?感觉不是一样,我在globle.asax文件里已经加上了网上的防注入的方法的啊?
而那些内容正好又是正在我评论表的存内容的字段里,界面就是一个textarea 输入框
 
--------------------编程问答-------------------- SQL用参数化语句,一般就难以SQL注入了。
你的问题当然也有可能是服务器漏洞,跟你程序无关。 --------------------编程问答-------------------- 我的程序也是特的改了那评论的地方为参数化的了
还是要发些内容进去
--------------------编程问答-------------------- 你看下这些内容数据库里有吗?如有则应该是被sql注入了;如没有则应该是服务器问题。 --------------------编程问答--------------------
上面ID>16的就应该是被搞进去的
但它每项内容又都是按我的字段要求来对应 上的,搞不懂这到底是不是注入啊 --------------------编程问答-------------------- 我靠,我都不敢点, --------------------编程问答--------------------
引用 5 楼 msdnxgh 的回复:
我靠,我都不敢点,


什么? --------------------编程问答-------------------- 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语句了? --------------------编程问答-------------------- 不像是注入,应该是通过程序发送 HTTP 请求直接往你网站上提交数据的,这样的方式可以跳过你客户端的验证的。所以说,客户端验证对于真正不愿遵守规则的人是没用的。 --------------------编程问答-------------------- 同意楼上。 --------------------编程问答--------------------
引用 8 楼 orain 的回复:
不像是注入,应该是通过程序发送 HTTP 请求直接往你网站上提交数据的,这样的方式可以跳过你客户端的验证的。所以说,客户端验证对于真正不愿遵守规则的人是没用的。


如果不是注入而是HTTP直接 提交数据的话,应该怎么避免呢? --------------------编程问答-------------------- 这个很难真正的避免,因为用户提交的是合法的数据。比较常见的是验证码方式,但验证码也可通过程序来识别,不过如果验证码程序写的好,识别率还是不高的。还有通过 IP 来限制,在限定的时间内如果用户提交的数据超过限制,则暂时不接受该 IP 来的资料,但 IP 也是可以伪造的,还有其它一些方法,你可以在网上搜一下。 --------------------编程问答-------------------- 还是要谢谢了 --------------------编程问答-------------------- 操作数据库 用 参数方式  查询的话,把单引号 替换成两个单引号, 一般就解决问题. --------------------编程问答--------------------
引用 13 楼 asdvb 的回复:
操作数据库 用 参数方式  查询的话,把单引号 替换成两个单引号, 一般就解决问题.


参数方式 具体是怎么样的啊?
我在7楼用的那断代码算是参数化吗? --------------------编程问答-------------------- 使用存储过程,再使用参数来进行过滤操作!
    --------------------编程问答--------------------
引用 15 楼 krenyelang 的回复:
使用存储过程,再使用参数来进行过滤操作!


用存储过程的话,要带的参数太多了,感觉更复杂一样 --------------------编程问答--------------------
引用 16 楼 qbaozh 的回复:
引用 15 楼 krenyelang 的回复:

使用存储过程,再使用参数来进行过滤操作!


用存储过程的话,要带的参数太多了,感觉更复杂一样

你那个已经是参数化储存了,干嘛还用存储过程。一个简单的插入操作,没必要写成存储过程。 --------------------编程问答-------------------- 限制他的发帖间隔时间,根据IP,也可以加验证码 --------------------编程问答-------------------- 设置权限 --------------------编程问答-------------------- 自己检查一下程序的逻辑,为什么会把那些文字内容当作html内容而输出呢?为什么不做HtmlEncode之后才输出呢? --------------------编程问答-------------------- 我想你这个程序的设计人员没有对tContent字段到底保存什么有比较恰当的认识,或者是开发人员胡乱使用这个字段。

假设是第二种情况(既设计人员懂得tContent字段的使用规范,已经在文档上做了规定)比较好办,那么作为测试人员随便在tContent这个字段放一个html内容,例如“<span>abcd</span>”,然后应该测试到的是:应该在页面上原样显示<span>这样的文字,看不到这样的字那它就是开发人员的Bug了。 --------------------编程问答--------------------
引用 14 楼 qbaozh 的回复:
参数方式 具体是怎么样的啊?
我在7楼用的那断代码算是参数化吗?

问题出在基本概念上,不用纠结编程问题,如果你把上述基本概念搞清晰(仔细定义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()里边如果有单引号那么你就应该让它正常地录入到数据库中,至于说表现层该不该让用户录入单引号那是另外一个层面的设计问题,跟这里的数据库编程没有关系。

而你的情况显然这类设计问题,而不是编程问题。 --------------------编程问答-------------------- 应该是SP1234说的没有进行HTML编码,会被JS脚本注入,不是SQL注入
他还不狠,狠的话来个无限循环你就happy了
比如内容为:


<script>
if(true)
{
alert('评伦发表成功');
}
</script> 
--------------------编程问答-------------------- 不是吧 --------------------编程问答-------------------- 那就在服务也加入验证。 --------------------编程问答-------------------- 应该中了机器人发的消息吧,过滤“重试”,设置发送间隔,封IP --------------------编程问答-------------------- --------------------编程问答-------------------- 我点击的网页是你自己的?
还是被“伟哥”注入后的 --------------------编程问答-------------------- 应该是注入,参数化并不一定能防止注入,
参数化 + 不拼sql(包括参数化的sql语句)就比较安全了 --------------------编程问答-------------------- --------------------编程问答-------------------- 100%是服务器有木马、中毒~! --------------------编程问答-------------------- 明显是机器人自动提交或外部提交的。防止这个问题很简单,就是session 验证和发贴时加验证码验证。万无一失~~
http://www.marblelog.com --------------------编程问答-------------------- 都说的很好啊,学习了。 --------------------编程问答-------------------- 又学到一些防注入的经验了,各位都是牛人啊 --------------------编程问答--------------------
引用 25 楼 chen_ya_ping 的回复:
那就在服务也加入验证。

++
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,