Update: Stripe's Response Regarding User Tracking

Michael Lynch

更新:Stripe 对用户跟踪的回应

上周,我发布了一篇博文,介绍 Stripe 如何记录其客户网站上的访客行为。简而言之,即使网站从未显示任何 Stripe 支付表单,Stripe 的 JavaScript 库仍会收集用户访问过的 URL 信息以及鼠标移动的遥测数据(telemetry)。我怀疑大多数 Stripe 客户并不知道这一点,并认为 Stripe 应该以更加醒目、更加详细的方式披露其数据收集做法。

这篇文章在 Hacker News 上引发了热烈讨论,其中包括 Stripe 联合创始人兼 CEO Patrick Collison(帕特里克·科里森)发表的几条评论。在他的置顶评论中,他说:

提出的问题(“Stripe 收集这些数据是为了广告吗?”)很容易回答:不是。这些数据过去从未、将来也不会被出售、出租给广告商,或以其他方式提供给广告商。

几位评论者回应说,他们很感谢他的保证,但希望在 Stripe 的服务条款隐私政策中看到正式且具有约束力的表述。

我的文章发布不到一周后,Stripe 发表了一篇博文,说明了他们为更好地披露数据收集做法以及围绕用户隐私的保障措施而作出的改动。

Stripe 博文截图

我已经查看了他们的新文档,下面将讨论 Stripe 的改动在多大程度上解决了我提出的问题。

Stripe 的改动

开发者文档明确披露跟踪功能

在我看来,最重要的改动是 Stripe 的开发者文档现在披露了其 JavaScript 库的跟踪行为。在昨天改动之前,唯一的提示只有下面两句话

为了最大限度地利用 Stripe 的高级欺诈检测功能,请确保在每个页面都加载 Stripe.js,而不仅仅是结账页面。这样 Stripe 就能在客户浏览网站时检测可能表明欺诈行为的异常行为。

这段话遗漏了关键信息,也没有说明该库收集哪些信息,以及如何将这些数据共享给 Stripe 的服务器。

在 Stripe 当前的文档中,该库包含一个名为“禁用高级欺诈检测信号”的部分,其中链接到一个网页,该网页明确列出了 Stripe 为防止欺诈而收集的信息类型。

Stripe 欺诈检测文档截图

Stripe 新的欺诈检测文档更加明确地说明了 Stripe 如何收集用户数据。

Stripe 客户可以选择禁用跟踪

Stripe 更新了其 JavaScript 库,使客户能够选择退出(opt-out)深度数据收集。现在,他们可以在加载 <script> 标签时加入 advancedFraudSignals=false 参数,以禁用此功能:

<script src="https://js.stripe.com/v3/?advancedFraudSignals=false"></script>

使用 @stripe/stripe-js npm 包的客户也可以使用这一功能,只需在初始化该库时指定 {advancedFraudSignals: false}

import { loadStripe } from "@stripe/stripe-js/pure";

loadStripe.setLoadParameters({ advancedFraudSignals: false });
const stripe = await loadStripe("pk_test_TYooMQauvdEDq54NiTphI7jx");

这是一个积极的改动,因为它让网站所有者重新拥有了决定交换多少数据、以实现更好欺诈防范的权力。

隐私政策现在明确禁止 Stripe 出售用户数据

周三,Stripe 大幅修订了其隐私政策。修订内容对 Stripe 如何处理用户数据以及如何与外部合作伙伴共享这些数据施加了更严格的限制。

我制作了隐私政策全部改动的差异视图,但下面只强调其中值得注意的部分。

  • 广告网络和出售用户数据的内容已删除

在我最初的博文中,我指出了 Stripe 隐私政策中令人担忧的以下部分:

当您访问我们的网站或在线服务时,我们和某些第三方都会随着时间推移、跨不同网站收集有关您在线活动的信息,以便向您提供根据个人兴趣定制的产品和服务广告(此类广告称为“基于兴趣的广告”)。

Stripe 还曾使用措辞授权自己与 AdWords 和 AdRoll 等广告合作伙伴共享数据:

我们与 Google AdWords、Doubleclick、AdRoll 以及其他广告网络合作。

Stripe 已删去这两部分。新的表述清晰直接,令人耳目一新:Stripe 不会向广告商出售客户数据:

我们不会将用户客户的个人数据用于基于兴趣的广告,也不会为此共享、出租或出售这些数据。我们不会出售或出租用户、用户客户或我们网站访客的个人数据。

  • 即使企业被出售,用户数据仍受保护

在 Hacker News 的讨论中,一名用户表示担忧:尽管 Stripe 目前抱有良好意图,但如果另一家公司收购 Stripe,用户数据可能会落入不当之手。Patrick Collison 回应说:

我会询问我们的法务团队,看看我们是否能以合同方式禁止自己在清算等情况下共享这些数据,或者以某种有用的方式对自己加以约束……

新隐私政策或许正是直接回应了这次交流,其中加入了以下条款:

任何收购我们公司或我们部分业务的其他实体,都有权继续使用您的个人数据,但只能按照本隐私政策中规定的方式使用,除非您另行同意。

我仍希望看到的改动

Stripe 迅速而全面的改动给我留下了深刻印象,但我认为仍有一些方面需要改进。我已直接向 Stripe 表达了这些担忧,他们表示计划在未来解决这些问题。

更明确地披露 URL 收集

在 Stripe 专门的欺诈检测页面上,他们设置了一个“信号类型”部分,解释了他们在欺诈检测过程中从终端用户收集哪些信息。

我在博文中指出,Stripe 会收集用户访问过的每个页面的完整 URL,包括查询字符串(query string,例如 example.com?userId=michael)和 URL 片段(URL fragment,例如 example.com#key=1234)。Stripe 仍未明确说明他们会收集这些信息。他们最接近这一点的表述是以下部分(重点为我所加):

高级欺诈检测信号还包括来自购物体验的活动指标,这些指标有助于我们区分合法购物者、欺诈性购买者和机器人……这些信号包括鼠标活动指标,以及用户在购物体验中不同页面上停留的时间;这两者都能预测用户在整个会话期间是否表现出类似机器人的行为。

一个理性的人能从这段话中推断出 Stripe 会收集完整 URL 吗?我对此表示怀疑。

也许你不会同情那些把敏感数据存储在查询字符串中的 Web 应用,因为这被广泛认为是不安全的做法。URL 片段则更加严重。以其他方式来看,URL 片段确实是存储敏感信息的安全方式,因此看到一个第三方库将其副本发送到外部服务器,令人十分担忧。

Firefox SendMega.nz 都是广受欢迎的 Web 应用示例,它们使用 URL 片段存储客户端加密密钥,使用户可以将端到端加密的文件保存到云端,同时服务器永远无法访问底层数据。如果 Stripe 的 JS 库运行在采用类似方案的网站上,那么该库就会将敏感的加密密钥泄露给 Stripe 的服务器。

Mega.nz 在 URL 片段中显示加密密钥的截图

广受欢迎的文件共享应用 Mega.nz 将敏感的加密密钥存储在 URL 片段字段中

支持卸载库

虽然 loadStripe 函数和 /pure 导入路径让集成方能够决定何时启用 Stripe,但目前仍无法将 Stripe 关闭

假设你想在结账流程中启用 Stripe 的高级欺诈检测,但希望交易完成后停止与 Stripe 共享数据。目前唯一的办法是强制刷新页面

如果 Stripe 提供一个类似 unloadStripe 的简单函数,在应用不再需要跟踪时动态禁用跟踪,情况会更好。

这一切为什么重要?

通过引入第三方 JavaScript 包,网站所有者赋予了这些库极大的信任。凭借在用户浏览器中执行代码的能力,JavaScript 库掌握着王国的钥匙。它们可以访问用户能够看到的所有信息,并能以用户权限在网站上执行操作。

网站所有者有责任(在某些司法管辖区还承担法律责任)了解其网站收集了哪些信息,无论这些信息是网站直接收集的,还是通过第三方库收集的。Stripe 展现出负责任的数据管理态度,这是件好事;但网站所有者必须继续坚持自己的权利,了解外部合作伙伴收集哪些数据,以及这些合作伙伴对数据作出哪些限制性保证。

原文由 Michael Lynch 发布

本文章由 openai/gpt-5.6-luna 进行翻译