2012-01-10 8 views
10

Tengo una página ASP.Net MVC 3 en la que tengo un control Html.TextAreaPara ver el código a continuación. Si trato de enviar la página a la acción HTTP POST con el texto entre corchetes angulares como: <test>, aparece una pantalla de error de color amarillo que dice: Se ha detectadoHtmlEncode on Post para ASP.Net MVC 3 Html.TextAreaPara

Un valor Request.Form potencialmente peligroso desde el cliente (RequestText = "").

No entiendo por qué estoy haciendo esto porque me encontré an article by Scott Guthrie que dice la nueva sintaxis <%: %> en .Net 4, serán automáticamente HtmlEncode el elemento. Dado que estoy usando la sintaxis <%:%> para el control Html.TextAreaFor, pensé que se ocuparía automáticamente de esto y convertiría los corchetes angulares en el correcto "& lt"; y "& gt" strings.

<% using (Html.BeginForm()) 
    { %> 
    <%: Html.ValidationSummary() %> 
    <h2>Enter a description of the support needed</h2> 
    <%: Html.TextAreaFor(m => m.RequestText, 4, 90, null) %> 
    <input type="submit" value="Submit" /> 
<% } %> 

Respuesta

18

Básicamente en este momento, estás codifica el contenido de la TextAreaFor en la salida . Esto no le ayuda en lo más mínimo, ya que estamos tratando de hacer frente a la entrada

Si desea enviar contenido "potencialmente peligrosa", es necesario o bien

1) decorar la propiedad dentro de RequestText su ViewModel con [AllowHtml]. (Preferido)

[AllowHtml] 
public string RequestText { get; set; } 

2) desactivar validateRequest

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <httpRuntime requestValidationMode="2.0" /> 
</system.web> 

Entonces debe asegurarse de que está desinfectar adecuadamente que los datos y/o codificarlo en su controlador antes de enviarlo a su capa de repositorio o Base de datos.

+0

Chase - Prefiero no usar el [AllowHtml], ¿no hay una forma de que el .net framework html codifique el texto para mí cuando publique nuevamente en la acción del controlador? –

+1

Lo codifica manualmente en el controlador. Es la capa de datos a la que no desea que se publiquen los datos no codificados. Tienes que manejar esto en el nivel del controlador. –

+0

Básicamente, HTML no puede codificar datos para usted. Puede usar Javascript, pero eso es malo simplemente porque pueden desactivar JS. La única manera segura de hacerlo es a nivel del servidor y no del cliente. –

6

Usted puede decorar su propiedad RequestText en el modelo de vista con el AllowHtmlAttribute:

[AllowHtml] 
public string RequestText { get; set; } 

De esta manera se autoriza al cliente a presentar HTML para esta propiedad única.

En lo que se refiere a la sintaxis <%: %>, esto se utiliza para codificar algún valor en HTML antes de enviarlo a la página. Se usa para proteger contra ataques XSS. Es irrelevante en su caso porque no está enviando a la página, está recibiendo caracteres HTML en una solicitud.

+0

¿Necesitamos usar '@ Html.Raw (model.RequestText)'? o el marco MVC interno se ocupará de la representación? –

+0

Si el atributo AllowHtml correcto no permite que exista en texto html. ¿Tienes una idea? – QMaster