В моем приложении мне нужно локализовать некоторые сообщения JavaScript. Поэтому я использую рендерацию, чтобы получить соответствующие строки из файла ресурсов путем отражения и сериализации через json. Смотрите код внизу
Код работает нормально, и javascript-объект json корректно обновляется при изменении локализации.
Но потом я прочитал эту статью
https://blog.uploadcare.com/vulnerability-in-html-design-the-script-tag-33d24642359e
Мне также нужно включить скрипт Google Analytics, а другие представления должны включать другие элементы <script>
для конфигурации js. Каждый объект в этих элементах замораживается, а примитивы объявляются константами, остальная часть js находится в отдельных файлах.
Я просто параноик или это действительно серьезная проблема безопасности? Есть ли способ загрузить данные и значения модели в javascript без элементов <script>
?
вызов в режиме макета
@{Html.RenderAction("GetJsMessages", "Localization");}
код в контроллере (ClientMessages - это класс .resx)
[OutputCache(VaryByCustom = "culture", Duration = 7200)]
public ActionResult GetJsMessages()
{
string clientJsLocalizationJson
= JsonConvert.SerializeObject(
typeof(ClientMessages)
.GetProperties()
.Where(p => !p.Name.IsLikeAny("ResourceManager", "Culture")) // Skip the properties you don't need on the client side.
.ToDictionary(p => p.Name, p => p.GetValue(null) as string););
return PartialView("_jsLocalizationPartial", clientJsLocalizationJson);
}
_jsLocalizationPartial view code
@model string
<script>
var jsResources = Object.freeze(@Html.Raw(Model));
</script>