2010-04-19 2 views
0

Je reçois beaucoup d'erreurs pour HttpRequestValidationException dans mon journal des événements.Modifier HttpContext.Request.InputStream

Est-il possible de HTMLEncode toutes les entrées de override de ProcessRequest sur la page Web. J'ai essayé ceci mais cela donne context.Request.InputStream.CanWrite == false toujours.

Existe-t-il un moyen de HTMLEncode toutes les feilds lorsque la demande est faite?

public override void ProcessRequest(HttpContext context) 
      { 
       if (context.Request.InputStream.CanRead) 
       { 
        IEnumerator en = HttpContext.Current.Request.Form.GetEnumerator(); 
        while (en.MoveNext()) 
        { 
         //Response.Write(Server.HtmlEncode(en.Current + " = " + 
         //HttpContext.Current.Request.Form[(string)en.Current])); 
        } 

        long nLen = context.Request.InputStream.Length; 
        if (nLen > 0) 
        { 
         string strInputStream = string.Empty; 

         context.Request.InputStream.Position = 0; 
         byte[] bytes = new byte[nLen]; 
         context.Request.InputStream.Read(bytes, 0, Convert.ToInt32(nLen)); 
         strInputStream = Encoding.Default.GetString(bytes); 
         if (!string.IsNullOrEmpty(strInputStream)) 
         { 
          List<string> stream = strInputStream.Split('&').ToList<string>(); 
          Dictionary<int, string> data = new Dictionary<int, string>(); 
          if (stream != null && stream.Count > 0) 
          { 
           int index = 0; 
           foreach (string str in stream) 
           { 
            if (str.Length > 3 && str.Substring(0, 3) == "txt") 
            { 
             string textBoxData = str; 
             string temp = Server.HtmlEncode(str); 
             //stream[index] = temp; 
             data.Add(index, temp); 
             index++; 
            } 
           } 

           if (data.Count > 0) 
           { 
            List<string> streamNew = stream; 
            foreach (KeyValuePair<int, string> kvp in data) 
            { 
             streamNew[kvp.Key] = kvp.Value; 
            } 

            string newStream = string.Join("", streamNew.ToArray()); 

            byte[] bytesNew = Encoding.Default.GetBytes(newStream); 

            if (context.Request.InputStream.CanWrite) 
            { 

             context.Request.InputStream.Flush(); 
             context.Request.InputStream.Position = 0; 
             context.Request.InputStream.Write(bytesNew, 0, bytesNew.Length); 
             //Request.InputStream.Close(); 
             //Request.InputStream.Dispose(); 
            } 
           } 
          } 
         } 
        } 
       } 


       base.ProcessRequest(context); 
      } 

Répondre

0

Vous devez valider la propriété validateRequest = false et effectuer manuellement les validations nécessaires sur l'entrée de l'utilisateur.

<%@ Page language="c#" validateRequest="false" Codebehind="TestForm.aspx.cs" AutoEventWireup="false" Inherits="TestForm" %>

+0

Oui je peux le faire, mais je l'ai lu en ligne ce n'est pas très sûr. Si, dans certains cas, j'ai oublié de valider manuellement l'entrée, cela peut poser un problème de sécurité potentiel. – user320478

+2

Afaik validateRequest ne fournit aucune garantie de sécurité - il essaie simplement de détecter les tentatives d'abus les plus flagrantes. Vous devriez utiliser quelque chose comme AntiForgeryToken avec AntiXSS pour obtenir une protection réelle. Vous pouvez déployer AntiXSS pour travailler sur l'ensemble du site, donc vous pourriez vouloir google cela (je ne peux pas vous aider mais l'information est disponible;) –

+0

Je ne pense pas que validateRequest = true soit très utile, il génère juste une exception que vous ne pouvez pas gérer, l'application vient de sauter, donc à mon humble avis, vous devez utiliser un composant tiers pour valider votre entrée. Beaucoup plus flexible. –