2015-07-10 11 views
6

In un file cshtml, sto assegnando una stringa a un attributo. Ad esempio:Devo codificare i valori degli attributi in Rasoio MVC?

<input name="somename" value="@Model.Value"> 

Da @ Model.Value stringa può contenere qualsiasi carattere Unicode, ovviamente la stringa deve essere codificata. Will Razor codificherà questo valore automaticamente? Immagino che non lo farò o meno perché potrei facilmente mettere un @ Html.Raw subito dopo per suddividere l'intera cosa in due tag.

Penso che quello che ho bisogno di fare è questo:

<input name="somename" value="@Html.Raw(Html.AttributeEncode(Model.Value))"> 

E 'corretto?

Allo stesso modo, se sto incorporando un valore di stringa in una stringa JavaScript in uno script, devo usare:

//I could use Ajax instead of HttpUtility here, but Ajax just wraps the same call. 
<script>$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))');</script> 

risposta

0

Razor codifica automaticamente, in modo da non avete bisogno di.

Per essere specifici, viene codificato utilizzando i metodi HttpUtility Encode/Decode e questo succede a qualsiasi cosa che non sia un IHtmlString come MvcHtmlString.

La codifica di nuovo sarebbe ridondante. Se è necessario sfuggire a questo comportamento, è necessario utilizzare l'helper Html.Raw, che può rappresentare un rischio per la sicurezza se l'utente immette il valore del modello che si sta visualizzando.

+0

Chiamare @ Html.Raw (Html.AttributeEncode (Model.Value)) non è ridondante, poiché Razor codifica il valore finale solo se è di tipo stringa. Poiché sto codificandolo e restituendo un oggetto MvcHtmlString, Razor non tenterà di codificarlo nuovamente. * Codifica attributo HTML * codifica solo un sottoinsieme dei caratteri che * codifica HTML * fa, ma poiché la codifica utilizza lo stesso formato (ad esempio "&name;", "&#nnnn;") ed è corretto codificare caratteri che altrimenti non avrebbero bisogno di codifica , la codifica HTML Razor è sufficiente per i valori degli attributi HTML e HTML. In questo caso è sicuro usare solo @ Model.Value. – Triynko

+0

Sono anche ben consapevole della necessità di codifica per evitare rischi per la sicurezza come l'iniezione di HTML. Stavo solo sottolineando che, a meno che Razor non sia abbastanza intelligente da conoscere il contesto in cui viene inserita la stringa, non è possibile scegliere una codifica diversa per i valori degli attributi HTML rispetto al contenuto HTML. Non è così, e poiché la codifica degli attributi è un sottoinsieme della codifica HTML, va bene solo la codifica HTML, indipendentemente da dove finisce la stringa Razor. Vedi: http://stackoverflow.com/a/13246856/88409 – Triynko

+0

Devo anche menzionarlo nel caso del @Html.Raw (HttpUtility.JavaScriptStringEncode (Model.Value)), assolutamente necessario, poiché la codifica HTML sarebbe errata e potrebbe effettivamente comportare un rischio per la sicurezza. In tal caso, è assolutamente necessario prendere il controllo della codifica e assicurarsi che ciò che si sta iniettando nello stream HTML nella posizione esatta in cui viene iniettato sia formattato correttamente. – Triynko

8

Il rasoio esegue la codifica HTML sulle stringhe per impostazione predefinita. A seconda di dove viene inserita la stringa nello stream HTML, questa potrebbe essere o meno la codifica corretta da utilizzare. Se non è la codifica corretta, è necessario eseguire personalmente la codifica corretta e assicurarsi di restituire un MvcHtmlString (ad esempio un IHtmlString) per garantire che Razor lasci da solo la codifica personalizzata.

Poiché Razor utilizza la codifica HTML, che è tecnicamente diversa dalla codifica dell'attributo HTML (è un sottoinsieme), non è sbagliato utilizzare @ Html.Raw (Html.AttributeEncode (Model.Value)) all'attributo HTML codificare il valore. Allo stesso tempo, non è nemmeno necessario, poiché la codifica HTML predefinita utilizza lo stesso formato di base e finirà per codificare un carattere di coppia che altrimenti non avrebbe bisogno di essere codificato in un valore di attributo HTML.

D'altra parte, nel caso finale in cui una stringa viene iniettata nelle virgolette di una stringa JavaScript, la codifica HTML sarebbe assolutamente errata, quindi è necessario eseguire la codifica autonomamente come ho fatto io: @ Html.Raw (HttpUtility.JavaScriptStringEncode (Model.Value)).

Problemi correlati