Я думаю, что использовать что-то вроде decodeURI()
или escape()
практически не имеет смысла.
Я бы рекомендовал пропустить его через что-то вроде PostCSS , чтобы сначала проанализировать CSS. Это имеет множество преимуществ как с точки зрения безопасности, так и с точки зрения функциональности. Во-первых, он (должен) быть в состоянии обнаружить любые синтаксические ошибки, которые, в свою очередь, защитят вас от внедрения кода. Вы полагаетесь на безопасность PostCSS или любого используемого вами парсера, но это лучше, чем ничего. Это также упростит добавление таких функций, как сообщения отладки или префиксы CSS, в будущем.
Для более конкретного вопроса 'безопасно ли вводить CSS без экранирования?' : я сделаюобратите внимание, что мое сравнительно простое исследование, похоже, предполагает, что элементы <style>
в любом случае, похоже, имеют некоторую защиту от внедрения скрипта, по крайней мере, по сравнению с другими тегами. Обычно с внедренным кодом (через innerHTML) вы можете внедрить некоторый код, выполнив что-то вроде этого
<img src="/" onerror = "alert(1);">
Однако кажется, что для тега стиля, так как его содержимое всегда будет считаться Текстовый узел , (на самом деле вы явно задали его как текстовый узел в вашем примере), тогда это не то, что может показаться возможным.
Я бы все равно определенно пропустил его через парсер, чтобы быть уверенным. (Я обновлю этот ответ, если найду способ выполнения JavaScript с помощью тега стиля).