ValidateRequest = "false" no funciona en Asp.Net 4

156

Tengo un formulario en el que uso ckeditor. Este formulario funcionó bien en Asp.Net 2.0 y 3.5, pero ahora no funciona en Asp.Net 4+. Tengo la directiva ValidateRequest = "false". ¿Alguna sugerencia?

HasanG
fuente
Hay un breve artículo sobre cómo representar los controles de validación correctamente si a alguien le importa: Validación de errores en .NET 4
Ian
¿Alguien puede decirme cuáles son los inconvenientes de usar ValidationRequest = false?
fc123

Respuestas:

194

Solución encontrada en la página de error. Solo necesitaba agregar requestValidationMode = "2.0"

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

Información de MSDN: Propiedad HttpRuntimeSection.RequestValidationMode

HasanG
fuente
1
eso es increíble, pero ¿alguien sabe de una manera de configurar esto por página? Además, ¿cómo pongo esto en web.config para que todavía funcione con .NET 2?
MK.
1
@MK: No creo que haya una directiva de página para esta configuración. No puede hacer que se ejecute en .net 2. No creo que sea necesario. Porque solo puede crear una aplicación web dirigida solo a una versión de marco. Simplemente copie esta línea a .net 4 web.config que lo necesita ...
HasanG
2
Pero, ¿qué ha cambiado en la validación para .net 4? ¿Hay alguna manera de hacerlo sin cambiar el modo de validación?
Sly
44
@Sly: Puede encontrar la respuesta aquí: asp.net/learn/whitepapers/aspnet4/…
HasanG
¿alguien puede decirme por qué en la aplicación asp.net 4.0 usar requestValidationMode = "2.0" es una buena idea?
fc123
102

Hay una manera de volver la validación a 2.0 para una página. Simplemente agregue el siguiente código a su web.config:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>
Ben Hoffman
fuente
La ubicación es cualquier ruta y se basa en cualquier nodo debajo de la carpeta que especifique en el árbol.
DFTR
77
Esta es una mejor solución que la respuesta aceptada porque no es una aplicación amplia sino más bien limitada al alcance específico que usted define en la ruta de ubicación
Charles Wesley
55
La declaración <location ..> anterior debe colocarse dentro de la declaración <configuration> pero no anidarse más.
rbassett
1
La configuración por página no parece funcionar para proyectos dirigidos a .NET 4.6.1.
Dennis T --Reinstate Monica--
56

Sé que esto es una vieja pregunta, pero si se encuentra con este problema en MVC 3 a continuación, se puede decorar su ActionMethodcon [ValidateInput(false)]y simplemente apagar la validación de solicitudes para una sola ActionMethod, que es práctico. Y no necesita realizar ningún cambio en el web.configarchivo, por lo que aún puede usar la validación de solicitud de .NET 4 en cualquier otro lugar.

p.ej

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}
Tom Chantler
fuente
1
@RossCooper esto es solo para asp.net MVC
mxmissile
28

Esto funciona sin cambiar el modo de validación.

Tienes que usar un System.Web.Helpers.Validation.Unvalidatedayudante de System.Web.WebPages.dll. Va a devolver un UnvalidatedRequestValuesobjeto que permite acceder al formulario y a QueryString sin validación.

Por ejemplo,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

Funciona para mí para MVC3 y .NET 4.

Asesino
fuente
1
¿Puede proporcionar un ejemplo de cómo recuperar un queryString con este método? Sigo recibiendo 'No validado no es miembro de ...' todos los objetos a los que trato de agregarlo. Creo que podría estar perdiendo una inclusión
CodedMonkey
3
var queryValue = Server.UrlDecode (Request.Unvalidated ("MyQueryKey"));
sfuqua
1
Esta definitivamente debería ser la respuesta aceptada. Mantiene la seguridad y es extremadamente flexible, ya que puede usarlo de forma selectiva.
cmartin
Para los formularios web, debe reemplazar la entrada en la colección QueryString para evitar un error de validación; consulte Un valor potencialmente peligroso de Request.QueryString se detectó desde el cliente al enviar marcado html desde la llamada posterior de jquery a la página asp.net
Michael Freidgeim
15

Tenga en cuenta que otro enfoque es mantenerse con el comportamiento de validación 4.0, pero definir su propia clase que se deriva RequestValidatory establece:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(donde YourNamespace.YourValidatorestá bien, deberías poder adivinar ...)

De esta manera, mantiene las ventajas del comportamiento 4.0s (específicamente, que la validación ocurre antes en el procesamiento), al tiempo que permite las solicitudes que debe dejar pasar.

Jon Hanna
fuente
77
Esto es bueno saberlo. Pero sigo pensando que toda la función de validación de solicitudes de ASP.Net está equivocada. La entrada en sí no es el problema, es lo que haces con ella. Puede ser perfectamente válido aceptar código SQL, HTML o JavaScript como entrada a su aplicación, siempre que lo esté codificando / escapando correctamente antes de generarlo o almacenarlo en su base de datos.
Jordan Rieger
2
@JordanRieger Estoy parcialmente de acuerdo. OOTB, al menos tiene la ventaja de tener el valor predeterminado de seguridad (no pienses las cosas y obtienes errores, en lugar de 0wned), pero es un poco molesto y el comportamiento anterior a 4.0 es todo o nada. Hay algo en la capacidad de tener una capa de validación que se usa antes de cualquier otro procesamiento, como con un requestValidationType personalizado, pero mucha validación debe estar más vinculada con otro procesamiento. En general, creo que hace más para proteger a las personas con malos hábitos de algunas divisiones (pero no todas) que para fomentar los buenos hábitos.
Jon Hanna