Разрешить определенные атрибуты стиля с помощью ngSanitize

Я использую ngSanitize в приложении AngularJS для удаления нежелательных или опасных частей. Однако содержимое создается с использованием редактора Richtext HTML и содержит некоторую информацию о стиле, которая удаляется (например, цвет текста).

Я знаю, что полезно удалить встроенные стили CSS, но я бы предпочел бы белый список с атрибутами CSS, которые не удаляются. Есть ли способ достичь этого без предоставления всех атрибутов CSS?

Ответы

Ответ 1

Считывая документацию для ngSanitize, похоже, что он использует два белых списка для определения того, какие данные блокировать (описано здесь, в $compileProvider).

Два белых списка aHrefSanitizationWhitelist([regexp]) и imgSrcSanitizationWhitelist([regexp]). Тем не менее, похоже, что эти два только обрабатывают URL-адреса ссылок для предотвращения атак XSS.

Вы можете использовать sce.trustAsHtml() (или, возможно, data-bind-html-unsafe, если это все еще вещь, но я думаю, что это не рекомендуется), но это не совсем то, что вы хотите; что откроет вам все HTML, безопасно или небезопасно.

Возможно, стоит проверить документацию для $sce. Посмотрев на него до сих пор, есть возможность избежать CSS, но я не уверен, удастся ли он встроить CSS в HTML-тег. Пока я не вижу вариантов предоставления белого списка методу parseAs.

Edit:

Просматривая исходный код $sanitize похоже, он настроен на то, чтобы разрешить материал в тегах стиля, но не атрибуты стиля. Атрибуты стиля будут удалены путем дезинфекции, если вы не измените исходный код. Однако классы не разделяются, поэтому у вас может быть обходной путь. (Фактически, разрешая классы, а не встроенные стили, вы можете ограничить использование стилей в разделе комментариев.)

Единственной альтернативой было бы бросить свое собственное, кажется, если кто-то уже не имеет.

Ответ 2

У людей старше textAngular есть вилка ng-sanitize, которая позволит атрибуты стиля. Используйте их версию вместо ng-sanitize.