深夜出门撸串?不好意思,给不了你这种安全感

共青团中央微博截图
截图的网页地址:https://m.weibo.cn/status/4125115450451265
唐山市公安局路北分局警情通报
来源:https://m.weibo.cn/detail/4778869062633148

最近唐山烧烤店打人事件让不少人想起了共青团中央 2017 年发的一条微博。或许有人会说这是“恶意翻书”,但人们想起来这条微博更可能是因为一些要素引起了联想:“凌晨两点”、“撸串”、“催命符”……

有人觉得这是名副其实的“打脸”行为。但也许一些人错误解读了这条微博,或多或少产生了幻想。因为从文字本身来看,这条微博的内容只不过:

  • 凌晨两点在路边撸串,半夜独自外出……这些行为在中国是习以为常的生活方式;
  • 凌晨两点在路边撸串,半夜独自外出……这些行为在美国可能成为催命符;
  • 深夜出门,在国外不像在中国这么简单;
  • 美国给不了你深夜出门撸串的安全感。

瞧,这条微博的内容只有这些,再没有其他的东西了。别的意思都是读者自己的想法,而不是微博本身的内容。

下面两点认识有助于避免进入误区:

  • 习以为常的行为不一定是安全的行为。
  • 生活中的很多事情不能当作对立事件来看待。

习以为常是指某种事情经常去做,或某种现象经常看到,也就觉得很平常了。比如某人乘坐机动车时经常不系安全带,也一直没遇到什么事故,他/她对不系安全带习以为常,但我们并不能由此推出这种行为是安全的。

对立事件是指其中必有一个发生的两个互斥事件,互斥事件是指不可能同时发生的事件。比如从一个只有黑球和白球的袋子里任取一个球,“取出的球是黑球”和“取出的球是白球”为一组对立事件;如果取出的不是黑球,那么就一定是白球,反之亦然。而从世界上所有人中随机选择两个人 A 和 B,“A 出生于越南”和“B 出生于印度”既非对立事件又非互斥事件;无论 A 出生在哪里,我们都无法由此得知 B 的出生地,这两者并不相关。

无论对于“凌晨两点在路边撸串,半夜独自外出”多么习以为常,都不能说明这种行为本身是否安全。就算“美国给不了你深夜出门撸串的安全感”,也不会影响“美国之外的某个地方能否给你深夜出门撸串的安全感”。

网站使用 CDN 之后获取访客原 IP 的方法

网络上大多数教程给出的方法都是通过修改程序代码,直接取 X-Forwarded-For 等请求标头的值替换原来 REMOTE_ADDR 变量的值作为原 IP,这种做法有很大的安全隐患,我认为不值得提倡。

安全隐患

根据 RFC 3875 文件,REMOTE_ADDR 变量的值必须为发送请求到服务器的客户端的网络地址。在实践中 REMOTE_ADDR 变量的值往往由服务器直接设置为发送请求的客户端网络地址,而不是由客户端提供,因此其真实性有保证。

与 REMOTE_ADDR 变量不同,X-Forwarded-For 请求标头的值不是由服务器直接决定,而可以由客户端自行设置,实践中一般由代理服务器在转发请求时设置。因为 X-Forwarded-For 请求标头的值可能被客户端伪造,所以不应该轻易相信其真实性。

由于 REMOTE_ADDR 变量的值和 X-Forwarded-For 请求标头的值具有不同的可信度,使用低可信度 X-Forwarded-For 请求标头的值去替换高可信度 REMOTE_ADDR 变量的值便会产生不可忽视的安全隐患。比如,攻击者可以通过伪造 X-Forwarded-For 请求标头来绕过基于 IP 的频率限制、访问控制。更进一步,攻击者还可以构造具有危害性 X-Forwarded-For 请求标头来对服务器进行多种攻击,例如注入恶意代码进行 XSS 攻击就是一种可能的行为。

正确做法

在使用 X-Forwarded-For 请求标头的值之前应该确保其内容可信。因为 X-Forwarded-For 请求标头一般由代理服务器添加,所以至少应该先确认请求来自可信的代理服务器才可使用 X-Forwarded-For 标头的值。

对于使用 CDN 的网站,如果服务器是 nginx,那么在 ngx_http_realip_module 模块的帮助下这一过程将会十分简单。只需编辑相应的 nginx 配置文件,在其中的 http、server 或 location 段,使用 set_real_ip_from 指定可信代理服务器地址(即 CDN 节点的地址),然后使用 real_ip_header 指明一个请求标头(即 X-Forwarded-For 标头),保存并重载 nginx 使配置生效。这样 nginx 收到请求后会检查请求的 REMOTE_ADDR 是否与 set_real_ip_from 相符,如果相符,nginx 会用 real_ip_header 对应标头的值替换 REMOTE_ADDR 原有的值,后端程序只需要正常使用 REMOTE_ADDR 的值即可。这种做法一般不需要改变后端程序。

参考资料

看到亚马逊停止 Kindle 电子书店在中国运营的消息有感

对于 Kindle 中国区用户:从 2023 年 6 月 30 日起将不能购买新的电子书,但仍可下载此前已购买的电子书;从 2024 年 6 月 30 日起将不能从 Kindle 下载任何电子书,只可阅读设备上已经下载的电子书。

亚马逊的这次调整算不上突然。早在半年前,国内主要电商平台的 Kindle 就已经开始缺货,那时是 2022 年 1 月左右。虽然这次亚马逊的通知中提到每位用户可以在 2022 年 10 月 31 日之前退回至多 3 台于 2022 年 1 月 1 日及以后从国内授权经销渠道购买的至今没有质量问题及人为损坏的 Kindle 设备,但实际上能满足亚马逊退货条件的用户并不多。因为国内授权经销渠道在 2022 年 1 月之后基本都是缺货状态,所以大部分满足时间要求的用户都是从非国内授权经销渠道购买到 Kindle 设备的。

之前我就说过纸质书比 Kindle 电子书更可靠,不过那时并没有太多实例。这次 Kindle 电子书店在中国停止运营为我的“反电子书”观点提供了新的证据支持。不要简单地将这次事件视作一家国际公司的区域性运营调整。问题的根源不在这家公司,而在当前的电子书商业运作模式。只不过亚马逊在这个行业中一直扮演着“老大”的角色,所以问题最先从它身上暴露出来。我相信如果当前这种电子书商业运作模式不改变,那么支撑我“反电子书”观点的证据还会越来越多。