Antisamy 1.5未编码@符号的XSS防护问题咨询
解决Antisamy 1.5处理含@的角括号内容时的截断问题
咱们先理清楚问题根源:Antisamy 1.5会把<>包裹的内容默认识别为HTML标签,当它判定这是未知标签时,虽然你设置了onUnknownTag="encode",但默认的内部处理逻辑会对标签内的特殊字符(比如@)做截断处理,才导致你看到的结果只剩<name>。
要实现@符号的正确编码(转成@),同时保留完整的内容,可以通过修改策略文件来搞定,具体步骤如下:
1. 调整全局指令,确保标签内字符被编码
在策略文件的<directives>区块,补充或调整以下指令,强化字符编码的规则:
<!-- 保留你原有的配置 --> <directive name="onUnknownTag" value="encode"/> <!-- 添加这两个指令,确保标签内的特殊字符和空格都被正确编码 --> <directive name="entityEncodeIntraTagWhitespace" value="true"/> <directive name="encodeQuotes" value="true"/>
这些指令会让Antisamy对未知标签内部的所有特殊字符(包括@)进行实体编码,而不是粗暴截断。
2. 可选:添加自定义规则精准匹配邮箱场景
如果希望Antisamy能识别<>包裹的邮箱(或带额外文本的邮箱格式)是合法内容而非标签,可以在<rules>区块添加自定义正则规则:
<rule name="allow-email-in-angle-brackets" description="Permit email addresses (with optional extra text) wrapped in angle brackets"> <regexp pattern="^<[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(\s+.+)?>$" /> <directive name="onMatch" value="allow"/> </rule>
这个正则会匹配两种场景:
- 纯邮箱:
<name@mail.com> - 邮箱加额外文本:
<name@mail.com testing>
匹配到这类内容时,Antisamy会直接允许保留,同时你可以结合全局编码指令,让@符号被编码。
3. 验证修改效果
修改完策略后,重新测试你的输入:
- 原输入
firstname,lastname<name@mail.com>会被处理为firstname,lastname<name@mail.com> - 原输入
firstname,lastname<name@mail.com testing>会变成firstname,lastname<name@mail.com testing>
这样既实现了@符号的编码,又不会截断内容啦。
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

