我有一个来自用户的字符串,然后使用 CSS 解析器将其插入到一个大的 CSS block 中。
CSS 转义可以通过 \C
(其中 C 是一个字符)、\HexOfC
(带空格)或 \6DigitHexOfC
完成.
通常,所有字符都可以安全地转义,CSS 仍会按预期运行。以下作品:
div {
background: \23 f66;
}
<div>Test</div>
但是,我仍然希望 CSS 属性尽可能“干净”,因为我希望能够使用检查器干净地查看 URL 和规则。
有些 Angular 色显然是坏的。 {};\*
应该全部转义,因为它们可以用来打破当前规则。我正在管理字符的白名单(所有内容都被转义,除了允许的内容)(与允许所有内容的黑名单相反,除了不允许的内容)。我目前的白名单字符是
'#', ',', '.', '(', ')', '-', '%', '+', '=', '/', ' ', ':', '\'', '"', '\n', '\r'
这里有危险人物吗?任何可以用来打破规则并影响 CSS block 其余部分的东西。是否有不在这里的字符会被不必要地转义? (默认情况下不转义字母数字字符)。
最佳答案
您可以简单地允许传输元素,而不是清理输入。
基本上是客户端生成的结构文件:
[
MyDiv: { # Key
background: "#FFFFFF" # Element
}
]
在这种情况下,您只需创建一个文件。
虚拟代码:
StringBuilder sb = new StringBuilder();
foreach(String key: structure.getKeys()) {
final List<Element> e = structure.getElements(key);
sb.append(".") // This may be changed of course
.append(key) // ID or class based on type above
.append("{")
// Append Elements
.append("}");
}
生成元素应该很容易。
每个元素都是
S := 元素键 : 元素值;
然后您也可以将特殊命令列入白名单。
如果您想继续 sanitizer ,请看这里: http://www.w3.org/TR/CSS21/grammar.html#scanner
关于java - 哪些字符可以安全地不使用 CSS 值上下文进行转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26157999/