关于留言板被非法代码注入问题

jeakyli 2010-11-08 10:04:16
大家好:

我用ASP做的一个网站,其中有评论功能,提交按钮功能代码如下:
if request("action")="tijiao" then
if request("content")="" then
response.write"<SCRIPT language=JavaScript>alert('请输入评论内容!');javascript:history.go(-1)</SCRIPT>"
else
sql_F="insert into comments(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 "<script language='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.End
end if
end if
不知道浏览网站的人使用什么代码,使我数据库中使我数据库中的数据users_id,ip,adddata全部不显示内容,
显示如下图:

我初步判断应该是非法代码或者是SQL注入,但是不知道怎么解决,请高手帮助。
...全文
1126 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
newdigitime 2011-06-13
  • 打赏
  • 举报
回复
你的验证机制简单的可怜
只有一条:
if request("content")="" then
也就是说只要 提交内容不为空就可以通过验证并写入数据库.


xj56ai 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 beyond_me21 的回复:]
这不是人工发的,是专门的群发软件发的,对于客户端的ip和ServerVariables("Remote_HOST")都可以很容易伪造的。
解决办法:
1。增加验证码,发一条留言必须输入一次验证码
2、insert into comments这种方法改成
dim rs,sql
set rs=server.createobject("adodb.recordset")
sql="selec……
[/Quote]谢谢 啦
beyond_me21 2010-11-08
  • 打赏
  • 举报
回复
注意,这些垃圾信息是通过软件提交的而不是浏览器,这样它就没使用cookie了,所以这里的Session("id")就是null,
aellonxie 2010-11-08
  • 打赏
  • 举报
回复
上网上搜一个封装好的dll(返回规范html格式的类),在项目中去调用它,过滤掉危险字符
beyond_me21 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hwbox 的回复:]

写错了,sessionid同时存在于服务器端和客户端,而session("id")只存在于服务器端,也可以伪造么?请教了。
[/Quote]
session("id")不可以伪造,但是客户端可以禁止cookie,session是需要将SessionID存在客户端的cookie里的
hwbox 2010-11-08
  • 打赏
  • 举报
回复
写错了,sessionid同时存在于服务器端和客户端,而session("id")只存在于服务器端,也可以伪造么?请教了。
hwbox 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 beyond_me21 的回复:]
另外还得判断Session("id"),Request.ServerVariables("Remote_HOST")这3个内容是否合法的
[/Quote]

Request.ServerVariables("Remote_HOST")可以伪造,session("id") 同时存在于客户端和服务器端,也可以伪造么?请教了。
beyond_me21 2010-11-08
  • 打赏
  • 举报
回复
另外还得判断Session("id"),Request.ServerVariables("Remote_HOST")这3个内容是否合法的
beyond_me21 2010-11-08
  • 打赏
  • 举报
回复
这不是人工发的,是专门的群发软件发的,对于客户端的ip和ServerVariables("Remote_HOST")都可以很容易伪造的。
解决办法:
1。增加验证码,发一条留言必须输入一次验证码
2、insert into comments这种方法改成
dim rs,sql
set rs=server.createobject("adodb.recordset")
sql="select * from comments where id is null"
rs.open sql,conn,1,3
rs.addnew
rs("content")=content
'...其它的自己写

rs.update
rs.close
还想懒够 2010-11-08
  • 打赏
  • 举报
回复
直接把单引号Repleace为两个单引号
tsmoon2009 2010-11-08
  • 打赏
  • 举报
回复
网上程序参考下

'==========安全代码==========

Dim GetFlag Rem(提交方式)
Dim ErrorSql Rem(非法字符)
Dim RequestKey Rem(提交数据)
Dim ForI Rem(循环标记)
ErrorSql = "'~;~and~(~)~exec~update~count~*~%~<~>~chr~mid~master~truncate~char~declare" Rem(每个敏感字符或者词语请使用半角 "~" 格开)
ErrorSql = Split(ErrorSql, "~")
If Request.ServerVariables("REQUEST_METHOD") = "GET" Then
GetFlag = True
Else
GetFlag = False
End If
If GetFlag Then
For Each RequestKey In Request.QueryString
For ForI = 0 To UBound(ErrorSql)
If InStr(LCase(Request.QueryString(RequestKey)), ErrorSql(ForI))<>0 Then
Call infoback("请不要使用特殊字符,例如英文单引号等!")
End If
Next
Next
Else
For Each RequestKey In Request.Form
For ForI = 0 To UBound(ErrorSql)
If InStr(LCase(Request.Form(RequestKey)), ErrorSql(ForI))<>0 Then
Call infoback("请不要使用特殊字符,例如英文单引号等!")
End If
Next
Next
End If
Sql_in = "and |or |on |in |select |insert |update |delete |exec |declare |'"
Sql = Split(Sql_in, "|")
If Request.QueryString<>"" Then
For Each Sql_Get In Request.QueryString
For Sql_Data = 0 To UBound(Sql)
If InStr(LCase(Request.QueryString(Sql_Get)), Sql(Sql_Data))<>0 Then
Call infoback("请不要尝试非法注入!")
End If
Next
Next
End If
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For Sql_Data = 0 To UBound(Sql)
If InStr(LCase(Request.Form(Sql_Post)), Sql(Sql_Data))<>0 Then
Call infoback("请不要尝试非法注入!")
End If
Next
Next
End If
Herbert 2010-11-08
  • 打赏
  • 举报
回复
Replace替换关键字符? 不懂ASP
hwbox 2010-11-08
  • 打赏
  • 举报
回复
好象你的页面已经进行的防sql注入攻击。但从你贴的程序里看不出来,是不是使用了第三方sql注入攻击软件啊。

对于你的程序,只能说,请在执行之前再次确认,是否已经正常获取到了要插入的值,另把sql记录一下,看下,最终用户执行的sql是什么样子的。特别是session("id"),你应当做页面对用户登录的确认的啊。

还有Remote_HOST有时候反向获取不到用户主机名,应当用Remote_addr。还有你的这个第三方sql注入攻击软件很不友好啊,我估计是直接进行的单引号判断吧,什么程序吗!
jeakyli 2010-11-08
  • 打赏
  • 举报
回复
我试着输入',null,null,null
提示我:

非法操作!您的纪录已经被提交到公安局↓
操作IP:211.*.*.21
操作时间:2010-11-8 10:47:40
操作页面:/index_new/show.asp
提交方式:POST
提交参数:content
提交数据:',null,null,null;
jeakyli 2010-11-08
  • 打赏
  • 举报
回复
后台显示如下:
id 评论人 内容: 发布时间: 发布IP 管理

123 HxjEK6 查看|删除 灰色的什么也看不见 灰色的什么也看不见 灰色的什么也看不见
q107770540 2010-11-08
  • 打赏
  • 举报
回复
修改代码
参数化SQL
hwbox 2010-11-08
  • 打赏
  • 举报
回复
你应当先判断一下Session("id")是不是有值,确保是登录用户。另外,你用拼串的方式当然避不开注入式攻击,还是用参数的方式吧。象你这个串,只要content中的值是 ',null,null,null; 就可以了吧?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧