news 2026/8/26 14:47:15

javascript:链接如何拖垮你的站点:Ammonia URL协议白名单与UrlRelative配置实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
javascript:链接如何拖垮你的站点:Ammonia URL协议白名单与UrlRelative配置实战

javascript:链接如何拖垮你的站点:Ammonia URL协议白名单与UrlRelative配置实战

【免费下载链接】ammoniaRepair and secure untrusted HTML项目地址: https://gitcode.com/gh_mirrors/am/ammonia

如果你的网站允许用户提交 HTML、评论或富文本,一条javascript:链接可能就是拖垮整站的隐形炸弹。本文带你用 Rust 生态中流行的HTML 净化库 Ammonia(基于白名单机制,专为防止 XSS、布局破坏和点击劫持而设计),通过URL 协议白名单(url_schemes)UrlRelative 相对链接策略两项核心配置,快速构建一条可靠的安全防线。🛡️

一条 javascript: 链接能做什么坏事?

想象评论区里这样的内容:

<a href="javascript:fetch('/api/secret')">点我看答案</a>

用户一点,浏览器直接在你的域名下执行脚本——读取 Cookie、调用你的 API、发起伪造请求。更阴险的写法还有:

  • HREF属性值中混入换行和大小写绕过(如javAscript:java&#115;cript:
  • data:协议内嵌 HTML 页面,实现点击劫持(clickjacking)
  • 相对链接//evil.com伪装成站内资源,把用户流量导到恶意站点

这些攻击的共同点:不是攻击标签,而是攻击链接里的 URL。所以 HTML 净化的关键一步,就是管住hrefsrc里能写什么。

💡 Ammonia 使用 html5ever 按 HTML5 标准解析输入,解析方式和浏览器一致,因此对这类"语法混淆"非常免疫——攻击者骗过 naive 正则清洗器的写法,在 Ammonia 眼里都是普通 HTML。

第一道防线:URL 协议白名单(url_schemes)

在 src/lib.rs 中,Ammonia 对每个href/src属性都会先解析 URL,再检查协议是否出现在白名单里,不在名单内的协议,属性整个被删掉

默认白名单里有什么?

Ammonia 的默认协议白名单比较"宽容",包含 25 个协议(见 src/lib.rs 中Builder::new()的默认值):

bitcoin, ftp, ftps, geo, http, https, im, irc, ircs, magnet, mailto, mms, mx, news, nntp, openpgp4fpr, sip, sms, smsto, ssh, tel, url, webcal, wtai, xmpp

注意两点:

  • javascriptdatavbscript都不在默认名单中,天然被拦截
  • ⚠️ftpsshmagnettel等默认都在——对普通内容站点来说偏宽了

实战:收紧到最小集合

一般内容站建议只保留httphttpsmailto

use ammonia::Builder; use maplit::hashset; let safe = Builder::new() .url_schemes(hashset!["http", "https", "mailto"]) .clean(user_html) .to_string();

配套还有两个细粒度方法:

方法作用使用建议
url_schemes(set)整体替换白名单明确自己只需要哪些协议时
add_url_schemes(&[...])在默认名单上追加业务需要自定义协议(如my-scheme:)时
rm_url_schemes(&[...])从默认名单中移除只想去掉个别危险协议(如ftp)时

对于javascript:链接的清洗效果是:链接文字保留,href被删除,变成无害的普通文本,既安全又不影响阅读。

另外,Ammonia 默认会给外链自动加上rel="noopener noreferrer"link_rel配置),防止反向标签劫持,这一层防护通常是免费白送的。👍

第二道防线:UrlRelative 相对链接策略

协议白名单只管"带协议的绝对 URL"。而相对链接(如href="/admin"href="//evil.com/x"href="../secret")不含协议,走的是另一套逻辑——url_relative()配置的UrlRelative策略。

相对链接为什么危险?

  • //evil.com/page是"协议相对链接",浏览器会用当前页面的协议直接访问别人的域名,常被用来钓鱼
  • 站点内容被嵌入 iframe 或转发到别处时,站内相对路径会悄悄指向宿主域名下的敏感接口

Ammonia 提供 5 种策略(定义见 src/lib.rs 中的UrlRelative枚举):

策略对相对链接的处理适用场景
Deny全部删除最严格,适合完全不可信的 UGC
PassThrough默认原样保留内容确定渲染在自己站内时
RewriteWithBase(base_url)按基准 URL 改写成绝对链接归档、离线分发内容
RewriteWithRoot { root, path }强制归入指定目录让内容更易移植
Custom(闭包)返回Some(新值)改写,None删除需要自定义规则的灵活业务

⚠️最容易被忽略的一点:默认策略是PassThrough,也就是说什么都不配的话,//evil.com这类协议相对链接会被原样放行。如果你的场景面向外部投稿,建议显式收紧。

三种典型配置组合

🔒 组合一:评论区/论坛(最严格)

Builder::new() .url_schemes(hashset!["http", "https"]) .url_relative(UrlRelative::Deny) // 相对链接一律删除

📰 组合二:博客/文档站(站内互链友好)

Builder::new() .url_schemes(hashset!["http", "https", "mailto"]) .url_relative(UrlRelative::RewriteWithBase( Url::parse("https://your-site.com/")? )) // 相对链接统一改写成你站点的绝对链接

🧩 组合三:自定义规则(例如只允许以 / 开头的站内路径)

UrlRelative::Custom传入一个判断函数,返回Some(改写结果)保留、返回None删除,文档里的示例(src/lib.rs 的UrlRelative注释)演示了如何识别"绝对路径"并加上统一前缀,思路完全可以照搬。

上手只需三步

  1. 引入依赖:在Cargo.toml中声明ammonia = "4.1"(项目最低要求 Rust 1.80,见 Cargo.toml)
  2. 配置 Builder:按上文组合设置url_schemesurl_relative
  3. 先净化,后渲染:所有外部 HTML 一律走clean()再入页

想动手试试?仓库自带了一个命令行小工具 examples/ammonia-cat.rs,把 HTML 从标准输入读入、净化后输出到标准输出,方便你用真实脏数据观察清洗效果。也可以先阅读 README.md 了解定位,并对照 CHANGELOG.md 关注安全修复记录——例如 4.1.3 就修复了一个由 MathML 命名空间切换引发的 mXSS 问题,生产环境请务必使用最新版本

常见误区与避坑清单

  • ❌ 以为"默认配置就安全"——默认协议名单含ftp/ssh/tel等,且相对链接默认放行,请显式收紧
  • ❌ 只在入口做一次净化,之后又拼接了用户原始 HTML——净化结果才是唯一可信输出
  • ❌ 用正则替代解析器做预过滤——浏览器解析出的"坑"(嵌套标签、异常命名空间)正则是扫不全的,Ammonia 的 html5ever 解析就是为此而生
  • ✅ 补充意识:javascript:之外,还要靠url_schemes一并挡掉data:vbscript:等"非浏览器协议",它们是点击劫持和离线攻击的常客
  • ✅ 性能无忧:构建 DOM → 过滤节点 → 重新序列化,官方基准测试显示其速度约为 Python bleach 的 15 倍(数据见 README.md 与 benchmarks/)

写在最后

防御javascript:这类链接攻击,本质上就是回答两个问题:允许哪些协议?相对链接怎么办?Ammonia 用url_schemes白名单和UrlRelative策略把这两个问题变成了两行配置,再配合 HTML5 标准解析带来的混淆免疫能力,让"净化不可信 HTML"这件事对新手也足够友好。把本文的两道防线放进你的内容管线,恶意链接就再也拖不垮你的站点了。🚀

【免费下载链接】ammoniaRepair and secure untrusted HTML项目地址: https://gitcode.com/gh_mirrors/am/ammonia

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 14:46:07

【Kingbase人大金仓】账号密码重置忘记密码重置

目录 1、停止数据库服务&#xff1a; 2、修改配置文件&#xff08;修改后可无需密码登录数据库&#xff09;&#xff1a; 3、启动数据库服务&#xff1a; 4、登录数据库&#xff1a; 5、登录数据库之后&#xff0c;执行修改设置账号密码命令&#xff1a; 6、修改配置文件…

作者头像 李华
网站建设 2026/8/26 14:29:35

Python开发效率提升指南:这10个小技巧值得收藏

很多Python开发者写代码时&#xff0c;遇到瓶颈往往不是语言本身&#xff0c;而是对标准库和语言特性缺乏系统性认识。同样的需求&#xff0c;有人写50行循环&#xff0c;有人用3行生成器表达式搞定&#xff1b;有人调试一下午&#xff0c;有人提前用对工具十分钟定位问题。差距…

作者头像 李华
网站建设 2026/8/26 14:27:59

互联网上值得推荐的外贸独立站建站公司有哪些?

在全球化的浪潮下&#xff0c;外贸独立站成为众多企业拓展海外市场的重要途径。选择一家靠谱的建站公司&#xff0c;对企业在海外市场的发展至关重要。以下为大家介绍相关的可靠企业及上海凰启的解决方案。上海凰启上海凰启信息技术有限公司专注于外贸独立站领域多年&#xff0…

作者头像 李华
网站建设 2026/8/26 14:26:05

知名的东莞美团精细化代运营联系方式

在东莞餐饮与生活服务行业&#xff0c;美团平台早已成为商家获客的核心阵地。然而&#xff0c;随着流量红利消退&#xff0c;粗放式上架和打折已难以为继&#xff0c;越来越多商家开始关注“精细化代运营”的价值。搜索“东莞美团精细化代运营联系方式”的背后&#xff0c;往往…

作者头像 李华
网站建设 2026/8/26 14:23:17

收藏这篇就够了!2025AI算力终极指南:从演进态势到投资机会,一篇讲透!

一、人工智能算力基础设施演进态势有着人工智能专用算力芯片还有, 加速芯片等, 这些组成异构计算架构, 人工智能算力基础设施是, 以智能计算设施作为核心设施的, 以智能算力集群作为核心载体的, 面向人工智能应用场景, 提供所需算力服务的, 提供数据服务的, 提供算法服务的公共…

作者头像 李华