logo一言堂

不明链接可以点吗?

我公司的IT部门教育我们说,从邮件或短信等地收到的链接,除非是确认是熟人发来的,千万不要点,点了很有可能中招。更有甚者,IT还会不定期给你发邮件,内含一个网页链接,一旦你点进去,就会进入一个网页,上面说这是演习,不是教育过你别随便点了吗,怎么还随便点呢?

我就有疑问了,什么叫随便,什么叫确认是熟人?很多时候,熟人与否是难以确认的,而且假如点一个链接就会出事,熟人与否恐怕不能保证一定这链接就一定安全吧?说不定是他转的,转的人又是从别处转的,我何以确认这个链接就一定安全呢?如果什么都不能点,这互联网还叫互联网吗?

链接的本质

不管你在什么应用中点击一个HTTP链接,其结果都是打开一个浏览器窗口,加载一个网页。在现代,网页已经不是一个简单文档,所以,这个加载的过程在本质上是从互联网上下载一个未知的程序,也就是javascript,在你本地的一个安全容器,也就是你的浏览器的一个窗口里面运行。这个未知的程序不仅可以上网,还能有限度地接触到你的一些本地数据。真实的互联网上坏人很多,所以这个未知程序有相当概率包含恶意元素。这么说起来,是不是觉得很危险?所以我们要分析一下,危险在哪里。总结一下,可能有一下几种危险:

  • 在你电脑上植入病毒或木马
  • 盗取你电脑上的数据
  • 恶意篡改你电脑上的数据
  • 盗取你在其他服务上的数据
  • 恶意篡改你在其他服务上的数据

下面我们一一分析可能。

植入病毒

我们说过,这段恶意程序是在你的浏览器标签页下运行的,这也就是一个安全容器。除非你在这个程序的诱使下干了什么别的,这个恶意程序是万万跳不出这个安全容器的。你只要把标签页关掉,一切痕迹就被消除了。假如安全容器有漏洞,那一切的安全保证就没有了,除非你不上网,否则多点,少点几个链接,也不会有什么区别。

盗取本地数据

浏览器安全容器里是无法读取本地文件系统的。但是,总有一些环境因素是会被未知的javascript接触,比如说Cookie,以及你的IP地址,浏览器配置信息,电脑的一些配置信息等。Cookie我等一下会详细解释。其他的一些环境信息的泄漏,虽然不能直接造成危害,但会让它的后台收集你的一些行为信息,对你做用户绘像,久而久之,它会更了解你,然后说不定再对你干些别的。这听起来有点恐怖,好像没穿底裤在街上走啊。

那好,如果我对你了解够多,我能干点什么呢?最普遍的,就是对你做针对性广告,让你花钱。但是,要认识到在当今,大平台,社交网络已经对你有相当完备的用户绘像,对于广告商来说,直接找他们推广告就完了,何必找一些灰色平台呢?他们的数据远不及大平台,广告效果不大,还可能惹一身骚呢?所以,用户绘像这件事,如果没有海量的数据支撑,是没有经济意义的。小门小户的灰色平台虽然有技术上可能,但是他们是没有动力做这件事的。

现在我们很多事情在网上完成,所以网上的各种服务存了我们的各种数据,从网上医疗,网上银行到留言板,这些数据重要的和我们的生命财富紧密联系,不那么重要的也是我们的个人隐私。假如恶意程序可能盗取我们存在云端的数据,甚至篡改之,例如朝坏人转钱,这危害性就大了去了。下面我们先不讲这些危害,先聊聊一个重要的技术概念,就是Cookie。

Cookie是各种网上应用存在浏览器本地的简短数据。它一般是不可分析的加密片段,但从远程来看,就是最重要的用户识别方法。HTTP协议本是无状态的,只有通过每次HTTP请求附带的Cookie,远程服务才能识别这个访问来自于谁,上下文是什么,并做相应的定制化操作,返回定制化数据。所以说,假如恶意程序能获取有效服务的Cookie,这就相当于把你在网上的家门钥匙给了它。那恶意程序能还是不能使用有效服务的Cookie呢?能,又不能。

不能的地方

恶意程序无法读取其他服务预留的Cookie,所以也不能把这个Cookie泄漏。松了一口气是不?先别太放松。

能的地方

但是恶意程序向其他服务秘密提交的请求是可能附带原服务的Cookie的!也就是家门钥匙它配不走,但现场可以用,这不也完了吗?等会,还有一些技术概念要解释。

CORS (Cross Origin Resource Sharing)

下面讲到的这个概念就是网上资源可以跨域使用。举个例子,就是网站A可以嵌入网站B提供的资源,例如一个新闻网站,就算它没有你的物理定位信息,但可以嵌入一个天气网站的资源,假如你在天气网站预留了定位信息,新闻网站就可以呈现你本地的天气预报。所以说,网站A的Javascript向网站B的后端发的请求,可以附带网站B的Cookie,从而让网站B返回对用户定制化的数据。

但是,只要网站B有基本安全意识的话,是可以对跨域数据使用加限制的!限制程度从网站B提出,由浏览器来强制执行。最基本的,也是缺省就有的限制,就是这个跨域数据只能不加处理呈现给用户,网站A的Javascript是不可以用程序读取这片数据的,这也就堵住了隐私数据泄漏的缺口。

CSRF (Cross Site Request Forging)

上面说了,CORS由服务后端提要求,浏览器强制执行。但对于后端数据保护,单靠浏览器是不够可靠的,毕竟这个请求已经发到了后端,万一后端执行了什么操作,例如给坏人转钱什么的,不就完了吗?所以,对于有副作用的请求,通常是POST(表单提交)操作,还有另一个机制,就是CSRF保护,让第三方编造的表单数据显形。

有CSRF保护的表单,提交时不仅有Cookie,还有向用户呈现表单时现场动态生成,和用户会话对应的隐藏安全码。跨的域表单提交就算有Cookie,也不会有合法用户会话,更猜不出该发什么样的安全码,所以这个表单会被后端拒收!

万一后端没有合理的安全机制怎么办?首先,CORS和CSRF都是基本的安全措施,任何有素质的后端开发者都应该知道并使用。但是,我又没有检查腾讯的后端代码,万一他真没干,怎么办?

Firefox还有一层保护,就是TCP Total Cookie Protection. 这个保护在于,第三方Cookie,如上面例子中的网站B的Cookie,只要标签页的地址栏指向其他网站,压根就相当于不存在!这就完全断绝了跨域信息泄漏或瞎编请求的可能了。

Chrome呢?Chrome相应的功能在这里:CHIPS. 可惜,和Firefox不同,这个功能缺省是不打开的,所以绝大多数用户是不知道也没打开的。毕竟Google自己就是最大的广告商,而在网上打广告强烈依赖于使用第三方,也就是广告商自己的Cookie,从而才能在林林总总的不同来源的网页上嵌入定制广告呀。

Safari呢?Apple也有类似的保护机制:ITP Intelligent Tracking Prevention. 这个功能是缺省打开的,而且比Firefox实现的还早。但是,苹果还是想兼顾用户体验,所以没有完全屏蔽,而是通过一些智能算法选择性屏蔽第三方Cookie。我没有详细研究这个智能算法的原理,但应该不如Firefox 的完全保护让人放心。

当然,你也可以使用Chrome的Incognito模式,其他浏览器也有类似的隐私保护模式。但这样就彻底没有Cookie了,点进去在哪里都没有登录,确实很不方便。我只用Firefox,也不需要定制广告或其他嵌入式定制资源,所以TCP正合我意:所有第三方Cookie都没有,但本站Cookie都是有的,好的链接直接可用,坏人的链接没有危害。

那坏人能干啥?

我讲了这么多,都是说坏人这也做不了,那也做不了,但为什么还有这么多恶意邮件,骗你点击呢?他们想干啥?

他们最主要的目的,就是钓鱼。钓鱼,就是佯装成一个合理网站,骗你下载软件(内含木马),或输入个人信息,如用户名密码等。有了你的用户名和密码,他们就真的拿到了你家的钥匙,想干嘛就干嘛了。

我的原则是除了从自己的书签点进去之外,永远不手动输入用户名或密码。密码管理器是可以的,这是因为密码管理器预填的用户名密码来自用地址栏的地址查找出的条目,所以不会被相似域名所误导。举例而说,吐槽俱乐部可能给你发链接,点还是不点呢?当然点。这不是因为吐槽俱乐部值得信任,而是点进去后,就算你的Cookie过期,跳转到登录页,用户名和密码也不用手填。

这个原则推而广之,甚至很多明显是钓鱼网站的链接,我闲的无聊的时候我也会点。只要不输入我的个人信息,就不会出事。而且还有一个原因:坏人通常用一些Serverless技术的后台,这是因为他们通常打一枪换一个地方,流量有时很大,有时基本为零,所以Serverless技术的后台提供的高弹性正适合他们。但这些平台按次收费,单次访问的成本较高,所以我故意点,点进去还有时输入些乱码,不仅帮坏人花了成本,还污染了坏人的数据,多好。

工欲善其事,必先利其器。有一个你信赖的浏览器是在网上冲浪必不可少的工具。但是,小心不要点不好的链接是一个伪命题:不点,你如何知道好不好?点之后当然要小心,点之前不需要。正如我出门可能被车撞,所以要小心。我如果连门都不敢出,还需要小心个啥呢?

网上坏人很多,链接有问题的不在少数。但是如果点都不敢点,这互联网就没有意思了。