2015-07-10 4 views
6

In einer Cshtml-Datei weise ich einem Attribut eine Zeichenfolge zu. Beispiel:Muss ich Attributwerte in MVC Razor kodieren?

Da @ Model.Value Zeichenfolge ein beliebiges Unicode-Zeichen enthalten kann, muss die Zeichenfolge natürlich codiert sein. Will Razor diesen Wert automatisch kodieren? Ich vermute es wird nicht oder kann nicht, weil ich sofort eine @ Html.Raw schreiben konnte, um das Ganze in zwei Tags aufzuteilen.

Ich denke, was ich brauche, dies zu tun ist:

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

Ist das richtig?

Ebenso, wenn ich einen String-Wert in einem JavaScript-String in einem Skript Einbetten soll ich verwenden:

//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> 

Antwort

0

Razor kodiert sie automatisch, so dass Sie nicht brauchen.

Um genau zu sein ist es codiert mit HttpUtility Encode/Decode-Methoden und das passiert mit allem, was kein IHtmlString wie MvcHtmlString ist.

Codierung es wäre wieder redundant. Wenn Sie dieses Verhalten umgehen müssen, müssen Sie den Helper Html.Raw verwenden, was ein Sicherheitsrisiko darstellen kann, wenn der Benutzer den Modellwert eingibt, den Sie rendern.

+0

Das Aufrufen von @ Html.Raw (Html.AttributeEncode (Model.Value)) ist nicht redundant, da Razor den endgültigen Wert nur codiert, wenn es vom Typ string ist. Da ich es kodiere und einen MvcHtmlString zurückschicke, versucht Razor nicht, es erneut zu kodieren. * HTML Attribut Encoding * kodiert nur eine Teilmenge der Zeichen, die * HTML Encoding * tut, aber da die Encodierung das gleiche Format verwendet (zB "&name;", "&#nnnn;") und es ist in Ordnung, Zeichen zu codieren, die sonst keine Codierung benötigen würden Die HTML-Kodierung von Razor reicht für HTML- und HTML-Attributwerte aus. Es ist also sicher, in diesem Fall einfach @ Model.Value zu verwenden. – Triynko

+0

Ich bin mir auch der Notwendigkeit der Verschlüsselung bewusst, um Sicherheitsrisiken wie HTML-Injection zu vermeiden. Ich habe nur darauf hingewiesen, dass, wenn Razor nicht schlau genug ist, den Kontext zu kennen, in dem der String eingebettet wird, er unmöglich eine andere Codierung für HTML-Attributwerte als HTML-Inhalt wählen kann. Dies ist nicht der Fall, und da die Attributcodierung eine Teilmenge der HTML-Codierung ist, ist es in Ordnung, nur HTML zu codieren, unabhängig davon, wo die Razor-Zeichenfolge endet. Siehe: http://StackOverflow.com/a/13246856/88409 – Triynko

+0

Ich sollte das auch im Fall von @Html erwähnen.Raw (HttpUtility.JavaScriptStringEncode (Model.Value)), das ist absolut notwendig, weil HTML-Codierung falsch wäre und tatsächlich zu einem Sicherheitsrisiko führen könnte. In diesem Fall müssen Sie unbedingt die Kontrolle über die Codierung übernehmen und sicherstellen, dass das, was Sie in den HTML-Stream an dem genauen Ort injizieren, an dem Sie es injizieren, korrekt formatiert ist. – Triynko

8

Razor führt HTML-Codierung standardmäßig für Strings durch. Je nachdem, wo Ihre Zeichenfolge in den HTML-Stream eingefügt wird, ist dies möglicherweise die richtige zu verwendende Codierung. Wenn es nicht die richtige Kodierung ist, müssen Sie die korrekte Kodierung selbst durchführen und sicherstellen, dass Sie einen MvcHtmlString (d. H. Einen HTMLString) zurückgeben, um sicherzustellen, dass Razor Ihre benutzerdefinierte Kodierung alleine lässt.

Da Razor HTML-Codierung verwendet, die sich technisch von der HTML-Attributcodierung unterscheidet (eine Teilmenge), ist es nicht falsch, @ Html.Raw (Html.AttributeEncode (Model.Value)) für das HTML-Attribut encode zu verwenden. Zur gleichen Zeit ist es auch nicht notwendig, da die Standard-HTML-Codierung das gleiche Grundformat verwendet und am Ende nur ein paar Zeichen codiert, die sonst nicht in einem HTML-Attributwert codiert werden müssten.

Auf der anderen Seite, im letzten Fall, wo eine Zeichenfolge in die Anführungszeichen einer JavaScript-Zeichenfolge injiziert wird, wäre die HTML-Codierung absolut inkorrekt, so dass Sie unbedingt die Codierung selbst durchführen müssen, wie ich es tat: @ Html.Raw (HttpUtility.JavaScriptStringEncode (Modell.Wert)).