Dane treści dziennika / żądania POST w dzienniku IIS

33

Czy ktoś wie, jak mogę zmusić IIS do rejestrowania danych POST lub całego żądania HTTP?

Beznadziejny
źródło
ModSecurity jest dostępny dla IIS7 + . Umożliwi to pełny dostęp do nagłówka i treści żądania i odpowiedzi.
user2320464

Odpowiedzi:

32

Dzienniki IIS rejestrują tylko kwerendę i informacje nagłówkowe bez żadnych danych POST.

Jeśli używasz usług IIS7, możesz włączyć śledzenie nieudanych żądań dla kodu stanu 200. Spowoduje to zarejestrowanie wszystkich danych i możesz wybrać, który typ danych ma zostać uwzględniony.

W IIS6 lub 7 możesz użyć Application_BeginRequest w global.asax i stworzyć własne rejestrowanie danych POST.

Lub w IIS7 możesz napisać moduł HTTP z własnym logowaniem niestandardowym.

Scott Forsyth - MVP
źródło
+1 - podoba mi się twoja odpowiedź, znacznie lepsza niż moja. Oczywiście muszę czytać informacje o nieudanym śledzeniu żądań, ponieważ oczywiście nie używałem IIS7 tak często, jak powinienem.
Evan Anderson,
Jak „wybrać typ danych do uwzględnienia”?
Pavel Chuchuva
1
Ostatni krok kreatora podczas tworzenia reguły FRT pozwala wybrać dane do uwzględnienia. Domyślnie obejmuje wszystko.
Scott Forsyth - MVP
Szukałem czegoś do IIS6, ale natknąłem się na ten link, który pokazuje, że zaawansowane rejestrowanie to opcja dodatkowa dla IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas
Nie wydaje się (z tego adresu udostępnionego przez Andyknas), że dzienniki „zaawansowane rejestrowanie” IIS tworzą posty. Oferuje opcję „rejestrowania klienta”, która rejestrowałaby posty określonego rodzaju, ale nie wszystkie posty z formularzy, o które OP wydaje się prosić (a ja się nad tym zastanawiałem).
charlie arehart
8

W kodzie zarządzanym można użyć metody Response.AppendToLog. Ta metoda doda dane do pola cs-uri-stem - całkowita długość wynosi do 4100 znaków (nieudokumentowane). Jeśli przekroczysz ten limit, wówczas zarejestrowana wartość zostanie zastąpiona przez „...”

Na przykład dodanie czegoś takiego do pliku Global.asax powinno załatwić sprawę (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
            }
        }       
    }
}
 
Geoffrey McGrath
źródło
1
W tym komentarzu limit nie wynosi 4100, to 4KB, który wynosi 4096. Więc ten kod musi zostać nieco zmodyfikowany, aby poprawnie rejestrować dane POST> 4KB.
Steven V
1
Musiałem dodać HttpContext.Current.Request.InputStream.Position = 0; przed request.BinaryRead, w przeciwnym razie zwróci pustą tablicę
alex440
3

Doceniam to stare pytanie, ale okazało się, że ten kod dał mi dokładnie to, czego potrzebowałem, plik tekstowy z kompletnymi nagłówkami żądań i odpowiedzią, umieść go w pliku 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);
}

Spowoduje to utworzenie pliku tekstowego dla każdego żądania (w tym obrazów), więc bądź ostrożny tam, gdzie go używasz. Użyłem go tylko do rejestrowania konkretnych postów.

Terry Kernan
źródło
1

Wypróbuj to w pliku web.config, aby śledzić wszystko

<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
źródło
Należy jednak pamiętać, że funkcja FRT domyślnie ogranicza liczbę tworzonych plików dziennika (co jest dobrą rzeczą), dlatego należy to zmienić w interfejsie użytkownika lub za pomocą wpisów w pliku konfiguracyjnym - z zachowaniem ostrożności dzienniki, które zostałyby utworzone nawet w skromnej aplikacji internetowej.
charlie arehart
0

Wygląda zachęcająco, chociaż jeszcze tego nie próbowałem:

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

Czym różni się to od innej oferowanej tutaj opcji, z kodem w pliku global.asax.cs? Działa to tylko w przypadku żądań stron ASP.NET, a nie innych stron, które IIS może przetwarzać (php, cgi, jsp, cfml). Łącze, które udostępniłem, jest modułem, który można włączyć w IIS dla dowolnej witryny (lub na poziomie serwera) w celu przetworzenia dowolnego typu żądania.

Charlie Arehart
źródło
-4

Spróbuj włączyć następujące ustawienia w ustawieniach dziennika IIS:

Metoda (metoda cs)

Trzonek URI (cs-uri-stem)

Zapytanie URI (cs-uri-query)

joeqwerty
źródło
Próbowałem, nie pomogłem ... :(
Budda,
3
Te ustawienia nie będą zawierać danych POST
rob