2012-01-10 23 views
10

Ho una pagina ASP.Net MVC 3 in cui ho un controllo Html.TextAreaFor, vedere il codice di seguito. Se provo a inviare la pagina all'azione http post con testo in parentesi angolari, come: <test>, ottengo un errore di schermo giallo con scritto:HtmlEncode on Post per ASP.Net MVC 3 Html.TextAreaFor

Un valore potenzialmente pericoloso Request.Form è stato rilevato dal client (RequestText = "").

Non capisco perché sto ottenendo questo perché ho trovato an article by Scott Guthrie che dice il nuovo <%: %> sintassi nel .Net 4, verrà automaticamente HTMLEncode l'elemento. Dal momento che sto usando la sintassi <%:%> per il controllo Html.TextAreaFor, ho pensato che si sarebbe occupata automaticamente di questo e convertire le parentesi angolari al valore corretto "& lt"; e stringhe "&".

<% 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" /> 
<% } %> 

risposta

18

In sostanza in questo momento, si sta codificando il contenuto del TextAreaFor sul uscita. Questo non ti aiuta minimamente in quanto si sta cercando di fare con ingresso

Se si desidera inviare contenuti "potenzialmente pericolosi", è necessario sia

1) decorare la proprietà RequestText all'interno il tuo ViewModel con [AllowHtml]. (Preferito)

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

2) disabilitare validateRequest

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

Quindi è necessario assicurare state opportunamente sanificazione tali dati e/o la codifica che nel controllore prima di sottoporlo al strato repository o Banca dati.

+0

Chase - Preferisco non usare [AllowHtml], non c'è un modo per avere il .net framework html per codificare il testo per me quando ritorna all'azione del controller? –

+1

L'hai codificato manualmente sul controller. È il livello dati a cui non vuoi assegnare dati non codificati. Devi gestirlo a livello di controller. –

+0

Fondamentalmente, HTML non può codificare i dati per te. Puoi usare Javascript, ma è sbagliato semplicemente perché possono semplicemente disabilitare JS. L'unico modo sicuro per farlo è a livello di server e non a livello di client. –

6

Si potrebbe decorare la vostra proprietà RequestText sul modello vista con il AllowHtmlAttribute:

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

In questo modo si autorizza il cliente a presentare HTML solo per questa proprietà.

Per quanto riguarda la sintassi <%: %>, questo viene utilizzato per codificare il valore HTML prima di inviarlo alla pagina. È usato per proteggere dagli attacchi XSS. È irrilevante nel tuo caso perché non stai inviando alla pagina, stai ricevendo caratteri HTML in una richiesta.

+0

È necessario utilizzare '@ Html.Raw (model.RequestText)'? o il framework MVC interno si occuperà del rendering? –

+0

Se ho diritto, l'attributo AllowHtml non consente l'esistenza di nel testo html. Hai un'idea? – QMaster