我正在一个新项目中使用 antisamy,以防止 xss 漏洞。 在应用程序中,用户可以通过简单(ansi 编码)的 Excel 文件上传内容。 应该可以插入一些 html,但不可能插入 javascript 等。
当我使用 antisamy 扫描输入时,出现以下错误: a 标记包含我们无法处理的属性。 href 属性的值为“https& # 5 8 ;& # 4 7 ;& # 4 7 ;bla& # 4 6 ;bla& # 4 6 ;com& # 4 7 ;bla& # 4 7 ;...”。出于安全原因,无法接受该值。我们选择过滤 a 标签以便继续处理输入。
我在实体中添加了一些空格,您可以看到它。
(但应该是 https://bla.bla.com/bla/ ...)
当我调试代码时,“受污染的 Html 输入”及其 href 属性似乎是正确的(因此 excel 文件的编码没有问题)。
antisamy-policy 文件如下所示:
...
<regexp name="onsiteURL" value="([\w\\/\.\?=&;#-~]+|#(\w)+)"/>
<regexp name="offsiteURL" value="(\s)*((ht|f)tp(s?)://|mailto:)[A-Za-z0-9]+[~a-zA-Z0-9-_\.@#$%&;:,\?=/\+!]*(\s)*"/>
...
<attribute name="href">
<regexp-list>
<regexp name="onsiteURL"/>
<regexp name="offsiteURL"/>
</regexp-list>
<literal-list>
<literal value="javascript:void(0)"/>
</literal-list>
</attribute>
...
我还测试了正则表达式模式,因为我认为该链接是有效的。当然不是,当它是由 html 实体编码时。
那么问题出在哪里呢?
提前非常感谢
<小时/>我对 AntiSamy 代码进行了一些调试,现在我看到了问题,但我仍然无法解决问题。 htmlentities 是通过 antisamy AFTER 验证添加的(如果我将其打印在 HTML 页面上......)。但我的输入将由 AntiSamy 库中的 org.cyberneko.html.parsers.DOMFragmentParser 使用以下语句进行解析: parser.parse(new InputSource(new StringReader(html)), dom); 在我的 a 标签中,href 属性现在包含如下内容: https://bla.bla.com/bla?frame=Frameset[不可定义字符]lang=en 插入的 https://bla.bla.com/bla?frame=Frameset&lang=en
所以这似乎是一个编码问题,&符号不再是&符号。 如何找出我应该使用哪种编码?
编辑:角色是 E2 8C A9 -> ⟨
最佳答案
我做了一些解决方法,将“&”替换为“&”。 我不知道为什么,但它有效。这是唯一一个无法正常工作的角色。
关于java - 通过 DOMParsing (Antisamy) 进行哪种编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622036/