2015-07-27 2 views
1

У меня есть эта простая страница проверки ошибок на моем классическом веб-сайте 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-адрес страницы с ошибкой, потому что заполняется переменная «strPage» (установленная objError.File).

Однако, если я посещаю страницу с ошибкой, она всегда работает нормально.

Страницы, которые находятся в журнале ошибок, всегда связаны с ними, но идентификатор этого всегда меняется - так, например, это может быть, что «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-адреса пользователей, получающих ошибки, всегда принадлежат одному и тому же интернет-провайдеру - как правило, одному интернет-провайдеру в Германии.

Может ли что-то подозрительное происходить в фоновом режиме? Есть ли какие-то дополнительные записи, которые я мог бы сделать, чтобы понять это?


тридцатого Update июля 2015

Благодаря ответ, @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

Я получаю много подобных ошибок, где не регистрируется номер ошибки. Я нашел проблему из-за печенья, которые были отправлены, и хотя бы одного из файлов cookie, не имеющих имени.

Когда вы делаете Request("id"), он проверяет запрос, форму сообщения, а затем файлы cookie. Классический ASP, похоже, не способен обрабатывать файлы cookie, где нет имени, и сбой в этой ситуации с ошибкой.

Глядя на запросы, которые я получаю, они выглядят как необычные попытки взлома, нацеленные на файлы cookie.

Чтобы узнать, действительно ли это так, я бы предложил вам также добавить HTTP-заголовок cookie.

Один из вариантов будет меняться от Request к Request.QueryString или Request.Form в зависимости от того, как вы ожидаете параметр, который будет передан (GET или POST).

Если это не вариант, то вы можете добавить код, чтобы проверить это не проблема название печенья, что-то, как это должно сделать работу:

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. Если у вас есть файл include, который запускается по каждому запросу, вы можете добавить его в начало.

Для получения дополнительной информации см. Мои собственные SO question.

+0

Thanks @John. Я добавил строку для присвоения переменной request.servervariables ("HTTP_COOKIE") переменной, чтобы я мог видеть, что происходит. – 4532066

+0

См. Дополнительную информацию по этому вопросу на странице https://forums.iis.net/p/1226865/2106015.aspx?Re+Request+Cookies+generate+80004005+2147467259+error+if+cookie+with+no+name включая некоторые, возможно, хорошие решения с использованием правил перезаписи URL-адресов IIS. – johna

+0

Обновлен мой ответ, поскольку мой код теста cookie был неправильным. – johna

Смежные вопросы