问题描述
大家好:我用ASP做的一个网站,其中有评论功能,提交按钮功能代码如下:ifrequest("action")="tijiao"thenifrequest("content")=""thenresponse.write"<SCRIPTlanguage=JavaScript>alert('请输入评论内容!');javascript:history.go(-1)</SCRIPT>"elsesql_F="insertintocomments(content,products_id,users_id,ip,adddata)values('"&request("content")&"','"&request("id")&"','"&Session("id")&"','"&Request.ServerVariables("Remote_HOST")&"','"&now()&"')"conn.execute(sql_F)response.write"<scriptlanguage='javascript'>"&chr(13)response.write"alert('发表成功,谢谢您的参与!');"&Chr(13)response.write"window.document.location.href='show.asp?id="&request("id")&"';"&Chr(13)response.write"</script>"&Chr(13)Response.Endendifendif不知道浏览网站的人使用什么代码,使我数据库中使我数据库中的数据users_id,ip,adddata全部不显示内容,显示如下图:[img=http://m394.mail.qq.com/cgi-bin/download?mailid=ZL1406kwPqrFMZS9G_yOizQF4Xcg0b&filename=2010-11-06_094732%BA%F3%CC%A8%CE%CA%CC%E2%BD%D8%CD%BC.png&sid=AAHvhyB1l75pTEsH&action=view][/img]我初步判断应该是非法代码或者是SQL注入,但是不知道怎么解决,请高手帮助。
解决方案
解决方案二:
你应当先判断一下Session("id")是不是有值,确保是登录用户。另外,你用拼串的方式当然避不开注入式攻击,还是用参数的方式吧。象你这个串,只要content中的值是',null,null,null;就可以了吧?
解决方案三:
修改代码参数化SQL
解决方案四:
后台显示如下:id评论人内容:发布时间:发布IP管理123HxjEK6查看|删除灰色的什么也看不见灰色的什么也看不见灰色的什么也看不见
解决方案五:
我试着输入',null,null,null提示我:非法操作!您的纪录已经被提交到公安局↓操作IP:211.*.*.21操作时间:2010-11-810:47:40操作页面:/index_new/show.asp提交方式:POST提交参数:content提交数据:',null,null,null;
解决方案六:
好象你的页面已经进行的防sql注入攻击。但从你贴的程序里看不出来,是不是使用了第三方sql注入攻击软件啊。对于你的程序,只能说,请在执行之前再次确认,是否已经正常获取到了要插入的值,另把sql记录一下,看下,最终用户执行的sql是什么样子的。特别是session("id"),你应当做页面对用户登录的确认的啊。还有Remote_HOST有时候反向获取不到用户主机名,应当用Remote_addr。还有你的这个第三方sql注入攻击软件很不友好啊,我估计是直接进行的单引号判断吧,什么程序吗!
解决方案七:
Replace替换关键字符?不懂ASP
解决方案八:
网上程序参考下'==========安全代码==========DimGetFlagRem(提交方式)DimErrorSqlRem(非法字符)DimRequestKeyRem(提交数据)DimForIRem(循环标记)ErrorSql="'~;~and~(~)~exec~update~count~*~%~<~>~chr~mid~master~truncate~char~declare"Rem(每个敏感字符或者词语请使用半角"~"格开)ErrorSql=Split(ErrorSql,"~")IfRequest.ServerVariables("REQUEST_METHOD")="GET"ThenGetFlag=TrueElseGetFlag=FalseEndIfIfGetFlagThenForEachRequestKeyInRequest.QueryStringForForI=0ToUBound(ErrorSql)IfInStr(LCase(Request.QueryString(RequestKey)),ErrorSql(ForI))<>0ThenCallinfoback("请不要使用特殊字符,例如英文单引号等!")EndIfNextNextElseForEachRequestKeyInRequest.FormForForI=0ToUBound(ErrorSql)IfInStr(LCase(Request.Form(RequestKey)),ErrorSql(ForI))<>0ThenCallinfoback("请不要使用特殊字符,例如英文单引号等!")EndIfNextNextEndIfSql_in="and|or|on|in|select|insert|update|delete|exec|declare|'"Sql=Split(Sql_in,"|")IfRequest.QueryString<>""ThenForEachSql_GetInRequest.QueryStringForSql_Data=0ToUBound(Sql)IfInStr(LCase(Request.QueryString(Sql_Get)),Sql(Sql_Data))<>0ThenCallinfoback("请不要尝试非法注入!")EndIfNextNextEndIfIfRequest.Form<>""ThenForEachSql_PostInRequest.FormForSql_Data=0ToUBound(Sql)IfInStr(LCase(Request.Form(Sql_Post)),Sql(Sql_Data))<>0ThenCallinfoback("请不要尝试非法注入!")EndIfNextNextEndIf
解决方案九:
直接把单引号Repleace为两个单引号
解决方案十:
这不是人工发的,是专门的群发软件发的,对于客户端的ip和ServerVariables("Remote_HOST")都可以很容易伪造的。解决办法:1。增加验证码,发一条留言必须输入一次验证码2、insertintocomments这种方法改成dimrs,sqlsetrs=server.createobject("adodb.recordset")sql="select*fromcommentswhereidisnull"rs.opensql,conn,1,3rs.addnewrs("content")=content'...其它的自己写rs.updaters.close
解决方案十一:
另外还得判断Session("id"),Request.ServerVariables("Remote_HOST")这3个内容是否合法的
解决方案十二:
引用10楼beyond_me21的回复:
另外还得判断Session("id"),Request.ServerVariables("Remote_HOST")这3个内容是否合法的
Request.ServerVariables("Remote_HOST")可以伪造,session("id")同时存在于客户端和服务器端,也可以伪造么?请教了。
解决方案十三:
写错了,sessionid同时存在于服务器端和客户端,而session("id")只存在于服务器端,也可以伪造么?请教了。
解决方案十四:
引用12楼hwbox的回复:
写错了,sessionid同时存在于服务器端和客户端,而session("id")只存在于服务器端,也可以伪造么?请教了。
session("id")不可以伪造,但是客户端可以禁止cookie,session是需要将SessionID存在客户端的cookie里的
解决方案十五:
上网上搜一个封装好的dll(返回规范html格式的类),在项目中去调用它,过滤掉危险字符
解决方案:
注意,这些垃圾信息是通过软件提交的而不是浏览器,这样它就没使用cookie了,所以这里的Session("id")就是null,
解决方案:
引用9楼beyond_me21的回复:
这不是人工发的,是专门的群发软件发的,对于客户端的ip和ServerVariables("Remote_HOST")都可以很容易伪造的。解决办法:1。增加验证码,发一条留言必须输入一次验证码2、insertintocomments这种方法改成dimrs,sqlsetrs=server.createobject("adodb.recordset")sql="selec……
谢谢啦
解决方案:
你的验证机制简单的可怜只有一条:ifrequest("content")=""then也就是说只要提交内容不为空就可以通过验证并写入数据库.