AntiSamy允许编码脚本警报通过?怎么阻止?

时间:2010-08-08 00:04:34

标签: java xss policy owasp

我正在使用AntiSamy和可用的antisamy-1.4.1.xml策略。该政策正在很好地阻止大多数受到攻击的XSS,但以下内容未被阻止。有关如何阻止以下内容以防止XSS攻击的任何建议?

1234%27%2Balert%2873918%29%2B%27

由于

1 个答案:

答案 0 :(得分:15)

Antisamy是一个HTML内容过滤器,用于允许不受信任的用户输入有限的“安全”HTML子集。 是一个通用输入过滤器,可以帮助您避免考虑字符串转义和XSS问题。

您应该仅使用antisamy来清理包含您希望在页面上逐字输出的HTML的内容。大多数用户输入通常不是HTML:当用户键入a<b or c>d时,他们通常应该使用小于和大于字符的文字,而不是粗体标记。为了确保正确发生这种情况,您必须对输出阶段插入页面的所有文本内容进行HTML转义,而不是与反歧义有关。

1234%27%2Balert%2873918%29%2B%27

这看起来不像典型的HTML注入攻击。它包含的唯一“特殊”字符是撇号,它在HTML中通常不常用,并且实际上不能从输入中过滤掉,因为用户通常需要使用撇号来用英语书写。

如果这会导致您的应用程序进行脚本注入,那么您遇到的问题比任何反犹主义都可以解决的问题更严重。如果这导致您的页面弹出alert()对话框,则您可能正在使用JavaScript字符串文字中未转义的值,例如:

<a href="..." onclick="callfunc('hello <%= somevar %>');">

将文本内容作为字符串文字放入JavaScript代码中需要另一种形式的转义;一个将'字符(网址编码输入中的%27)转换为反斜杠转义\',将\转换为\\(如以及其他一些替代品。)

从服务器端脚本语言获取值(字符串或其他)到JavaScript文字的简单方法是使用标准的JSON编码器。

但是,在上述情况下,JavaScript字符串文字本身包含在HTML属性中,因此您必须对 JSON编码器的结果进行HTML编码。这有点难看;最好避免使用内联事件处理程序属性。使用外部脚本和<script>元素,从JS而不是HTML绑定事件。

即使在<script>块中,您通常不需要进行HTML编码,也必须要注意字符串</script>(或者,通常是以</开头的任何内容,哪个可以结束块)。要避免该序列,您应该将<字符替换为其他字符,例如。 \x3C。一些JSON编码器可能有一个选项来为您节省麻烦。

在许多其他地方,将内容插入包含的语言需要特殊的编码类型。每个都有自己的规则。使用通用输入过滤器无法避免字符串编码的困难。一些“反XSS”过滤器尝试,但它们总是悲惨地失败。