2010-09-27 28 views
5

Tengo un sitio ASP.NET 4 en el que quiero permitir que las personas pongan '<' en su contraseña. Sin embargo, .NET se interpone bloqueando (lo que ve como) un intento de poner HTML en un campo de formulario. Sé que puedo desactivar la validación de entrada por completo, pero solo quiero desactivarlo para este campo. ¿Alguien sabe una manera fácil de hacer eso?Desactivar validación de entrada para un solo campo

+0

¿Hay alguna razón especial que necesita

+9

@ eddy556 - ¿necesita una razón especial? – Oded

+0

@Oded - Claro que sí, puedo entender las ventajas de tener un personaje extra, pero si eso es cierto, ¿por qué solo quiere permitir viene a la mente. –

Respuesta

0

Solo puede desactivar la validación de entrada para toda la página. La única solución que se me ocurre es desactivar la validación de entrada y luego eliminar todos los demás campos de entrada (sin contraseña) usando algo como Anti-XSS.

+0

Gracias por señalar un enlace sin citar el ejemplo. Enlace muerto ahora –

+1

No es un ejemplo, era un enlace a una biblioteca que proporciona funcionalidad anti-xss. Ahora en https://www.nuget.org/packages/AntiXSS/4.3.0. –

+0

Bien, lo siento, pero ahora no puedo deshacer mi voto negativo. ¿Podrías editar tu publicación con el nuevo enlace para poder hacerlo? –

0

Puede desactivar la validación de entrada para la acción MVC con el ValidateInputAttribute. Como solo acepta el nombre de usuario/contraseña (supongo), debería poder eliminar la entrada de los caracteres no válidos. Use el Microsoft Web Protection Library para hacer eso.

+0

Esto es Webforms, no MVC, y yo tener muchas entradas en esta página. De lo contrario, eso funcionaría genial :) – eliah

+1

Mah mal. Existe una propiedad ValidateRequest en la directiva @Page que puede usar para desactivar la validación solo para esa página en particular, pero creo que es lo más detallada que puede obtener. –

0

Nota en ASP.NET 4 y superior para obtener ValidateRequest en la directiva @Page para que funcione, debe agregar <httpRuntime requestValidationMode="2.0" /> a web.config. Ver esta página para obtener más información: http://www.asp.net/whitepapers/aspnet4/breaking-changes

Pero esta es mi enfoque preferido:

namespace Controls 
{ 
    public class HtmlTextBox : TextBox 
    { 
     protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection) 
     { 
      bool res = base.LoadPostData(postDataKey, postCollection); 
      Text = Text.Replace("&lt;", "<").Replace("&gt;", ">").Replace("&amp;", "&"); 
      return res; 
     } 

     protected override void OnPreRender(EventArgs e) 
     { 
      base.OnPreRender(e); 

      ScriptManager.RegisterOnSubmitStatement(this, this.GetType(), "htmlTextBox" + UniqueID, "try { var item = document.getElementsByName('" + UniqueID + "')[0]; item.value = item.value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); } catch (err) {}"); 
     } 
    } 
} 

Y luego registrar el control en web.config:

<system.web> 
    <pages> 
    <controls> 
     <add tagPrefix="uc1" namespace="Controls" /> 
    </controls> 
    </pages> 
</system.web> 

De esta manera sólo se puede utilizar <uc1:HtmlTextBox runat="server" /> si desea permitir que el cuadro de texto publique html, pero otros controles en la página seguirán bloqueados de publicar html a diferencia del enfoque de desactivar ValidateRequest.

1

Esto es ahora posible con .NET 4.5.

actualización de su Web.config:

<httpRuntime targetFramework="4.5" requestValidationMode="4.5" /> 

A continuación, establezca ValidateRequestMode="Disabled" en sus controles de contraseñas:

<asp:YourControl id="YourControl" runat="server" ValidateRequestMode="Disabled"/> 

Nota - después de actualizar web.config, usted podría encontrarse con el error WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping for 'jquery'. Ver ASP.Net 2012 Unobtrusive Validation with jQuery de más información sobre eso.

Más información sobre RequestValidationMode 4.5: requestValidationMode 4.5 vs 2.0

Cuestiones relacionadas