如何防止在URL中跟踪敏感数据?

7

我的单页应用程序(SPA)中的一些URL包含敏感信息,例如访问令牌、用户信息等。

例如:

/callback#access_token=HBVYTU2Rugv3gUbvgIUY
/?email=username@example.com

我看到hotjar可以抑制DOM元素和图像的跟踪数据。是否可能隐藏URL中的参数,或者至少禁用某些页面的跟踪?

你考虑过使用AJAX将这些数据放入请求头中吗? - boosted_duck
你尝试通过cookies来存取那些数据了吗? - Rajendra kumar Vankadari
3个回答

2

我认为合理的假设是跟踪脚本会尝试访问window.location.href或类似的内容,以获取它们将要存储的当前网址。

因此,可能的解决方案是创建一个动态作用域,其中window.location.href具有不同的值(过滤掉所有敏感信息)。

以下是其工作原理:

// get the tracker script as a string, so you can eval it in a dynamic scope

let trackerScript = 'console.log("Tracked url:", window.location.href)';

// now lets lock it up
function trackerJail(){
  let window = {
    location: {
      // put your filtered url here
      href: "not so fast mr.bond"
    }
  }
  
  eval(String(trackerScript))
}

trackerJail()

如果跟踪片段被包装在函数中,可能可以通过覆盖其原型而创建动态作用域,而无需运行eval。但是我不确定您是否可以指望跟踪器脚本被包装在您可以修改的整洁函数中。
此外,脚本可能尝试访问URL的几种其他方式,因此请确保覆盖所有出口。

1
(非关联方)这让我想起了Figma的沙箱系统:https://www.figma.com/blog/how-we-built-the-figma-plugin-system/ - Seph Reed

2

如果您控制脚本的页面和顺序,那么您可以在其他任何人获取数据之前从url中读取数据然后将其删除。

proofOfConcept.html

<script id="firstThingToLoad.js">
    console.log(window.location.href);
    const keyRegex = /key=[^&]*/;
    const key = window.location.href.match(keyRegex);
    console.log("I have key", key);

    const href = window.location.href.replace(keyRegex, "");
    history.replaceState({}, "", href);
</script>

<script id="someSnoopyCode.js">
    console.log("I'm snooping: ", window.location.href);
</script>

<body>
    <a href="/?key=secret">Link to private</a>
</body>

当然,“Link to private”不能存在。此外,这样做会破坏刷新和大多数导航功能,但有办法捕获和保存它们。

2
由于您说这是 您的 SPA,您可以通过从 GET 请求(其参数位于 URL 中)切换到POST 请求来解决问题。我不了解 hotjar,但如果您告诉跟踪服务仅分析 URL,那将是值得考虑的选项。
另一个经常使用的选项是在 URL 中混淆您的参数,例如请参见最佳方法在网站上混淆电子邮件地址?然而,这对于敏感数据来说永远不是真正安全的解决方案,因为解密步骤太容易了,特别是如果您的中间人拥有您的 SPA 发送的所有请求。 编辑。 我刚在Hotjar 允许使用正则表达式中发现,假设您可以输入要排除的 URL 部分的正则表达式。 一般语法/foo/bar/意味着应将foo替换为bar,在我们的情况下,我们想要删除给定的片段,因此是/foo//
对于访问令牌的给定情况,正则表达式将是:
/callback#access_token=[a-zA-Z0-9]{15}//

同样地,对于URL的电子邮件部分也是如此。

/\?email=(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])//

这个第二个正则表达式部分来自 如何使用正则表达式验证电子邮件地址?


1
这是来自第三方服务的回调URL。我无法更改它。有了来自URL的令牌,某人就可以登录应用程序。 - Taras Hupalo
我现在明白了。你能使用其他的跟踪服务吗? - B--rian
@TarasHupalo 我刚想到了另一个解决你问题的方法。 - B--rian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接