哪些字符是安全的,不能在CSS值上下文中转义?

What characters are safe to not escape with CSS value context?

提问人:Madara's Ghost 提问时间:10/2/2014 最后编辑:Madara's Ghost 更新时间:8/14/2019 访问量:515

问:

我有一个来自用户的字符串,然后使用 CSS 解析器插入到一个大的 CSS 块中。

CSS 转义可以通过(其中 C 是字符)、(带有空格)或 来完成。\C\HexOfC \6DigitHexOfC

通常,所有字符都可以安全转义,并且 CSS 仍会按预期运行。以下作品:

div {
  background: \23 f66;
}
<div>Test</div>

但是,我仍然希望 CSS 属性尽可能“干净”,因为例如,我希望能够使用检查器干净地查看 URL 和规则。


有些角色显然是坏的。 都应该被转义,因为它们可以用来打破当前规则。我正在管理一个字符白名单(除了允许的内容外,所有内容都会被转义)(与黑名单相反,除了不允许的内容外,一切都被允许)。我目前拥有的白名单字符是{};\*

'#', ',', '.', '(', ')', '-', '%', '+', '=', '/', ' ', ':', '\'', '"', '\n', '\r'

这里有危险的角色吗?任何可用于突破规则并影响 CSS 块其余部分的内容。有没有不在这里的角色会被不必要地逃脱?(默认情况下不对字母数字字符进行转义)。

Java 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、# 和 “。如果手动转换每个元素,则可以避免高级筛选。