问题描述
我的网站是.net+sql2005的,现在常被注进这样一些内容,6735831512jgezdj9999程序上应该怎么处理呢?这是SQL注入吗?感觉不是一样,我在globle.asax文件里已经加上了网上的防注入的方法的啊?而那些内容正好又是正在我评论表的存内容的字段里,界面就是一个textarea输入框
解决方案
解决方案二:
SQL用参数化语句,一般就难以SQL注入了。你的问题当然也有可能是服务器漏洞,跟你程序无关。
解决方案三:
我的程序也是特的改了那评论的地方为参数化的了还是要发些内容进去
解决方案四:
你看下这些内容数据库里有吗?如有则应该是被sql注入了;如没有则应该是服务器问题。
解决方案五:
上面ID>16的就应该是被搞进去的但它每项内容又都是按我的字段要求来对应上的,搞不懂这到底是不是注入啊
解决方案六:
我靠,我都不敢点,
解决方案七:
引用5楼msdnxgh的回复:
我靠,我都不敢点,
什么?
解决方案八:
StringBuildersql=newStringBuilder("insertintoQT_Pinglun(ID,userID_F,userID_T,tPF,tContent,tTime,tType)");sql.Append("values(@id,@userID_F,@newsID,@pf,@content,@dt,@type)");SqlParameter[]paras={newSqlParameter("@id",SqlDbType.VarChar,4),newSqlParameter("@userID_F",SqlDbType.NVarChar,6),newSqlParameter("@newsID",SqlDbType.VarChar,4),newSqlParameter("@pf",SqlDbType.VarChar,4),newSqlParameter("@content",SqlDbType.Text,10000),newSqlParameter("@dt",SqlDbType.DateTime,8),newSqlParameter("@type",SqlDbType.VarChar,2),};string[]stra={tepID.ToString(),userID_F,newsID,pf.ToString(),content,dt.ToString(),"2",};intj;for(j=0;j<stra.Length;j++){paras[j].Value=stra[j];}stringsqla=sql.ToString();try{SqlHelper.ExecuteNonQuery(sqla,paras);////执行添加数据ScriptManager.RegisterStartupScript(UpdatePanel1,this.GetType(),"消息框","<script>alert('评伦发表成功!\n\n谢谢您对该博文的支持!');</script>",false);this.tcontent.Value="";//局部不刷新pageLoad();}catch(SqlExceptionex){}请问下这断代码是不是已经是参数化的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
解决方案:
该回复于2011-12-12 09:04:16被版主删除
解决方案:
我点击的网页是你自己的?还是被“伟哥”注入后的
解决方案:
应该是注入,参数化并不一定能防止注入,参数化+不拼sql(包括参数化的sql语句)就比较安全了
解决方案:
该回复于2011-12-14 09:06:55被版主删除
解决方案:
100%是服务器有木马、中毒~!
解决方案:
明显是机器人自动提交或外部提交的。防止这个问题很简单,就是session验证和发贴时加验证码验证。万无一失~~
解决方案:
都说的很好啊,学习了。
解决方案:
又学到一些防注入的经验了,各位都是牛人啊
解决方案:
引用25楼chen_ya_ping的回复:
那就在服务也加入验证。
++