Я хотел бы вставить некоторый пользовательский css в head
моего html, используя javascript. Проблема в том, что когда я убегаю от определенных символов, ломается CSS.
Например:
let css = `
@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');
body { font-family: "Roboto", sans-serif; }
`,
style = document.createElement('style');
style.type = 'text/css';
document.head.appendChild(style);
css = escape(css);
style.appendChild( document.createTextNode( css ) );
выходы:
<style type="text/css" id="custom-theme-styles">
@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');
body { font-family: "Roboto", sans-serif !important; }
</style>
Как видите, одинарные и двойные кавычки производят '
и "
соответственно. Амперсанд в строке запроса преобразуется в &
. Я также мог видеть проблемы с использованием дочернего комбинатора css (>).
Есть ли способ избежать css, чтобы он не ломался и надежно отображался? Это кажется плохой идеей, но если я не убегу от css, это вообще проблема безопасности? Я могу ошибаться, но я не думаю, что тег <script>
внутри тега <style>
будет выполняться. Есть ли какие-либо другие уязвимости, которые я пропускаю, не выходя из css?
css = decodeURI(css);
Чего вы пытаетесь достичь? Мне любопытно, можете ли вы подойти к этому по-другому, не опасаясь проблем с безопасностью. - person disinfor   schedule 01.10.2019decodeURI()
, та же проблема. Это ломает css. - person jwerre   schedule 01.10.2019escape
, который в значительной степени устарел). Вместо этого вам, вероятно, следует использовать парсер CSS. - person str   schedule 01.10.2019