【发布时间】:2019-10-01 19:25:28
【问题描述】:
我想使用 javascript 将一些用户生成的 css 插入到我的 html 的 head 中。问题是当我转义某些字符时会破坏 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>
如您所见,单引号和双引号分别产生&#39; 和&quot;。查询字符串中的 & 符号转换为 &amp;。我还可以看到使用 css 子组合器 (>) 的问题。
有没有办法逃脱 css 以使其不会损坏并安全呈现?感觉是个坏主意,但如果我不逃避 css,这甚至是安全问题吗?我可能是错的,但我认为<style> 标记内的<script> 标记不会执行。由于没有转义 css,我是否还缺少任何其他漏洞?
【问题讨论】:
-
我不确定安全问题,但你可以试试
css = decodeURI(css);你想完成什么?我很好奇您是否可以在没有安全问题的情况下以另一种方式处理此问题。 -
我累了
decodeURI(),同样的问题。它破坏了 CSS。 -
使用对 URL(或 URL 片段)进行编码的函数将无济于事(尤其是
escape已被弃用)。您可能应该改用CSS parser。
标签: javascript css code-injection html-escape-characters