处理页面时没有捕获所有错误

时间:2015-07-27 20:33:33

标签: iis asp-classic

我在经典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")
%>

此处还有更多信息: https://forums.iis.net/p/1226865/2106015.aspx?Re+Request+Cookies+generate+80004005+2147467259+error+if+cookie+with+no+name

似乎是源自ISP Hetzner Online AG的一些黑客类型活动

1 个答案:

答案 0 :(得分:1)

在没有记录错误编号的情况下,我遇到了很多类似的错误。我发现问题是由于发送的cookie以及至少一个没有名称的cookie。

当你执行Request("id")时,它会检查查询字符串,表单发布,然后检查cookie。经典ASP似乎无法处理没有名称的cookie,并且在这种情况下出现错误而失败。

查看我收到的请求,看起来像是针对Cookie的异常黑客攻击。

要查看是否是这种情况,我建议您也记录cookie HTTP标头。

一种选择是从Request更改为Request.QueryStringRequest.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以获取更多信息。