Как кодировать встроенный JavaScript в представлении Razor в ASP.NET MVC 3? - PullRequest
3 голосов
/ 28 ноября 2011

Как правильно кодировать JavaScript в следующем контексте:

<html>
...
<script type="text/javascript">
var settings = @Html.PleaseEncode(settings.ToJson());
// ...
</script>
</html>

Значения в моих объектах JSON устанавливаются администратором приложения, поэтому я предполагаю, что они должны быть правильно закодированы - как для HTML, так и для JavaScript.

Я использую System.Web.Script.Serialization.JavaScriptSerializer для кодирования JSON. Похоже, JavaScriptSerializer выполняет некоторую кодировку, поскольку выводит текст <None> как \u003cNone\u003c, но я не уверен, насколько это безопасно. Прямо сейчас я использую @Html.Raw, поскольку он работает при безопасном вводе. Генерирует следующее:

var settings = {"UnselectedReason":"None Selected", /*...*/};

Если я использую @Html.Encode, то получу:

var settings = {&amp;quot;UnselectedReason&amp;quot;:&amp;quot;None Selected&amp;quot;, /*...*/};

Я пробовал с и без AntiXSS , но я не вижу разницы в любом случае.

Ответы [ 5 ]

2 голосов
/ 28 ноября 2011

AntiXSS имеет JavaScriptEncode, но он предназначен для отдельных элементов, а не для целого набора ошибочных настроек.

Так что, если вы передадите {"UnselectedReason": "None Selected", /.../}, он будет есть цитаты и другие вещи, что, вероятно, не то, что вы хотите. Вместо этого, я бы сделал в вашем ToJson настройки с помощью строителя строк, что-то вроде

StringBuilder sb = new StringBuilder();
sb.Append("{");
foreach(KeyValuePair kv in mySettings)
{
    sb.Append("\"");
    sb.Append(Microsoft.Security.Application.Encoder.JavaScriptEncode(kv.Key, true);
    sb.Append(":");
    sb.Append(Microsoft.Security.Application.Encoder.JavaScriptEncode(kv.Value, true);
    sb.Append("\",");
}

string outputString = sb.ToString().TrimEnd(",") + "}";

return new HtmlString(outputString);

Примечание. Код находится на моей голове и даже не введен в VS. Он иллюстрирует принцип и может не компилироваться!

1 голос
/ 29 ноября 2011

Должно быть безопасно для прямого вывода ...

<script>//<![CDATA[<!--

var settings = @Html.Raw(settings.ToJson());

//-->]]></script

Хотя, если вы действительно обеспокоены ... это предполагает наличие современного браузера или json2.js.

<script>

var settings = JSON.parse("@Html.Raw(Server.UrlEncode(settings.ToJson()))");

</script
1 голос
/ 28 ноября 2011

Если вы хотите использовать JS, почему вы пытаетесь его кодировать?Если у вас есть JSON, он должен быть уже закодирован.Поскольку это JS, вам также не нужно требовать html-кодирования.

Я не верю, что вам нужно здесь кодировать, если вы не можете представить пример, почему я просто что-то упустил?

С любым допустимым javascript вы можете подвергнуться риску внедрения, но, поскольку вы знаете, что это исходит из некоторого действительного источника (то есть модели), который кодируется, путь относительно безопасен для получения JSON.

0 голосов
/ 28 ноября 2011

Если вы уверены, что хотите сделать:

@Html.Raw(yourStringWithTheJSONcode)
0 голосов
/ 28 ноября 2011

Это будет безопасно. Это не разрушит вашу разметку.

...