2014-09-02 19 views
33

Ho un modulo che viene utilizzato per creare un memo, per farlo ho un editor di testo avanzato per fornire alcuni stili, questo crea tag html per applicare lo stile. quando registro il testo, il mvc genera un errore per prevenire script potenzialmente pericolosi, quindi devo specificarlo esplicitamente.ValidateInput (false) vs AllowHtml

ho trovato 2 modi per farlo, decorare il metodo di controllo con [ValidateInput(false)] o decorare l'attributo ViewModel con [AllowHtml]

a me, [AllowHtml] sembra molto di più, ma ho trovato solo questo approccio utilizzato 1 ora e il Le cuciture [ValidateInput(false)] sono le preferite.

quindi mi piacerebbe sapere cosa ne pensi, quale dovrei usare? quali sono le differenze tra il 2?

tks

risposta

83

ValidateInput e AllowHTML sono collegati direttamente con XSS problemi di sicurezza.

Quindi proviamo prima a capire XSS.

XSS (cross-site scripting) è un attacco di sicurezza in cui l'utente malintenzionato inietta codice dannoso durante l'immissione dei dati. Ora la buona notizia è che XSS è di default prevenuto in MVC. Quindi, se qualcuno cerca di pubblicare codice JavaScript o HTML, atterra con l'errore seguente.

Enter image description here

Ma in tempo reale ci sono scenari in cui HTML è di poter, come editor HTML. Quindi per quel tipo di scenari puoi decorare la tua azione con l'attributo seguente.

[ValidateInput(false)] 
public ActionResult PostProduct(Product obj) 
{ 
    return View(obj); 
} 

Ma aspetta, c'è un problema qui. Il problema è che abbiamo consentito all'HTML di compiere un'azione completa che può essere pericolosa. Quindi, se possiamo avere un controllo più granulare sul campo o sul livello di proprietà, creeremmo davvero una soluzione pulita, ordinata e professionale.

Ecco dove AllowHTML è utile. Puoi vedere nel codice seguente che ho decorato "AllowHTML" sul livello di proprietà della classe del prodotto.

public class Product 
{ 
    public string ProductName { get; set; } 
    [AllowHtml] 
    public string ProductDescription { get; set; } 
} 

Quindi riassumendo “ValidateInput” consente agli script e HTML per essere pubblicato sul livello di azione, mentre “AllowHTML” è su un livello più granulare.

Si consiglia di utilizzare "AllowHTML" di più finché non si è certi che l'intera azione debba essere nuda.

Si consiglia di leggere il post del blog Preventing XSS Attacks in ASP.NET MVC using ValidateInput and AllowHTML che dimostra passo dopo passo l'importanza di questi due attributi con un esempio.

+1

bello vederti qui signore. Molti dei tuoi post sono stati utili per me sul progetto di codice. –

+1

Nel tuo esempio, se un utente dovesse inserire html nel campo 'ProductName', l'errore verrebbe comunque presentato (come previsto). C'è un modo per presentare un messaggio di errore più user-friendly. Questo errore sembra ignorare la configurazione dell'errore personalizzato. – philreed