错误处理页面未捕获所有错误
Error handing page not trapping all errors
我的经典 ASP 网站上有这个简单的错误检查页面,并设置了一个自定义错误页面,以便脚本错误(500 和 500.100)调用此错误页面,以便将错误记录到 MySQL table:
<!--#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,因为填充了 "strPage" 变量(由 objError.File 设置)。
但是,如果我访问出错的页面,它总是可以正常工作。
错误日志中的页面总是有一个与之相关联的查询字符串——但它的 ID 总是不同的——例如"totalstring"(由 objError.File 与问号连接后跟 request.servervariables("QUERY_STRING") 组成可能是:
/music/view.asp?id=192
/designs/page.asp?id=5775
/designs/page.asp?id=5797
它们都在同一个地方出错,即:
e = newstr(request("id"))
其中 "newstr" 是本页顶部提到的函数。我知道那个函数是一堆废话并且有 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")
%>
似乎是某种黑客类型 activity 来自 ISP Hetzner Online AG
我遇到了很多没有记录错误编号的类似错误。我发现问题是由于正在发送的 cookie 和至少一个没有名称的 cookie。
当您执行 Request("id")
时,它会检查查询字符串、表单 post,然后是 cookie。 Classic ASP 似乎无法处理没有名称的 cookie,并且在这种情况下失败并出现错误。
查看我收到的请求,它们确实看起来像是针对 cookie 的异常黑客尝试。
要查看是否属于这种情况,我建议您也记录 cookie HTTP header。
一个选项是从 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。
我的经典 ASP 网站上有这个简单的错误检查页面,并设置了一个自定义错误页面,以便脚本错误(500 和 500.100)调用此错误页面,以便将错误记录到 MySQL table:
<!--#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,因为填充了 "strPage" 变量(由 objError.File 设置)。
但是,如果我访问出错的页面,它总是可以正常工作。
错误日志中的页面总是有一个与之相关联的查询字符串——但它的 ID 总是不同的——例如"totalstring"(由 objError.File 与问号连接后跟 request.servervariables("QUERY_STRING") 组成可能是:
/music/view.asp?id=192
/designs/page.asp?id=5775
/designs/page.asp?id=5797
它们都在同一个地方出错,即:
e = newstr(request("id"))
其中 "newstr" 是本页顶部提到的函数。我知道那个函数是一堆废话并且有 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")
%>
似乎是某种黑客类型 activity 来自 ISP Hetzner Online AG
我遇到了很多没有记录错误编号的类似错误。我发现问题是由于正在发送的 cookie 和至少一个没有名称的 cookie。
当您执行 Request("id")
时,它会检查查询字符串、表单 post,然后是 cookie。 Classic ASP 似乎无法处理没有名称的 cookie,并且在这种情况下失败并出现错误。
查看我收到的请求,它们确实看起来像是针对 cookie 的异常黑客尝试。
要查看是否属于这种情况,我建议您也记录 cookie HTTP header。
一个选项是从 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。