Categories
程式開發

保护用户隐私的9条实用建议


保护用户隐私的9条实用建议 1

作为 Simple Analytics的创始人,我在打造产品的同时,遇到了用户隐私保护问题。基于这些经验,我想向你展示一些实用的技巧,以更好地保护访客隐私。有些技巧看起来很有道理,但实施起来却很困难。这就是为什么我在每个技巧中都提供了实例,以便你或你的团队无需做过多的研究就能应用它们。

在这篇文章中,我谈到了第三方服务CDN提供商社交工具诚信尽责营销邮件数据存储PII(personally identifiable information,个人身份信息)数据IP匿名系统日志双因素身份验证,我会从以上几个方面分别进行介绍。

一些技巧可能会偏技术性,如果你没有任何技术背景,可以随时跳过这些技巧并将其转发给你的技术团队,这或许对他们有一些启发。

一、第三方服务

大多数企业大量使用了第三方服务。这些第三方应用可以帮助你为客户提供更好的服务,这一点非常好。但是我们很难知道这些服务对用户隐私的友好程度。尽管你可能知道它们承诺遵循了一些隐私保护条例(General Data Protection Regulation,简称GDPR,即《通用数据保护条例》,它对隐私保护提出了一些要求),但是你确定是否可以信任它们。在你的产品中始终将第三方服务视为不可信任可以较好的保护用户的个人隐私。你可以通过几种方法来限制其对访问者隐私的影响。

仅在需要时加载第三方脚本

有时你需要使用外部脚本。例如,你可能正在使用的第三方的聊天服务或付款服务。这种场景下的解决方案是:仅在使用脚本的页面上加载这些脚本。

对于聊天窗口,可能会在每个页面上加载,但对于付款服务而言,肯定会有所不同。不要在每个页面上都包含这些脚本。

在每个页面上使用聊天时,为了保护隐私你可以发挥点创意。例如,你可以设置一个小按钮,仅在单击外部它时才加载脚本。

有几种方法可以完成此操作。你可以通过诸如metomic_之类的服务来实现,该服务提供了脚本阻止功能,当然也可以自己写代码来实现。

metomic_代码示例


  // This code only runs when consent for MY-POLICY-SLUG has been given
  console.log("ok")

手动代码示例

var button = document.querySelector(".chat-button");
button.addEventlistner("click", function() {
  var script = document.createElement("script");
  script.onload = function () {
    // Do something with the chat script if needed
  }
  script.src = "https://chat.example.com/script.js";
  document.head.appendChild(script);
}

要检查你的站点是否使用第三方脚本,可以使用Simon Hearne (感谢Jan Klimo)构建的 Request Map Generator 。 对 Simple Analytics 进行分析后的结果如下图所示:

保护用户隐私的9条实用建议 2

在上图中,你可以看到与 Simple Analytics相关的服务:simpleanalytics.com, simpleanalyticscdn.comsimpleanalytics.io。 粉色圆圈是我们的视频首页,它占用最多字节。实际上我们还使用了第三方的支付服务,但是我们仅在客户点击注册后才加载脚本,因此在此图像中你看不到这个外部脚本。

与其他SaaS平台(比如Intercom)进行比较:

保护用户隐私的9条实用建议 3

可以看到产品从各种不同的域加载了许多外部脚本。我并不是说这有什么优点或缺点,但是,最好再次检查是否需要在当前网页加载所有这些第三方服务。运行Request Map Generator,就可以检查那些不需要的服务。

请记住,所有第三方服务都可以访问页面上显示的数据。如果你的用户已登录并查看关键数据,那么这些第三方也可以看到该数据。

二、限制CDN提供商的权限

如果你使用了CDN,则网站会向它们提供有关访问者的相关信息,以及让第三方服务获取一些权限,比如可以随意加载其他脚本,来获取访问者发出的请求信息。

Subresource Integrity

为了防止CDN篡改脚本的源,可以使用Subresource Integrity (SRI;脚本 integrity 属性)。你需要计算脚本源的哈希值,并通过 integrity属性将其包括在脚本标记中。要生成完整性哈希,可以使用srihash.org


Cross Origin attribute

HTML元素上的crossorigin 属性是CORS设置属性。这是从其他域(例如CDN域)加载脚本所必需的。 anonymous 关键字意味着你的网站与其他域之间不会通过Cookie和其他一些方式交换用户凭据。


Referrer policy attribute

为了防止第三方知道用户正在浏览的页面,可以将带有 no-referrer值的referrerpolicy 属性添加到脚本标签中。


即使你不在此处发送引荐来源网址,但浏览器还会发送带有CORS请求的原始标头。这意味着你的CDN提供商仍然会获得访问者所登陆的域。如果它们记录IP,则可以对访问者进行跟踪。这只能通过选择匿名IP地址的CDN提供商来解决。当前提供IP匿名化的CDN提供商是BunnyCDN(我们不隶属于BunnyCDN)

如果整合以上所介绍的方法,HTML代码如下所示:


如果你选择动态地添加脚本,则可以将上述功能指定为属性。注意,这些属性是区分大小写的。crossOriginreferrerPolicy中都使用了小驼峰的形式:

var script = document.createElement("script");
script.src = "https://cdn.example.com/script.js";
script.integrity = "sha384-...";
script.crossOrigin = "anonymous";
script.referrerPolicy = "no-referrer";

内容安全策略

如果要为你加载的脚本增加另一个安全层,你可以使用内容安全策略(CSP)。CSP是安全的附加层,有助于检测和缓和某些类型的攻击(包括跨站点脚本漏洞XSS和数据注入攻击)。

你可以通过一下几种方法来创建策略:浏览器会自动向特定的服务器发送报告(或使用诸如 report-uri.comCsper之类的服务来为你执行此操作)或浏览器自己生成报告。有一些工具可以帮助你自己创建报告,比如:Report URIcspisawesome.com 具有向导程序, 4ARMEDCsper 具有浏览器扩展,Mozilla 具有出色的文档。

创建策略时,你可以通过-标签或请求头指定它。

担心CSP会阻塞重要资源?可以通过使用 Content-Security-Policy-Report-Only 来生成报告而不会造成阻塞。

三、删除社交部件

社交媒体公司因从访问者那里肆意收集数据而“享有声誉”。 网络上有许多插件和方法来跟踪用户。你跟你的用户是不会选择被这些公司跟踪的。

如果你是访客,建议使用广告拦截器,例如uBlock Origin。这是一个非常优秀的浏览器扩展程序,可从你的访问中删除所有跟踪器和广告。该扩展上面有一个巨大的开/关按钮,你可以随时为你所在的站点选择打开或者关闭该功能。这会使你的浏览体验更加安全。

你的用户可以自己执行此操作,但总会有一些人不了解或不知道如何防止被跟踪。因此,欧盟出台了 GDPR,加利福尼亚出台了 CCPA,巴西出台了 LGDP,英国出台了PECR

2019年7月29日,欧盟法院(“ CJEU”)裁定,在其网站上嵌入社交插件(例如Facebook“ Like”按钮)的公司可视为数据控制[…] – fieldfisher.com

尽管你无法控制窗口插件背后的那些三方服务平台随意处理来自客户的数据的,但是你仍对这些数据的处理和保护负有责任。

替换Facebook分享按钮

当你在网页添加诸如共享按钮之类的Facebook小部件时,Facebook会建议你使用他们的脚本。这对他们来讲再好不过了,因为他们可以收集有关你的访客的更多信息。幸运的是,它们还提供了另一种无需使用任何脚本的方式。

这是带有自定义按钮和简单共享链接的示例。 我强烈建议使用链接实现而不是特定脚本的实现。一个简单的示例如下所示:

保护用户隐私的9条实用建议 4

确保添加rel="noopener"rel="noreferrer"以防止其他页面使用 window.opener属性访问你的窗口对象。这可能允许脚本将你的页面重定向到恶意URL。 这就是所谓的reverse tabnabbing钓鱼攻击。

上图示例的HTML代码如下:


对应的CSS代码如下:

section#privacy-button-links-example {
  display: flex;
  flex-direction: column;
  width: 100%;
  background-color: #eef9ff;
  border-radius: 3px;
  align-items: center;
  justify-content: center;
  padding: 3rem 1rem;
  margin: 0 0 1rem;
}
section#privacy-button-links-example div {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
}
section#privacy-button-links-example h1 {
  font-size: 30px;
  text-align: center;
}
section#privacy-button-links-example a {
  border: 0 solid #e2e8f0;
  border-image: none 100% 1 0 stretch;
  border-radius: 0.25rem;
  color: #fff;
  display: inline-block;
  margin: 0.5rem;
  padding: 0.75rem;
  text-decoration: none;
  white-space: nowrap;
}
section#privacy-button-links-example svg {
  border: 0 solid #e2e8f0;
  border-image: none 100% 1 0 stretch;
  display: inline-block;
  height: auto;
  margin: -0.25rem 0.5rem 0 0;
  max-width: 100%;
  vertical-align: middle;
}
section#privacy-button-links-example span {
  border: 0 solid #e2e8f0;
  border-image: none 100% 1 0 stretch;
  display: inline;
  margin: 0;
}

上面实现的是一个简单的链接,可为你的访客打开Facebook分享页面。你可以将链接放在网站的按钮上或文本链接后面。

针对非技术人员的功能实现说明如下:

假设你需要Facebook的链接:

https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fexample.com%2F%3Futm_source%3Dfacebook&src=sdkpreparse

你在该URL链接中看到很多奇怪的字符。那是因为链接是URL编码的。可以使用urlencoder.io 轻松对网站进行URL编码:

保护用户隐私的9条实用建议 5

urlencoder.io 的输出前面加上 https://www.facebook.com/sharer/sharer.php?u= 并在其后面附加 &src=sdkpreparse,你便拥有了Facebook共享链接,而不涉及收集用户跟踪以及侵犯隐私的数据。现在,你可以在自己网站的CMS中与使用此链接的开发人员共享此链接。

Twitter嵌入式推文

在互联网上,你可以看到Twitter小部件被大量使用。但是,当访客只想查看推文时,是否有必要将数据从访客请求到Twitter? 其实,只需要一个截图就可以了:

四、不要诱导用户

诱导你的用户去做他们不想做的事是非常糟糕的做法,你不应该这样做。有时候用户打开你的网站,你应该像对待新用户一样关注你的业务流程。请注意网页中的模棱两可的内容以及所有的弹出窗口。

cookie提示横幅

在浏览网站时,你会发现许多网站试图诱导用户,来获取追踪用户数据的权限。

例如,《纽约时报》的首页,当你看到叉号(X)时,通常会在没有同意要求的情况下选择关闭了对话框。《纽约时报》认为上述行为执行了“我同意”的操作:

保护用户隐私的9条实用建议 6

我强烈建议你不要这么做。

五、电子邮件

这部分还是与诱导用户的内容,但是我想单独花一个部分讨论电子邮件。

营销邮件

如果你经营一家公司,那么充分利用客户的电子邮件将带来巨大的价值。例如适时合理地使用邮件来告知客户产品新功能,帮助他们更好地使用你们的产品等。这对你的企业来说是一个好事。但是,如果你要向客户发送营销类的电子邮件,请确保你的客户希望这么做。你可以在注册过程中询问是否可以向他们发送有关你们的产品/服务的电子邮件,也可以询问是否可以向他们发送一些关于产品或服务的设置指南或提示。请注意,如果你要向用户发送电子邮件进行营销宣传,请确保经过了用户的允许。

邮件追踪

禁用电子邮件跟踪比启用它更难。这就是为什么大多数营销电子邮件都包含跟踪器的原因。由于客户端禁用了图像功能,因此邮件打开率的统计会有误差:

[…]仅当收件人收到该邮件中嵌入的图像,并且大部分电子邮件用户已在其电子邮件客户端上启用了图像阻止功能时,该电子邮件才被视为“已打开”。 […] – blog.hubspot.com

邮件图片

当电子邮件中大量的图片没有完全下载并被用户查看时,最终可能会为订阅者呈现以下内容:

将图像添加到电子邮件中而不能将这些图像正常显示时,它们看起来非常难看。越来越多的电子邮件服务将停止电子邮件跟踪器,因此也将停止图像展示。全新的HEY.com服务可阻止所谓的像素跟踪。我想以后还会有很多这样的服务会出现。

对于Simple Analytics,我们喜欢给用户分享电子邮件周报或月报。客户启用后,我们会向他们发送一封电子邮件,其中嵌入了所有图像,且没有跟踪器或任何远程图像。无需与电子邮件客户端外部的任何内容进行连接。我们承诺保护他们的隐私:这是他们应得的!

维护信誉

营销电子邮件的另一个需要注意的一点是提供取消订阅入口。请确保进行了该设置,因为它可以改善你的电子邮件信誉体验。取消订阅功能可以如下设置:

List-Unsubscribe: , 

在许多电子邮件客户端中,退订链接都放置在垃圾邮件按钮附近。你应该是希望人们退订而不是点击垃圾邮件按钮吧?所以,以免损害产品的声誉,请不要欺骗你的用户。

六、如何存储数据

将用户数据存储在一个特定的国家/地区,以保护人们的隐私是非常重要的。对于 Simple Analytics,我们

将服务器移到了冰岛,因为我们调查发现这个国家的隐私保护策略对用户是最好的。根据Freedom House Internet Freedom 评分,冰岛也是最佳选择。

保护用户隐私的9条实用建议 7

后来我们才意识到冰岛其实并不是最佳选择,原因有以下几个方面,摘自 our docs page on locations

  1. 冰岛现代传媒计划已被议会通过,但没有纳入法律(因此它不是我们先前理解的网络自由天堂)。
  2. 我们的提供商声称自己是冰岛最大的提供商,但是不如欧洲的大型提供商成熟,这给我们的服务器和基础架构的安全性带来了潜在风险。
  3. 提供商今年因故障停机两次。
  4. 通往冰岛的互联网电缆速度很慢。尽管地理位置优越(位于北美和欧洲之间),但实际上荷兰才是连接北美及欧洲的网络速度更快的国家。
  5. 我们不想因为瑞士搞营销活动而迁移到瑞士。因为欧盟提供了比瑞士更好的隐私保护。
  6. 无论如何,我们都需要迁移,因为当前我们的提供商没有提供我们需要的功能强大的服务器。
  7. 冰岛第二大供应商的合法总部位于香港,这不是我们数据存储的首选位置。

我们曾经询问过我们的客户,从冰岛搬到荷兰他们是否可以接受,最后所有人都同意了我们的决定。

一定要考虑好将用户的数据放在何处。好好研究你们正在使用的托管服务提供商及其所在的国家/地区。在不知道为什么便宜的时候最好不要选择最便宜的那一个。

七、如非必要,不要记录或询问PII数据

个人身份信息(PII)是当单独使用或与其他相关数据一起使用时可以识别唯一个人的信息。网站或者应用有时候会让你提供非必须的个人信息,这种情况十分常见。

不要询问用户全名……

……除非你真的需要全名,否则要让用户自己决定是否添加全名。如果为了在推送邮件中称呼用户而采集用户信息,则只需一个称呼即可,无需全名。

如果不想为起假名浪费太多时间,有很多服务可以帮助创建假名。

八、IP匿名

这部分内容太偏技术性了,所以原谅我无法展开详细介绍。如果你是一位项目经理,可以将该问题转发给你的开发人员。在谈论隐私时,IP匿名化是在服务器上要做的最合乎逻辑的事情。然而,关于如何做到这一点的例子并不多。服务器上的许多进程(应用程序)都会记录数据。 例如,NGINX默认会记录每个请求的数据(不过,该配置支持自定义)。这对调试非常有用,但对用户隐私却不利。使用NGINX,你无法设置错误日志的格式,因此始终会以相同的格式打印错误日志。这是非常不利于保护隐私,因为它包含用户的完整IP地址,通常还会包含User-Agent信息(使用Facebook应用程序时可能还会包含其他标记信息)。

你可能会猜出这个Facebook User-Agent后缀的一些元素的含义,但我不是很了解:

[FBAN / FBIOS; FBAV / 221.0.0.0.0; FBBV / 154514034; FBDV / iPhone9,4; FBMD / iPhone ; FBSN / iOS; FBSV / 12.3.0; FBSS / 3; FBCR / Siminn; FBID / phone; FBLC / en_GB; FBOP / 5; FBRV / 155138002]

看起来他们似乎不会根据User-Agent后缀跟踪用户,但至少会篡改User-Agent。

syslog日志过滤

Simple Analytics使用了rsyslog(syslog的升级版本)来采集NGINX日志。rsyslog通常包含在Linux发行版(官方网站)中。 幸运的是,rsyslog附带了一个非常好用的mmanon模块,该模块(自版本7.3.7以后)可以过滤IPv4和IPv6的地址。

如何使用rsyslog实现IP匿名

在服务器上,你可以通过运行rsyslogd -v来检查具有哪个版本的rsyslog。

你可以将以下几行配置添加到rsyslog配置文件中来启用IP匿名化。配置文件通常位于/etc/rsyslog.conf/etc/rsyslog.d/50-default.conf中。

module(load="mmanon")
action(type="mmanon" mode="zero" ipv4.bits="32" ipv6.bits="128")

更改配置文件后,使用命令 service rsyslog restart重新启动rsyslog即可。

syslog进阶

更高级的用法是通过自定义过滤器,来删除日志文件或日志服务中的敏感数据。

你可以在 /etc/syslog/...中自行创建syslog配置文件,我在/etc/rsyslog.d/30-anonymize.conf 创建了一个配置文件,其内容为:

# Specify a custom format to anonymize your logs
$template anonymize,"%$year%-%$month%-%$day% %timegenerated:12:19:date-rfc3339% %app-name% %$!new%n"
# This makes the template the default for all logs
$ActionFileDefaultTemplate anonymize
set $!new = $msg;
# Replace user agents
if re_match($msg,'(Mozilla\/[0-9]\.[0-9] [^"']+)')
then {
  set $!ext = re_extract($msg,'(Mozilla\/[0-9]\.[0-9] [^"']+)',0,1,"");
  set $!new = replace($msg, $!ext, "*** (user agent)");
}

当然你可以做更多的适合自己的配置,在我们的配置中,我们隐藏了IP地址,信用卡卡号以及用户代理信息。

九、使用双因素身份认证

与隐私相比,双因素认证更与安全相关,也是非常重要的一方面。

如果要保护用户数据并防止其他人访问其数据,可以使用两因素身份验证系统。不要使用短信服务,可以使用目前广泛应用的 TOTP (基于时间的一次性密码算法)。它不需要网络连接,可以安装在多个设备上。

结论

Simple Analytics工作期间,我一直致力于保护用户个人隐私的工作,寻找对隐私保护有利的方法。 目前来看,关于在自己的业务中如何防止用户被追踪的指导方法较少。

你可以在Hacker News上阅读关于这一话题 的讨论。

我希望这篇文章可以帮助你,使你的网络服务能更加有效地保护用户隐私。如果你有什么好的建议,可以联系我,在后面我会进行补充。

英文原文:

Practical privacy tips for your business