提问人:Madara's Ghost 提问时间:10/2/2014 最后编辑:Madara's Ghost 更新时间:8/14/2019 访问量:515
哪些字符是安全的,不能在CSS值上下文中转义?
What characters are safe to not escape with CSS value context?
问:
我有一个来自用户的字符串,然后使用 CSS 解析器插入到一个大的 CSS 块中。
CSS 转义可以通过(其中 C 是字符)、(带有空格)或 来完成。\C
\HexOfC
\6DigitHexOfC
通常,所有字符都可以安全转义,并且 CSS 仍会按预期运行。以下作品:
div {
background: \23 f66;
}
<div>Test</div>
但是,我仍然希望 CSS 属性尽可能“干净”,因为例如,我希望能够使用检查器干净地查看 URL 和规则。
有些角色显然是坏的。 都应该被转义,因为它们可以用来打破当前规则。我正在管理一个字符白名单(除了允许的内容外,所有内容都会被转义)(与黑名单相反,除了不允许的内容外,一切都被允许)。我目前拥有的白名单字符是{};\*
'#', ',', '.', '(', ')', '-', '%', '+', '=', '/', ' ', ':', '\'', '"', '\n', '\r'
这里有危险的角色吗?任何可用于突破规则并影响 CSS 块其余部分的内容。有没有不在这里的角色会被不必要地逃脱?(默认情况下不对字母数字字符进行转义)。
答:
1赞
manf
10/4/2014
#1
您可以简单地允许传输元素,而不是清理输入。
基本上是客户端生成的结构文件:
[
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 := 元素键 : 元素值;
然后,您也可以将特殊命令列入白名单。
如果您想继续消毒,请看这里: http://www.w3.org/TR/CSS21/grammar.html#scanner
评论
0赞
Madara's Ghost
10/4/2014
这对我有什么帮助?是什么阻止了用户插入邪恶的 CSS?
0赞
manf
10/4/2014
他应该怎么做?您可以通过过滤 element-key 来允许/禁止任何您想要的元素。div's、element-keys 和 element-values 本身只需要是 A-Z、a-z、0-9、# 和 “。如果手动转换每个元素,则可以避免高级筛选。
评论