使用CSS值上下文哪些字符不安全?

时间:2014-10-02 09:29:58

标签: java css sanitization

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

可以使用\C(其中C是字符),\HexOfC (带空格)或\6DigitHexOfC来完成CSS转义。

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

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

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


有些人物显然很糟糕。 {};\*应该全部转义,因为它们可以用来打破当前规则。我正在管理一个白名单(一切都被逃脱,除了允许的内容)的字符(而不是黑名单,其中一切都被允许,除了什么不是)。我目前拥有的白名单是

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

这里有危险的人物吗?任何可用于突破规则并影响CSS块其余部分的东西。是否有不在这里的字符会被不必要地转义? (默认情况下不会转义字母数字字符。)

1 个答案:

答案 0 :(得分:1)

您可以简单地允许传输元素,而不是清理输入。

基本上是客户端生成的structur文件:

[
    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:= element-key:element-value;

然后你也可以将特殊命令列入白名单。

如果您想继续消毒,请看一下: http://www.w3.org/TR/CSS21/grammar.html#scanner