Дезинфицировать некоторые значения перевода, но не другие
У меня есть директива углового перевода, которая принимает аргументы, которые смешаны. Некоторые из них генерируются пользователем, другие HTML, которые должны быть скомпилированы (с translate-compile
).
Посмотрите на этот поршень для рабочего, сильно упрощенного примера.
Когда translate-sanitize-strategy
установлен на "ноль", ничего не очищается:
<p translate
translate-value-amount="<currency data-amount='balance'></currency>"
translate-value-beneficiary="{{ beneficiary }}"
translate-sanitize-strategy="null"
translate-compile="true">PAY_TO</p>
Это требует, чтобы Вы заплатили 13,37 евро Джону Доу.
Но когда пользователь устанавливает псевдоним john-<span onmouseover="this.textContent=\'h@ck3d\'">doe</span>
, он запустит это и отобразит после наведения мыши. Вы должны заплатить 13,37 евро на john-h @ ck3d. Наглядный пример XSS.
Когда я установил стратегию sanitizeParameters
, что также является нашей глобальной обстановкой, бенефициар должным образом очищен. Но это так amount
которому я доверяю (на данный момент) и которая должна быть скомпилирована!
<p translate
translate-value-amount="<currency data-amount='balance'></currency>"
translate-value-beneficiary="{{ beneficiary }}"
translate-sanitize-strategy="'sanitizeParameters'"
translate-compile="true">PAY_TO</p>
Это делает, Вы должны заплатить Джону Доу. Итак beneficiary
значение должным образом очищено, но так же как и значение-значение, которое мне нужно оставить неанифицированным, чтобы угловая его скомпилировала.
Я искал решение, где я вручную очищаю значение бенефициара с помощью фильтра:
{{ beneficiary | sanitize }}
Но это, кажется, требует от меня написать фильтр, который использует ngSanitize
Обслуживание; не так сложно, но все еще некоторая работа, тесты, код для чего-то, что я ожидаю, чтобы быть изначально доступным. Где-то.
Я прочитал код angular-translate, чтобы найти, есть ли (скрытый) флаг или соглашение об именах или около того, которое разрешает настройку очистки для каждого значения, но не смог найти это. Что-то вроде translate-sanitize-attributes="['foo', 'bar']" or even a
translate-value-amount-astrusted=`или somesuch. Но не смог найти ничего, что намекало бы на способность устанавливать стратегии дезинфекции или их пропуск, на ценность.
Как это обычно достигается в angularjs и angular-translate?
1 ответ
Как насчет:
<p translate
translate-value-amount="<currency data-amount='balance'></currency>"
translate-value-beneficiary="<span ng-bind='beneficiary'></span>"
translate-sanitize-strategy="null"
translate-compile="true">PAY_TO</p>