2013-03-12 14 views
5

Quando inserisco caratteri HTML nel mio modulo, ad esempio <br />, ASP.NET genera un'eccezione interna 500 come descritto in here.Quando invio caratteri HTML nel mio modulo, perché ASP.NET genera un errore interno del server (500)?

A potentially dangerous Request.Form value was detected from the client (Name="<br />").

Ok, quindi mi sta proteggendo da caratteri non codificati che potrebbero essere utilizzati per ragioni di malintenzionati.

Il problema è, e questo non viene risposto da nessuna parte nella mia lunga ricerca, è cosa fare al riguardo. Cioè la mia applicazione non deve semplicemente generare un errore generico del server interno quando un utente inserisce caratteri non validi (cosa succede se sta disegnando una freccia come < -).

Ciò che sarebbe meglio è semplicemente tornare alla pagina con un errore ModelState che dice "Per favore non usare caratteri HTML" o qualcosa di significativo.

Ma come è possibile raggiungere questo obiettivo? L'errore viene generato prima che arrivi al mio codice. Inoltre, non voglio semplicemente spegnerlo via validateRequest="false" e quindi devo convalidare ogni singolo modulo nella mia applicazione per i caratteri HTML e restituire un errore.

C'è un modo per lasciare abilitato questo tipo di convalida, ma gestirlo in modo diverso?

Codice di chiarimenti:

Model

Public Class SomeModel 
    Public Property SomeField As String 
End Class 

Controller

<HttpPost> 
Function SomeController(ByVal model As SomeModel) 
    ' model.SomeField contains some HTML characters :O 
    ' but it doesn't matter, since an internal error has occured :(
End Function 
+0

Aggiornato il mio problema per includere del codice, per il contesto. –

risposta

2

È sicuramente possibile mostrare la propria pagina di errore con qualsiasi messaggio tu ritenga opportuno.
Si utilizzano pagine CustomError per questo.

È possibile configurare queste pagine di errore da visualizzare per il codice di errore appropriato.

<configuration> 
    <system.web> 
     <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" 
        defaultRedirect="GenericError.htm"> 
     <error statusCode="500" redirect="InternalError.aspx"/> 
     </customErrors> 
    </system.web> 
</configuration> 

Displaying a Custom Error Page

Sulla vostra pagina di errore è possibile rilevare l'ultimo errore con Server.GetLastError() e usarlo mostrano un messaggio appropriato, se si desidera che questo caso di dati html da trattare in modo diverso.

+0

Idealmente, vorrei tornare alla stessa pagina (modulo), piuttosto che una pagina completamente diversa con un generico "caratteri HTML rilevati". È possibile? –

+0

'redirectMode =" ResponseRewrite "' mantiene l'URL lo stesso. Se l'utente dovesse inviare senza inviare i dati difettosi, si aprirà la pagina corretta – nunespascal

2

Avete provato ad aggiungere l'attributo AllowHtml alla proprietà del ViewModel?

+0

Sì, e funziona, ma la gente dice che devi quindi convalidare tutto da solo. Se l'unica alternativa è usare ovunque allora perché ASP.NET convalida qualcosa in primo luogo? La mia domanda principale è perché, e qual è il modo migliore (standard) per risolvere questo problema? –

+1

Vedo. Tuttavia, probabilmente non dovresti utilizzare l'attributo AllowHtml ovunque. Solo nelle proprietà che potrebbero potenzialmente contenere html. Bene, se si desidera gestire l'errore in modo diverso, è possibile aggiungere un filtro di azione HandleError e specificare l'eccezione per System.Web.HttpRequestValidationException. Questo dovrebbe consentire di personalizzare il modo in cui viene gestito l'errore. Se si desidera modificare effettivamente il modo in cui viene eseguita la convalida interna, potrebbe essere necessario estendere il modello predefinito. –

0

Per consentire l'input limitato nel modello, utilizzare AllowHtmlAttribute sulla proprietà model. Questo è il primo passo.

Quindi creare un validatore personalizzato o utilizzare RegularExpressionAttribute per convalidare l'input per le specifiche.

Oppure, se si desidera consentire all'utente di inserire caratteri limitati, utilizzare HttpUtility.HtmlEncode per codificare il valore.

+0

Idealmente, vorrei tornare alla stessa pagina (modulo) con un errore ModelState.Error. Ma ciò significa applicare a ogni campo e quindi utilizzare la convalida su ogni campo (ad esempio un attributo di convalida). Che mal di testa :(Immagino che non ci sia una soluzione rapida per questo .. –

1

Sembra che quello che vuoi sia averlo spento a livello globale.

La preoccupazione di dover convalidare ogni singolo input nella propria applicazione è meno problematica di quanto non fosse in passato con il rasoio e la sintassi delle pagine Web di asp.net <%:%> HTML automaticamente. Gli unici campi dell'applicazione che dovresti convalidare manualmente per assicurarti che non contengano HTML sarebbero campi che vengono visualizzati come testo non codificato.

+0

Sì, d'accordo, ho notato che tutto è molto sicuro, quindi perché ASP.NET lancia questo errore in primo luogo? Prova questo: Vai a qualsiasi web MVC applicazione a cui è possibile pensare, andare in un modulo (come ad esempio il login) e inserire
in un campo e inviarlo. Se si verifica un errore, allora questi amministratori web non hanno tenuto conto di questo: P –

Problemi correlati