我正在将 antisamy 用于一个新项目,以防止 xss 漏洞。在应用程序中,用户可以通过简单的(ansi 编码)excel 文件上传内容。应该可以插入一些 html 但不能插入 javascript 等等。
当我用 antisamy 扫描我的输入时,我得到了这个错误: a 标签包含一个我们无法处理的属性。href 属性的值为“https 8; 7; 7;bla 6;bla 6;com 7;bla 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 添加的(如果我将它打印在 HTML 页面上..)。但是我的输入将由 AntiSamy 库中的 org.cyberneko.html.parsers.DOMFragmentParser 使用以下语句解析: parser.parse(new InputSource(new StringReader(html)), dom); 在我的 a 标签中, href 属性现在包含如下内容: https://bla.bla.com/bla?frame=Frameset[undefinable character]lang=en insted of https://bla.bla.com/bla?frame =框架集&lang=zh
所以这似乎是一个编码问题,&符号将不再是&符号。如何找出我应该使用哪种编码?
编辑:字符是 E2 8C A9 -> ⟨