我正在使用AntiSamy和可用的antisamy-1.4.1.xml策略.该政策正在很好地阻止大多数受到攻击的XSS,但以下内容未被阻止.有关如何阻止以下内容以防止XSS攻击的任何建议?
1234%27%2Balert%2873918%29%2B%27
谢谢
Antisamy是一个HTML内容过滤器,用于允许不受信任的用户输入有限的"安全"HTML子集.它不是一个通用的输入过滤器,可以使您不必考虑字符串转义和XSS问题.
您应该仅使用antisamy来清理包含您希望在页面上逐字输出的HTML的内容.大多数用户输入通常不是HTML:当用户键入时ad
,通常应该使用小于和大于字符的文字,而不是粗体标记.为了确保正确发生这种情况,您必须对输出阶段插入页面的所有文本内容进行HTML转义,而不是与antisamy有关.
1234%27%2Balert%2873918%29%2B%27
这看起来不像典型的HTML注入攻击.它包含的唯一"特殊"字符是撇号,它通常在HTML中不常用,并且实际上不能从输入中过滤掉,因为用户通常需要使用撇号来用英语书写.
如果这会导致您的应用程序进行脚本注入,那么您遇到的问题比任何反犹主义都可以解决的问题更严重.如果这导致您的页面弹出alert()
对话框,您可能正在使用JavaScript字符串文字中未转义的值,例如:
将文本内容作为字符串文字放入JavaScript代码中需要另一种形式的转义; 一个将'
角色(%27
在URL编码的输入中)转换为反斜杠转义\'
,并将\
其自身转换为\\
(以及一些其他替换).
从服务器端脚本语言到JavaScript文字获取值(字符串或其他)的简单方法是使用标准JSON编码器.
但是,在上面的例子中,JavaScript字符串文字本身包含在HTML属性中,因此您必须对JSON编码器的结果进行HTML 编码.这有点难看; 最好避免使用内联事件处理程序属性.使用外部脚本和元素,从JS而不是HTML绑定事件.
即使在一个通常不需要HTML编码的块中,您也必须要小心一个字符串
(或者,通常是任何开头的
,可以结束块的).要避免该序列,您应该
<
用其他东西替换该字符,例如.\x3C
.一些JSON编码器可能有一个选项来为您节省麻烦.
在许多其他地方,将内容插入包含语言需要特殊的编码类型.每个都有自己的规则.使用通用输入过滤器无法避免字符串编码的困难.一些"反XSS"过滤器尝试,但它们总是失败地失败.