Corps de demande de journal IIS / données POST

33

Est-ce que quelqu'un sait comment je pourrais obtenir IIS pour enregistrer les données POST ou l'intégralité de la requête HTTP?

HopelessN00b
la source
ModSecurity est disponible pour IIS7 + . Cela permettra un accès complet à l'en-tête et au corps de la demande et de la réponse.
user2320464

Réponses:

32

Les journaux IIS enregistrent uniquement les informations de chaîne de requête et d’en-tête sans données POST.

Si vous utilisez IIS7, vous pouvez activer le suivi des demandes ayant échoué pour le code d'état 200. Cela enregistrera toutes les données et vous pourrez sélectionner le type de données à inclure.

Dans IIS6 ou 7, vous pouvez utiliser Application_BeginRequest dans global.asax et créer votre propre journalisation des données POST.

Ou, dans IIS7, vous pouvez écrire un module HTTP avec votre propre journalisation personnalisée.

Scott Forsyth - MVP
la source
+1 - J'aime beaucoup votre réponse, bien meilleure que la mienne. J'ai clairement besoin de lire le suivi des requêtes ayant échoué, car je n'ai évidemment pas utilisé IIS7 autant que je le devais.
Evan Anderson
Comment pouvez-vous "sélectionner le type de données à inclure"?
Pavel Chuchuva
1
La dernière étape de l'assistant lors de la création d'une règle FRT vous permet de sélectionner les données à inclure. Par défaut, tout est inclus.
Scott Forsyth - MVP
Je cherchais quelque chose pour IIS6 mais je suis tombé sur ce lien qui montre que la journalisation avancée est une option supplémentaire pour IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas
Il n'apparaît pas (à partir de cette URL partagée par Andyknas) qu'IIS "enregistrement avancé" enregistre des journaux sous forme de messages. Il offre une option pour la "journalisation client", qui consignera les publications d'un type particulier, mais pas toutes les publications sous forme de formulaire, ce que le PO semble demander (et je me demandais moi-même.)
charlie arehart
8

En code managé, vous pouvez utiliser la méthode Response.AppendToLog. Cette méthode ajoutera des données au champ cs-uri-stem - la longueur totale peut atteindre 4 100 caractères (non documentés). Si vous dépassez cette limite, la valeur qui aurait été enregistrée est remplacée par "..."

Par exemple, ajouter quelque chose comme ceci à votre fichier Global.asax devrait faire l'affaire (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
la source
1
En ce qui concerne ce commentaire, la limite n'est pas 4100, mais 4 Ko, soit 4096. Ce code doit donc être légèrement modifié pour consigner correctement les données POST> 4 Ko.
Steven V
1
Je devais ajouter HttpContext.Current.Request.InputStream.Position = 0; avant request.BinaryRead, sinon il retournerait un tableau vide
alex440
3

Bien que je comprenne que c’est une vieille question, j’ai trouvé que ce code me donnait exactement ce dont j'avais besoin: un fichier texte avec les en-têtes de requête complets et la réponse, mettez-le dans votre 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);
}

Cela créera un fichier texte pour chaque requête (y compris les images), alors soyez prudent lorsque vous l'utilisez. Je ne l'ai utilisé que pour enregistrer des demandes de publication spécifiques.

Terry Kernan
la source
1

Essayez ceci dans votre fichier web.config pour tout tracer

<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
la source
Notez cependant que la fonctionnalité FRT limite implicitement le nombre de fichiers journaux créés (ce qui est une bonne chose). Vous devrez donc le modifier, soit dans l'interface utilisateur, soit via des entrées de fichier de configuration, et avec la prudence requise pour le volume de fichiers. journaux qui seraient créés même dans une application web modeste.
Charlie Arehart
0

Cela semble encourageant, même si je ne l’ai pas encore essayé:

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

En quoi cela diffère-t-il de l'autre option proposée ici, avec du code dans le fichier global.asax.cs? Cela ne fonctionnerait que pour les demandes de page ASP.NET, pas d'autres pages qu'IIS pourrait traiter (php, cgi, jsp, cfml). Le lien que j'ai partagé est un module que l'on pourrait activer dans IIS pour tout site (ou au niveau du serveur) pour traiter tout type de demande.

Charlie Arehart
la source
-4

Essayez d'activer les éléments suivants dans vos paramètres de journal IIS:

Méthode (cs-method)

Tige URI (cs-uri-stem)

Requête URI (cs-uri-query)

joeqwerty
la source
J'ai essayé, je n'ai pas aidé ... :(
Budda
3
Ces paramètres ne comprendront pas les données POST
Rob