ASP.NET MVC ValidateInput (false) smette di funzionare con xVal e [RegularExpression] DataAnnotation
-
10-07-2019 - |
Domanda
Vorrei intercettare il " < " carattere nel campo modulo da un validatore regex. Descriverò il problema in 3 passaggi:
Passaggio 1 : quando provo a inviare un modulo con un campo contenente il " < " carattere, ottengo il " Richiesta potenzialmente pericolosa ... " - come previsto in ASP.NET.
Passaggio 2 : per evitare RequestValidation di ASP.NET, decoro il mio metodo di aggiornamento nel controller con " [ValidateInput (false)] " ;.
Funziona come previsto - ora posso pubblicare " < " carattere senza errori.
Passaggio 3 : utilizzo xVal con DataAnnotations. Ad esempio, [Obbligatorio] o [StringLength (255)] funziona come previsto.
MA quando uso: [RegularExpression (& Quot; ^ [^ & Lt; & Gt;] * $ & Quot ;, ErrorMessage = & Quot; Non sono ammessi caratteri speciali. ")], Ottengo il " Richiesta potenzialmente pericolosa ... " errore di nuovo , nonostante la direttiva [ValidateInput (false)].
Cosa sta succedendo? Esiste un modo più semplice per regex validaton, ma con [ValidateInput (false)] in atto? Certo, mi piacerebbe avere il mio codice di convalida nel modello, non nel controller.
Soluzione
No, si è verificato un problema in MVC 1 + xVal. In MVC 2 la validazione funziona come supposto (e non è necessario per xVal più) & # 8211; Alex42
Sembra che il bot continui a spingere questo verso l'alto ancora. Potresti contrassegnare una risposta come accettata in modo che sappia?
Altri suggerimenti
Sto usando xVal & amp; Io e nhibernate.validator abbiamo provato a riprodurre questo comportamento ma poiché il validatore è legato al lato client non ho potuto ottenere un valore oltre la convalida lato client. quando ho disabilitato JavaScript, è arrivato alla convalida lato server ed è stato catturato dal validatore di espressioni regolari.
Ho provato la stessa cosa usando gli attributi di convalida delle annotazioni dei dati e il raccoglitore di modelli e anche questo ha superato.
ci deve essere qualcos'altro che sta causando l'errore. Spiacente, non potrei essere più utile!
Prova a convalidare usando una semplice regola con questo metodo . Questo può almeno eliminare xVal dall'equazione. Se il problema persiste, suggerirei che è correlato a:
- l'implementazione del Model Binder predefinito di MVC
- o c'è un problema con il motore di visualizzazione MVC nella versione che stai usando, che in qualche modo consente di fare un'eccezione per l'attributo specificato convalidando
<
quando non dovrebbe essere
se è solo un campo, potresti semplicemente scrivere una routine per cercare un carattere '< o > ' e rimuoverlo. puoi ottenere ciò usando la sottostringa. spero che questo aiuti
- usa For loop per la lunghezza del testo da testare (per (int i = 1, i < = text.length, ++))
- verifica ogni carattere che inizia 1 (es. ch = text.substring (i, 1)
- aggiungi ogni carattere letto alla stringa tmp tranne '< o > '
Suppongo che il metodo statico Escape()
lo risolva per te.
Regex r = new Regex(Regex.Escape(expression));
Inserisci questa riga in web.config
<httpRuntime requestValidationMode="2.0" />
Questa è una modifica in ASPNET 4.0