6
votes

MVC Voir l'entrée qui a provoqué une exception

À l'occasion, nous obtenons des robots qui aiment poster de mauvaises informations sur notre site Web (ils tentent une sorte d'attaque de réflexion) mais la chance pour nous, les tentatives sont arrêtées via la validation d'entrée par défaut que l'on obtient avec MVC.

C'est bien et tout, mais maintenant, nous voulons voir ce que les robots envoient et nous souhaitons enregistrer cette information. Malheureusement, quand on obtient et httpRequestvalidationException code>, l'entrée incriminée est tronquée au point d'être inutile ala; p>

potentiellement dangereux .... (champ = p>

J'essaie d'utiliser un filtre d'action pour détecter ces exceptions, puis créer un journal de toutes les entrées incriminées afin que nous puissions voir ce qu'ils sont Essayer d'envoyer. P>

public void OnException(ExceptionContext filterContext)
{

    HttpRequestValidationException hex = filterContext.Exception as HttpRequestValidationException;
    if (hex == null) { return; }

    // Get the data.  This will explode throwing the same exception (`HttpRequestValidationException).  Isn't there a way that we can get our hands on the information?

    string data = filterContext.HttpContext.Request.Form["field"];

....


0 commentaires

3 Réponses :


5
votes

Oui, vous pouvez. Utilisez httpRequest.Saveas pour enregistrer la requête HTTP entière (tampon) sur le disque, que vous pouvez ensuite lire-retour.


0 commentaires

-1
votes

Le problème est que invoquant réellement demande.form fera le feu de validation (à nouveau). J'utiliserais demande.inputtream directement, puis. Vous devrez peut-être rembobiner le flux avant de la lire à nouveau:

demande.inputtream.position = 0


2 commentaires

Oui, c'est pourquoi j'utilise un filtre d'action pour mettre mes mains à l'exception, comme le montre le code. Votre suggestion ne fait rien pour m'aider avec le problème réel.


Désolé, lisez-le un peu trop vite. Le problème est que, invoquant réellement demande.form fera le feu de validation (à nouveau). J'utiliserais demande.inputtream directement, puis.



0
votes

Voici la solution finale que j'ai proposée. Fonctionne comme un charme et ne nécessite pas d'interaction des systèmes de fichiers.

   // Grab the contents of the request.
   Stream s = filterContext.RequestContext.HttpContext.Request.InputStream;
   byte[] data = new byte[s.Length];
   s.Read(data, 0, (int)s.Length);
   string rawData = Encoding.UTF8.GetString(data);

   // And process it into something nice and readable.
   IEnumerable<string> fields = (from x in rawData.Split('&') select  HttpUtility.UrlDecode(x));
   string formatted = string.Join(Environment.NewLine, fields);


2 commentaires

Surveillez, vous n'êtes pas disposé au InputStream après l'avoir terminé.


Je ne crée pas ou ne possède pas le flux alors pourquoi je le disposerais-je?