我在经典ASP网站上有这个简单的错误检查页面,并设置了自定义错误页面,以便脚本错误(500和500.100)调用此错误页面,以便将错误记录到MySQL表中:
<!--#INCLUDE file="db_connection.asp" -->
<%
On Error Resume Next
'crappy function I use
Function newstr(str)
newstr = Server.HTMLencode(str)
newstr = Replace(newstr, "'","''")
newstr = Replace(newstr, "\","\\")
newstr = Replace(newstr, chr(10), "<br />")
End Function
'get all form data and put it into a variable
For ix = 1 to Request.Form.Count
fieldName = Request.Form.Key(ix)
fieldValue = Request.Form.Item(ix)
bb = bb & fieldName & ": " & fieldValue & vbcrlf
Next
bb = newstr(bb)
set objError = Server.getLastError()
strNumber = objError.AspCode & " : " & Err.Number
strSource = objError.Category
strPage = objError.File
strDesc = objError.Description & " : " & ObjError.ASPDescription & " :: " & Err.Description
strDesc = newstr(strDesc)
strCode = Server.HTMLEncode(objError.Source)
If strCode = "" then strCode = "No code available"
strLine = ObjError.Line
strASPDesc = ObjError.ASPDescription
strRemoteAddr = Request.ServerVariables("REMOTE_ADDR")
strLocalAddr = Request.ServerVariables("LOCAL_ADDR")
ref = request.servervariables("HTTP_REFERER")
str = request.servervariables("QUERY_STRING")
ip_url = strRemoteAddr
ua = newstr(request.servervariables("HTTP_USER_AGENT"))
totalstring = strPage & "?" & str
sql = ""
sql = SQL & " INSERT INTO error_log ("
sql = SQL & " er_time, "
sql = SQL & " er_number, "
sql = SQL & " er_source, "
sql = SQL & " er_page, "
sql = SQL & " er_desc, "
sql = SQL & " er_code, "
sql = SQL & " er_line, "
sql = SQL & " er_remote_addr, "
sql = SQL & " er_local_addr, "
sql = SQL & " er_str, "
sql = SQL & " er_ref, "
sql = SQL & " er_type, "
sql = SQL & " ip_url, "
sql = SQL & " er_br, "
sql = SQL & " er_form"
sql = SQL & " ) VALUES ("
sql = SQL & " now(),"
sql = SQL & " '" &strNumber&"',"
sql = SQL & " '"&strSource&"',"
sql = SQL & " '"&strPage&"',"
sql = SQL & " '"&strDesc&"',"
sql = SQL & " '"&strCode&"',"
sql = SQL & " '"&strLine&"',"
sql = SQL & " '"&strRemoteAddr&"',"
sql = SQL & " '"&strLocalAddr&"',"
sql = SQL & " '"&totalstring&"',"
sql = SQL & " '"&ref&"',"
sql = SQL & " '500',"
sql = SQL & " '"&ip_url&"',"
sql = SQL & " '"&ua&"',"
sql = SQL & " '"&bb&"') "
oConn.Execute(sql)
%>
我发现的问题是许多行一直在错误日志中结束,但是没有触发Server.getLastError,因为它的所有变量都是NULL。而且我知道有人没有直接访问错误页面的URL,因为&#34; strPage&#34;填充变量(由objError.File设置)。
但是,如果我访问错误的页面,它总能正常工作。
错误日志中的页面始终具有与之关联的查询字符串 - 但其ID始终不同 - 例如,它可能是&#34; totalstring&#34; (由objError.File与问号连接,后跟request.servervariables(&#34; QUERY_STRING&#34;)组成可能是:
/music/view.asp?id=192
/designs/page.asp?id=5775
/designs/page.asp?id=5797
他们在同一个地方的所有错误,即:
e = newstr(request("id"))
其中&#34; newstr&#34;是本页顶部提到的功能。我知道这个函数是一堆废话并冒着SQL注入等风险。
但是,在这种情况下,我无法解决网页错误的原因,因为它们对我和大多数网站用户来说都能正常运行。
奇怪的是,获得错误的用户的IP地址始终来自同一个ISP - 通常是德国的一个ISP。
可能会在后台发生可疑事吗?是否有任何其他日志记录我可以做到这一点?
2015年7月30日更新
感谢@John提供的答案,我能够深入了解这一点,并通过将其放在每个页面的顶部来避免错误:
<%
''get the cookie data
ck = Request.ServerVariables("HTTP_COOKIE")
'' does the cookie data contain "; = true;" somewhere, does not matter where
v1 = instr(ck, "; =true;")
''if the cookie data starts with "=true;" OR if "; =true;" appears somewhere in the cookie, then redirect somewhere else
if left(ck,6) = "=true;" OR v1 > 0 then response.redirect ("somewhere-else.asp")
%>
似乎是源自ISP Hetzner Online AG的一些黑客类型活动
答案 0 :(得分:1)
在没有记录错误编号的情况下,我遇到了很多类似的错误。我发现问题是由于发送的cookie以及至少一个没有名称的cookie。
当你执行Request("id")
时,它会检查查询字符串,表单发布,然后检查cookie。经典ASP似乎无法处理没有名称的cookie,并且在这种情况下出现错误而失败。
查看我收到的请求,看起来像是针对Cookie的异常黑客攻击。
要查看是否是这种情况,我建议您也记录cookie HTTP标头。
一种选择是从Request
更改为Request.QueryString
或Request.Form
,具体取决于您希望传递参数的方式(GET或POST)。
如果这不是一个选项,那么你可以添加一些代码来检查这个没有名称的cookie问题,像这样的事情应该做的工作:
On Error Resume Next
Request.Cookies("test")
If Err.Number <> 0 Then Server.Transfer("/common/500.asp")
On Error Goto 0
这只是检查是否可以读取cookie,并且您使用的cookie名称或cookie是否存在并不重要。如果发送无效的cookie,它将结束执行。如果您有一个在每个请求上运行的包含文件,您可以将其添加到开头。
请参阅我自己的SO question以获取更多信息。