Безопасно ли по умолчанию экранирование руля для использования в атрибутах HTML - PullRequest
0 голосов
/ 06 августа 2020

Я выполняю некоторую контрактную работу над проектом, который имеет множество HTML методов экранирования. Некоторые свойства экранируются в серверной части и отображаются как необработанные строки с использованием тройных ручек {{{escaped-in-backend}}}, другие передаются из исходных данных серверной части и экранируются с помощью двойных ручек {{unsafe}}.

Внутреннее кодирование JS выполняется с использованием (устаревшей?) Библиотеки ESAPI и использует смесь encodeForHtml() и encodeForHtmlAttribute(). Я не смог найти много информации по этому поводу, но этот пост предполагает, что кодировка атрибута также избегает пробелов как  , чтобы считаться безопасным от атак XSS. Это может быть то, что побудило предыдущего разработчика выполнить экранирование в бэкэнде.

Бэкэнд-экранирование неприятно, и я хотел бы избавиться от него и полагаться на рули. Я не занимался F / E годами, поэтому просто хотел дважды проверить, безопасна ли стратегия экранирования руля для значений атрибутов, например: <input type="text" value="{{unsafe-value}}"/>.

Я склоняюсь к 'да ', поскольку рули довольно распространены, и это было бы довольно явной дырой в безопасности, но я не смог найти какой-либо явной документации, говорящей как таковой.

1 Ответ

1 голос
/ 06 августа 2020

У вас есть проблема с обратной инженерией программиста. Вы отменяете решения, принятые предыдущими программистами!

Проблема, с которой вы столкнулись, заключается в том, что правила экранирования в атрибутах HTML отличаются от правил экранирования между тегами, поэтому мы разделяем эти экранирующие функции, потому что они не 1: 1. IE

<textarea>{{HTMLEscapingIsDoneHere}}</textarea>

<span background="[HTMLAttributeEscapingIsHere]"> ...

HTML экранирование охватывает гораздо больше символов, чем HTML кодирование атрибутов. Опасность заключается в том, что вы можете избежать намного большего, чем предполагали, тем самым нарушив некоторые другие функции, такие как селекторы css или jquery, которые могут пытаться ввести эти значения атрибутов и теперь потерпят неудачу, потому что вы ' ve слишком много ускользнул, и эти функции ожидали открытый текст, а не HTML атрибуты. Сами по себе Handlebars могут иметь некоторую функциональность, которая включает ключи для значений атрибутов, которые сломаются, если вы HTML -Escape их. [Я не знаю, я никогда не использовал его ..]

Если вы обратите внимание на то, что ускользает спереди, а что ускользает сзади, предыдущие разработчики были последовательны в том, что единственный экранированные вещи были вашими HTML атрибутами ... тогда я бы поставил 50 долларов на то, что они попытались экранировать все как полное HTML, что-то сломали, а затем придумали экранирование бэкэнда как самое простое решение в то время. Если бы они были непоследовательными, что ж, все ставки отключены. подход, который вы можете создать в будущем несовместимость с другими динамическими c фреймворками. Если вы не можете сказать, я уже сталкивался с этим раньше. Задача бизнеса - принять или отвергнуть этот риск.

Мое первое предложение: если вы работаете с ручками В JSP, просто импортируйте библиотеки тегов ESAPI и используйте там функции кодирования. Некрасиво? Конечно. Вы используете более одного фреймворка FE.

Мое второе предложение, поскольку вы, вероятно, женаты на рулях, - это обернуть функции кодирования esapi, которые вы хотите использовать, здесь и ввести их в рули. Например, в JSP у вас есть библиотеки тегов, которые позволяют либо использовать ESAPI, либо писать собственные оболочки. Поскольку я знаю, что ESAPI никогда не создавался с учетом ручек, я бы написал функции оболочки и явно экранировал HTML с помощью ручек и атрибутов HTML с вашими вставленными функциями ручек. Если у руля нет возможности вставлять собственные экранирующие функции, я боюсь, что бэкэнд-экранирование - следующая лучшая альтернатива. Предыдущие разработчики видели ценность в разделении этих экранирующих функций, но не смогли сделать это в коде FE.

Что касается более широкого вопроса: «Безопасно ли экранировать атрибуты как HTML вместо HTML Атрибуты "это один из тех ответов" да, но ... ", где я уже обошел подводные камни. Большинство этих подводных камней go устраняются при использовании структуры одностраничных веб-приложений, но это потому, что вы нормализовали все взаимодействие клиент / сервер до Javascript. Это тоже нехорошо c, но стрелка должна быть в колчане вашего подрядчика.

...