IIS-Protokollanforderungstext / POST-Daten

33

Weiß jemand, wie ich IIS veranlassen könnte, POST-Daten oder die gesamte HTTP-Anforderung zu protokollieren?

HopelessN00b
quelle
ModSecurity ist für IIS7 + verfügbar . Sie ermöglicht den vollständigen Zugriff auf den Header und den Hauptteil von Anforderung und Antwort.
user2320464

Antworten:

32

Die IIS-Protokolle zeichnen nur Abfrage- und Headerinformationen ohne POST-Daten auf.

Wenn Sie IIS7 verwenden, können Sie die Ablaufverfolgung fehlgeschlagener Anforderungen für Statuscode 200 aktivieren. Dadurch werden alle Daten aufgezeichnet, und Sie können auswählen, welcher Datentyp einbezogen werden soll.

In IIS6 oder 7 können Sie Application_BeginRequest in global.asax verwenden und Ihre eigene Protokollierung von POST-Daten erstellen.

In IIS7 können Sie auch ein HTTP-Modul mit Ihrer eigenen benutzerdefinierten Protokollierung schreiben.

Scott Forsyth - MVP
quelle
+1 - Ihre Antwort gefällt mir weitaus besser als meine. Ich muss mich unbedingt über das Tracing fehlgeschlagener Anfragen informieren, da ich IIS7 offensichtlich nicht so oft verwendet habe, wie ich sollte.
Evan Anderson
Wie können Sie "auswählen, welcher Datentyp einbezogen werden soll"?
Pavel Chuchuva
1
Im letzten Schritt des Assistenten beim Erstellen einer FRT-Regel können Sie auswählen, welche Daten einbezogen werden sollen. Standardmäßig wird alles eingeschlossen.
Scott Forsyth - MVP
Ich habe nach etwas für IIS6 gesucht, bin aber auf diesen Link gestoßen, der zeigt, dass die erweiterte Protokollierung eine Zusatzoption für IIS7 ist. iis.net/learn/extensions/advanced-logging-module/…
andyknas
Es sieht nicht so aus (von dieser URL aus, die Andyknas geteilt hat), dass die "erweiterte Protokollierung" von IIS-Protokollen aus Posts erfolgt. Es bietet eine Option für die "Client-Protokollierung", die zwar Posts einer bestimmten Art protokolliert, jedoch nicht alle Form-Posts, die das OP anscheinend anfordert (und ich habe mich gefragt).
charlie arehart
8

In verwaltetem Code können Sie die Response.AppendToLog-Methode verwenden. Diese Methode hängt Daten an das Feld cs-uri-stem an - die Gesamtlänge beträgt bis zu 4100 Zeichen (undokumentiert). Wenn Sie diesen Grenzwert überschreiten, wird der Wert, der protokolliert worden wäre, durch "..." ersetzt.

Wenn Sie Ihrer Datei "Global.asax" beispielsweise etwas Ähnliches hinzufügen, reicht das aus (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
quelle
1
In diesem Kommentar liegt das Limit nicht bei 4100, sondern bei 4 KB (4096). Daher muss dieser Code leicht geändert werden, um POST-Daten> 4 KB korrekt zu protokollieren.
Steven V
1
Ich musste HttpContext.Current.Request.InputStream.Position = 0 hinzufügen; vor request.BinaryRead, sonst würde es leeres Array zurückgeben
alex440
3

Obwohl ich zu schätzen weiß, dass dies eine alte Frage ist, fand ich, dass dieser Code mir genau das gab, was ich brauchte:

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);
}

Dadurch wird für jede Anfrage eine Textdatei erstellt (einschließlich Bilder). Seien Sie also vorsichtig, wo Sie sie verwenden. Ich habe es nur verwendet, um bestimmte Post-Anfragen zu protokollieren.

Terry Kernan
quelle
1

Versuchen Sie dies in Ihrer web.config-Datei, um alles zu verfolgen

<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
quelle
Beachten Sie jedoch, dass die FRT-Funktion implizit die Anzahl der von ihr erstellten Protokolldateien begrenzt (was eine gute Sache ist), sodass Sie dies entweder in der Benutzeroberfläche oder über Einträge in der Konfigurationsdatei ändern müssen - und zwar mit der gebotenen Vorsicht für das Volumen von Protokolle, die selbst in einer bescheidenen Web-App erstellt würden.
Charlie Arehart
0

Das sieht ermutigend aus, obwohl ich es noch nicht ausprobiert habe:

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

Wie unterscheidet sich dies von der anderen hier angebotenen Option mit Code in der Datei global.asax.cs? Dies funktioniert nur für ASP.NET-Seitenanforderungen, nicht für andere Seiten, die IIS möglicherweise verarbeitet (PHP, CGI, JSP, CFML). Der Link, den ich freigegeben habe, bezieht sich auf ein Modul, das in IIS für jeden Standort (oder auf Serverebene) zur Verarbeitung für jede Art von Anforderung aktiviert werden kann.

Charlie Arehart
quelle
-4

Versuchen Sie, Folgendes in Ihren IIS-Protokolleinstellungen zu aktivieren:

Methode (cs-Methode)

URI-Stamm (cs-Uri-Stamm)

URI-Abfrage (cs-uri-query)

Joeqwerty
quelle
Ich habe es versucht, habe nicht geholfen ... :(
Budda
3
Diese Einstellungen enthalten keine POST-Daten
rob