如何防止Jsoup调用clean方法时移除a标签的href属性?
问题原因
这是配置遗漏导致的,并非Jsoup本身的bug:
Safelist.relaxed()默认已经将a标签、href属性纳入白名单,你额外调用addTags("a")、addAttributes("a", "href")是冗余操作,不会改变校验结果。- Jsoup的白名单对URL类型的属性(比如
a标签的href、img标签的src)设置了两层校验规则:第一层是属性本身属于对应标签的允许属性列表,第二层是属性值对应的URL协议必须在合法协议范围内。你使用的是无baseUri参数的Jsoup.clean(html, safelist)重载方法,对于示例中/foo/这类相对路径的href值,Jsoup没有基准URI无法解析其对应的协议类型,为了拦截javascript:这类恶意伪协议注入,会直接将该属性移除。
修复方案
调用携带baseUri参数的clean方法重载即可。baseUri仅用于解析HTML中的相对路径,只需要是合法URL格式即可,不要求真实可访问。
修正后的可运行代码:
public static void main(String[] args) { final String foo = "<a href='/foo/'>Foo</a>"; // 传入基准URI,默认relaxed规则已满足保留a标签href属性的需求 final String cleansedOutput = Jsoup.clean(foo, "https://placeholder.local", Safelist.relaxed()); System.out.println("foo: " + foo); System.out.println("cleansedOutput: " + cleansedOutput); }
代码运行输出如下,href属性会被正常保留:
foo: <a href='/foo/'>Foo</a> cleansedOutput: <a href="/foo/">Foo</a>
如果需要支持自定义协议的链接(比如tel:、sms:),可以通过Safelist.addProtocols("a", "href", "tel", "sms")方法追加允许的协议类型。
内容的提问来源于stack exchange,提问作者Aquarelle
相关产品推荐
相关产品推荐

