Embeds Did Serious Harm to one of My Websites

Unattributed

第三方嵌入曾对我的一个网站造成严重损害

原文由 Unattributed 发布,订阅该博客

被砸碎的电脑显示器。照片由 Олег Мороз via Unsplash 提供。 照片由 Олег Мороз 发布于 Unsplash

引言

几天前,Michael Harley 写了一篇名为 How I make my blog posts more resilient 的文章。文中涵盖了维护博客乃至任何网站的许多好点子和原则。读完他的文章,让我想起了将近十年前,我的一个网站所经历的一次相当重大的事故。

当时我虽然对问题做了大致记录,却只部分谈及了其中一个不得不处理的问题:失效的第三方嵌入。我想,就我遇到的问题以及后来的处理方式展开讨论,作为 Michael 那篇文章的姊妹篇应该很合适。

事件起因

2018 年,我不得不对 The CerebralRift 做出一系列改动。(关于这些改动的来龙去脉,你可以在我 2018 年发布的几篇文章里看到:CerebralRift Goes KABOOM!Extreme Website CleaningThe Long Grind Aftermath 以及 A Pair Of Post Cleanup Rants。不过我不推荐你去看。它们又长又爱发牢骚,而且莫名地枯燥。)在这里,我想比原文更详细地展开谈谈其中一部分改动。

在做这些改动时,我发现网站存在不少问题。而且随着改动的深入,这些问题反而愈发严重。(其中很多改动包括迁移和/或删除内容,所以问题变多似乎有违直觉。)我很快意识到,必须进行更深入的排查才能解决这些问题。

我发现了什么

我发现的问题之一,与网站上使用的嵌入有关。在我写过的约 350 篇乐评中,大多数我都会把对应的发行作品嵌入到评论里。这主要出于好意:我想让读者在阅读乐评时,能够直接试听或观看到所评论的对象。

然而我发现,当原始音源在网上被移动或消失后,其中有好几个嵌入并没有优雅地失败。什么叫优雅地失败呢?

按理说,嵌入在被调用时,应该能检查传入的 URL 或 URI 是否有效。如果无效,就应该直接失败。但这几个嵌入并非如此。相反,只会出现以下两种情况之一:

  1. 嵌入会不断尝试加载,导致网页始终无法完全加载完成。
  2. 嵌入虽然加载出来了,却会产生 12 到 16 个格式错误的 URI。

这影响了网站的性能,也影响了许多搜索引擎对网站的评分(是的,那段时间我确实在钻研 SEO 原则——不过现在已经好多了)。卡住的嵌入会被计为极长的加载时间,而格式错误的 URI 则会被视为失效链接。基本上,这些失效链接不仅扰乱了 SEO 评分,也影响了运营网站时必须关注的那些实实在在的技术指标。

但我还有另一个担心:这些行为异常的嵌入会不会被当作攻击面加以利用?直觉告诉我,这对我的服务器应该不是问题,但对网站用户来说却可能是个隐患。所以,本着我偏执的性格,我把这些失效的嵌入视作安全问题。(说实话,我为此反复纠结了很久,有时候又会想,或许真的有人能利用失效的嵌入反向触及我的服务器。这只是我多疑的又一次发作。)

我的处理方式

我想结果已经很明显了(尤其是如果你读过上面提到的那几篇文章):我把网站上已发布的 400 多篇文章逐篇梳理了一遍。(受影响的远不止乐评。)在这个过程中,我对所有需要处理的文章都进行了更新和整理。

这是一个漫长的过程。光是清理就花了好几天时间。一路上,我也在认真思考今后该如何推进。

新策略

除非有极其特殊、非用不可的理由,否则第三方嵌入在我的网站上不再受欢迎。将近十年过去了,我不记得有遇到过非用不可的情况。

还有一点,当时我没有考虑到,但现在看来也很相关。我们一直都知道,许多这类嵌入需要使用 cookie 来在我们的系统上追踪自身状态。但是,我们当中又有谁真正清楚这些嵌入到底在做什么呢?它们很可能在我们的系统上投放信标 cookie,或其他可跨站访问的数据。

而且,据我所知(如果我说错了请指正),目前并没有类似 GDPR 那样能约束嵌入行为的法规。一想到这点,就让我有点不安。

这并不意味着你在我的网站上就看不到媒体内容了。CerebralMix Archive 就是一个很好的例子,那个网站的大多数页面都带有媒体播放器。但那个播放器是纯 HTML5 代码实现的。它的编写方式保证了如果因某种原因失败,就会显示一条错误信息。而且页面上依然保留了可直接下载媒体的独立链接,因此即便播放器失效,用户仍能访问到内容。

在这个富媒体已成为网站标配的时代,这条策略或许显得有些守旧。但说实话,它让我的网站维护变得更轻松了。而且,知道自己的网站上不再埋着一颗定时炸弹,也让我睡得更踏实了一些。

本文章由 muse-spark-1.2-contributor 进行翻译

评论