Frage IIS-Protokollanforderungshauptteil / POST-Daten


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


29
2017-12-04 02:22


Ursprung


ModSecurity ist für IIS7 + verfügbar. Es ermöglicht den vollständigen Zugriff auf den Header und den Hauptteil der Anforderung und der Antwort. - user2320464


Antworten:


Die IIS-Protokolle zeichnen nur Querystring- und Header-Informationen ohne POST-Daten auf.

Wenn Sie IIS7 verwenden, können Sie die Ablaufverfolgung für fehlgeschlagene Anforderungen für den Statuscode 200 aktivieren. Dadurch werden alle Daten aufgezeichnet, und Sie können auswählen, welche Art von Daten einbezogen werden sollen.

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

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


29
2017-12-04 04:34



+1 - Ich mag deine Antwort weit, viel besser als meine eigene. Ich muss unbedingt über die Verfolgung fehlgeschlagener Anfragen nachlesen, da ich IIS7 offensichtlich nicht so oft benutzt habe, wie ich sollte. - Evan Anderson
Wie können Sie auswählen, um welche Art von Daten es sich handelt? - Pavel Chuchuva
Im letzten Schritt des Assistenten beim Erstellen einer FRT-Regel können Sie auswählen, welche Daten einbezogen werden sollen. Es enthält standardmäßig alles. - Scott Forsyth - MVP
Ich suchte nach etwas für IIS6, stieß aber auf diesen Link, der zeigt, dass erweiterte Protokollierung eine Add-on-Option für IIS7 ist. iis.net/learn/extensions/advanced-logging-module/... - andyknas


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 dieses Limit überschreiten, wird der Wert, der protokolliert werden würde, durch "..." ersetzt.

Wenn Sie beispielsweise etwas zu Ihrer Global.asax-Datei hinzufügen, sollten Sie den Trick (C #) ausführen:

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

8
2018-02-27 21:02



Ab diesem Kommentar ist das Limit nicht 4100, es ist 4KB, was 4096 ist. Also muss dieser Code leicht modifiziert werden, um POST-Daten> 4KB korrekt zu protokollieren. - Steven V
Ich musste hinzufügen HttpContext.Current.Request.InputStream.Position = 0; vor request.BinaryRead, andernfalls würde es leeres Array zurückgeben - alex440


Während ich weiß, dass dies eine alte Frage ist, fand ich, dass dieser Code mir genau das gab, was ich brauchte, eine Textdatei mit den vollständigen Anforderungsheadern und der Antwort, die ich in Ihre global.asax.cs schreiben konnte:

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

Dies erstellt eine Textdatei für jede Anfrage (einschließlich Bilder), also sei vorsichtig, wo du sie benutzt. Ich habe es nur verwendet, um bestimmte Postanfragen zu protokollieren.


3
2017-12-14 09:48





Probieren Sie dies in Ihrer Datei web.config aus, 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>

0
2017-09-02 23:18





Versuchen Sie Folgendes in Ihren IIS-Protokolleinstellungen zu aktivieren:

Methode (cs-Methode)

URI-Stamm (cs-uri-stem)

URI-Abfrage (cs-uri-query)


-3
2017-12-04 02:41



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