Angular $sce vs HTML во внешних файлах локали

Вопрос о ng-bind-html при обновлении приложения Angular с 1.0.8 до 1.2.8:

У меня есть языковые строки, хранящиеся в файлах с именем en_GB.json, fr_FR.json и т.д. До сих пор я разрешил использование HTML в строках локали, чтобы команда, пишущая локализованный контент, применяла базовый стиль или добавляла встроенную якорные метки. Это приведет к следующему примеру JSON:

{
  "changesLater":     "<strong>Don't forget</strong> that you can always make changes later." 
  "errorEmailExists": "That email address already exists, please <a href=\"login\">sign in</a> to continue."
}

При использовании этих строк с ng-bind-html="myStr", я понимаю, что теперь мне нужно использовать $sce.trustAsHtml(myStr). Я даже мог написать фильтр, как было предложено в этом qaru.site/info/27119/..., который приведет к использованию ng-bind-html="myStr | unsafe".

Вопросы:

  • Делая что-то подобное, мое приложение теперь небезопасно? И если да, то каким образом злоумышленник может использовать это?
  • Я могу понять потенциальные эксплойты, если источником отображаемой строки HTML был пользователь (т.е. комментарии в стиле пост-стиля в блоге, которые будут отображаться другим пользователям), но действительно ли мое приложение будет подвержено риску, если я покажу только HTML из файла JSON, размещенного в том же домене?
  • Есть ли другой способ, которым я должен искать разметку загруженных извне строк контента в приложении Angular?

Ответ 1

  • Вы не делаете свое приложение менее безопасным. Вы уже вставляли HTML на свою страницу со старым методом ng-bind-html-unsafe. Вы все еще делаете то же самое, но теперь вам нужно явно доверять исходному HTML, а не просто указывать, что часть вашего шаблона может выводить необработанный HTML. Требование использовать $sce затрудняет случайное принятие необработанного HTML из ненадежного источника - в старом методе, в котором вы только объявляете доверие к шаблону, плохой ввод может пробиться в вашу модель так, как вы не думали.

  • Если контент поступает из вашего домена или домена, которым вы управляете, тогда вы в безопасности - по крайней мере, так же безопасно, как и вы. Если кто-то каким-то образом может взломать полезную нагрузку ответа из вашего собственного домена, тогда ваша безопасность уже полностью ввернута. Обратите внимание, однако, что вы должны не когда-либо звонить $sce.trustAsHtml на контент, который поступает из домена, в котором не.

  • Помимо проблем с ремонтопригодностью, я не вижу ничего плохого в том, как вы это делаете. Наличие тонны HTML в файле JSON может быть не идеальным, но до тех пор, пока разметка разумно семантическая и не слишком плотная, я думаю, что это нормально. Если разметка становится значительно более сложной, я бы рассмотрел ее разделение на отдельные файлы шаблонов или wiki файлов angular по мере необходимости, вместо того, чтобы пытаться управлять связкой разметки, завернутой в строки JSON.