Тело запроса журнала IIS / данные POST

33

Кто-нибудь знает, как я мог заставить IIS регистрировать данные POST или весь HTTP-запрос?

HopelessN00b
источник
ModSecurity доступен для IIS7 + . Это позволит полный доступ к заголовку и телу как запроса, так и ответа.
user2320464

Ответы:

32

Журналы IIS записывают только строку запроса и информацию заголовка без каких-либо данных POST.

Если вы используете IIS7, вы можете включить отслеживание неуспешных запросов для кода состояния 200. При этом будут записаны все данные, и вы сможете выбрать, какой тип данных включить.

В IIS6 или 7 вы можете использовать Application_BeginRequest в global.asax и создать собственную запись данных POST.

Или, в IIS7, вы можете написать модуль HTTP с собственной регистрацией.

Скотт Форсайт - MVP
источник
+1 - мне нравится твой ответ гораздо лучше, чем мой собственный. Мне явно нужно прочитать о сбое отслеживания запросов, поскольку я, очевидно, не использовал IIS7 так часто, как должен.
Эван Андерсон
Как вы можете «выбрать, какой тип данных включить»?
Павел Чучува
1
Последний шаг мастера при создании правила FRT позволяет выбрать, какие данные включать. По умолчанию все включено.
Скотт Форсайт - MVP
Я искал что-то для IIS6, но наткнулся на эту ссылку, которая показывает, что расширенное ведение журнала является дополнительным вариантом для IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas
Не похоже (из этого URL, который поделился Andyknas), что «расширенная регистрация» IIS регистрирует сообщения. Он предлагает вариант для «протоколирования клиента», которая будет войти сообщения определенного вида, но не все сообщения формы, которые ОП кажется быть с просьбой (и мне было интересно , о, я.)
чарли arehart
8

В управляемом коде вы можете использовать метод Response.AppendToLog. Этот метод добавляет данные в поле cs-uri-stem - общая длина составляет до 4100 символов (недокументировано). Если вы превысите этот предел, то значение, которое было бы зарегистрировано, будет заменено на «...»

Например, добавление чего-то вроде этого в файл Global.asax должно помочь (C #):

void Application_EndRequest(Object Sender, EventArgs e)
{
    if( "POST" == Request.HttpMethod )
    {
        byte[] bytes    = Request.BinaryRead(Request.TotalBytes);
        string s    = Encoding.UTF8.GetString(bytes);
        if (!String.IsNullOrEmpty(s))
        {
            int QueryStringLength = 0;
            if (0 < Request.QueryString.Count)
            {
                QueryStringLength = Request.ServerVariables["QUERY_STRING"].Length;
                Response.AppendToLog( "&" );
            }

            if (4100 > ( QueryStringLength + s.Length ) )
            {
                Response.AppendToLog(s);
            }
            else
            {
                // append only the first 4090 the limit is a total of 4100 char.
                Response.AppendToLog(s.Substring(0, ( 4090 - QueryStringLength )));
                // indicate buffer exceeded
                Response.AppendToLog("|||...|||");
                // TODO: if s.Length >; 4000 then log to separate file
            }
        }       
    }
}
 
Джеффри МакГрат
источник
1
На момент написания этого комментария ограничение составляет не 4100, а 4 КБ, что составляет 4096. Поэтому этот код необходимо немного изменить, чтобы правильно регистрировать данные POST> 4 КБ.
Стивен V
1
Мне пришлось добавить HttpContext.Current.Request.InputStream.Position = 0; перед request.BinaryRead, в противном случае он вернул бы пустой массив
alex440
3

Хотя я понимаю, что это старый вопрос, я обнаружил, что этот код дал мне именно то, что мне нужно, текстовый файл с полными заголовками запроса и ответом, поместил его в ваш global.asax.cs:

protected void Application_BeginRequest(Object Sender, EventArgs e)
{
    string uniqueid = DateTime.Now.Ticks.ToString();
    string logfile = String.Format("C:\\path\\to\\folder\\requests\\{0}.txt", uniqueid);
    Request.SaveAs(logfile, true);
}

Это создаст текстовый файл для каждого запроса (включая изображения), поэтому будьте осторожны, когда вы его используете. Я только использовал это, чтобы зарегистрировать определенные почтовые запросы.

Терри Кернан
источник
1

Попробуйте это в своем файле web.config, чтобы отследить все

<tracing>
  <traceFailedRequests>
    <remove path="*" />
    <add path="*">
      <traceAreas>
        <add provider="ASP" verbosity="Verbose" />
        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
        <add provider="ISAPI Extension" verbosity="Verbose" />
        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI,WebSocket,Rewrite" verbosity="Verbose" />
      </traceAreas>
      <failureDefinitions timeTaken="00:00:00" statusCodes="200-999" />
    </add>
  </traceFailedRequests>
</tracing>
DeepSpace101
источник
Но обратите внимание, что функция FRT неявно ограничивает количество файлов журнала, которые она создает (что хорошо), поэтому вам нужно будет изменить это либо в пользовательском интерфейсе, либо через записи файла конфигурации - и с должной осторожностью относитесь к объему журналы, которые будут созданы даже в скромном веб-приложении.
Чарли Арехарт
0

Это выглядит обнадеживающе, хотя я еще не пробовал:

https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log

Чем это отличается от другого варианта, предлагаемого здесь, с кодом в global.asax.cs? Это будет работать только для запросов страниц ASP.NET, а не для других страниц, которые может обрабатывать IIS (php, cgi, jsp, cfml). Ссылка, которой я поделился, - это модуль, который можно включить в IIS для любого сайта (или на уровне сервера) для обработки любого типа запроса.

Чарли Арехарт
источник
-4

Попробуйте включить следующее в настройках журнала IIS:

Метод (CS-метод)

URI Stem (cs-uri-stem)

URI-запрос (cs-uri-query)

joeqwerty
источник
Я пробовал, не помогло ... :(
Budda
3
Эти настройки не будут включать данные POST
грабить