46 votes

IIS Journal Corps de la requête / Données POST

Quelqu'un sait-il comment je pourrais faire en sorte que IIS enregistre les données POST ou la requête HTTP entière?

0 votes

ModSecurity est disponible pour IIS7+. Il permettra un accès complet à l'en-tête et au corps à la fois de la requête et de la réponse.

43voto

rmukhopadhyay Points 243

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

Si vous utilisez IIS7, vous pouvez activer la traçabilité des requêtes échouées 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.

0 votes

+1 - J'aime beaucoup plus votre réponse que la mienne. Il est clair que j'ai besoin de me renseigner sur le suivi des demandes échouées, puisque je n'ai évidemment pas utilisé IIS7 autant que je le devrais.

0 votes

Comment pouvez-vous "sélectionner quel type de données inclure"?

1 votes

Le dernier pas de l'assistant lors de la création d'une règle FRT vous permet de sélectionner quelles données inclure. Il est par défaut configuré pour inclure tout.

10voto

Geoffrey McGrath Points 101

Dans le code géré, vous pouvez utiliser la méthode Response.AppendToLog.  Cette méthode ajoutera des données au champ cs-uri-stem -- la longueur totale peut aller jusqu'à 4100 caractères (non documentée).  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 fonctionner (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 votes

Au moment de ce commentaire, la limite n'est pas de 4100, c'est 4 Ko, soit 4096. Ainsi, ce code doit être légèrement modifié pour enregistrer correctement les données POST supérieures à 4 Ko.

2 votes

J'ai dû ajouter HttpContext.Current.Request.InputStream.Position = 0; avant request.BinaryRead, sinon il renverrait un tableau vide.

0 votes

En utilisant Application_BeginRequest, cela fonctionne également sans avoir à définir InputStream.Position=0

5voto

Phoenix Analyst Points 31

Alors que j'apprécie que cette soit 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 complètes 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:\\chemin\\vers\\dossier\\requetes\\{0}.txt", uniqueid);
    Request.SaveAs(logfile, true);
}

Cela va créer un fichier texte pour chaque requête (y compris les images) donc faites attention où vous l'utilisez. Je l'ai seulement utilisé pour enregistrer des requêtes post spécifiques.

2voto

DeepSpace101 Points 698

Essayez ceci dans votre fichier web.config pour tracer tout

0 votes

Mais notez que la fonction FRT limite implicitement le nombre de fichiers journaux qu'elle crée (ce qui est une bonne chose), donc vous devriez changer cela, soit dans l'interface utilisateur soit via des entrées de fichier de configuration - et en prenant soin du volume de journaux qui serait créé même pour une application web modeste.

0voto

Marcos Bento Points 539

Cela semble encourageant, bien que 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 global.asax.cs ? Cela ne fonctionnerait que pour les requêtes de pages ASP.NET, pas pour les autres pages qu'IIS pourrait traiter (php, cgi, jsp, cfml). Le lien que j'ai partagé est pour un module que l'on pourrait activer dans IIS pour n'importe quel site (ou au niveau du serveur) pour traiter tout type de demande.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X