
OLX 密码重置流程的邮箱打码被批毫无意义
来源标题:Security doesn't (always) have to be so fucking annoying
OLX 的密码重置表单在用户输入邮箱后显示打码后的地址,但该打码内容直接由用户刚输入的字符生成,无法提供任何额外保护。作者批评这种设计让用户操作更繁琐,却对攻击者毫无作用。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
它本不必如此。真的不必。
我最在乎的是用户使用产品时的体验——是的,甚至比安全更在乎。正如我在别处写过的,如果你拥有世界上最好的系统,却让用户在使用时想死,那它就称不上世界上最好的系统。让用户痛苦、对攻击者却毫无作用的安全措施,与我关心的一切背道而驰。
我忘了 OLX 的密码,用了重置表单,它说会给我发一个验证码。我填了进去:
o***@j***。不错!我的邮箱地址不会被……我自己看到?
这种“安全”到底是怎么被实现出来的?
打码后的版本完全就是根据我刚输入的内容生成的,所以它不可能泄露任何我本来不知道的信息(而如果有人在我背后偷看,那他们刚刚就看着我把它打出来了——旁边还配了个漂亮的绿色对勾,确认这是个有效的邮箱地址呢!谢谢啊!)
一想到开发者,或者更糟,安全团队,看到这个流程,然后心想“哦对,我们真的把机器给加固了!复选框都打勾了,庆祝一下吧”,我就难受。
然而它真正做到的,是让我无法知道自己有没有打错字。我打的是 joshua.hu 还是 jsohua.hu?是 olx@ 还是 olz@?谁知道呢;OLX 甚至连顶级域名都不显示。所以当邮件没到时,我就可以玩一个特别有趣的猜谜游戏:是我打错了邮箱地址?是进了垃圾邮件?是 OLX 的邮件就是慢?还是因为根本没有用这个邮箱注册的账户,OLX 压根就没发?谁知道呢!
还有,表单问我要把验证码发到哪里,然后这个页面却说它发了一个链接。是的,我这是在吹毛求疵,但 UX 的一致性很重要。
当然,也许我们不能怪 OLX 的安全团队。也许该怪的是那些 AI 工程师开发者——在精神错乱的强力驱使下,再加上一剂极端的达克效应,他们以为自己做了件有用的事。
我以前谈过这类事情。让我引用一下:
用 AI 编程的非程序员,实际上就是一群带着技术人员式过度自信的非技术人员。恰当的培训能把这些变成懂技术的程序员。传统的培训方法和材料行不通,因为它们是以技术人员为对象、为他们而设计的。
这让我开始思考网站上其他那些让我停下来琢磨“这到底是想拦住谁?”的“安全”功能。它从来都拦不住攻击者——攻击者根本不在乎——它拦住的永远只是……我。所以,下面是我最喜欢的几个。
禁止往密码框里粘贴的网站。有时候只是禁止往“确认密码”框里粘贴,这不知怎么地还更糟。理由永远是“安全”,但到底防的是什么呢?是啊,这个大家都懂。
同样的套路,但用在验证码上。一个六位数的验证码发到了我邮箱,我复制它,而网站的输入框是六个独立的小框,每个只接受一个字符。粘贴要么毫无反应,要么把第一位数字放进第一个框,剩下的全扔掉。太棒了!验证码就在我屏幕上;任何拿到它的人都能打出六位数字。
“您的密码长度必须在 8 到 16 个字符之间,且包含一个大写字母、一个小写字母、一个数字和一个特殊字符。特殊字符不得包含 <、>、&、'、" 或空格。”
我的密码管理器生成的 40 位随机密码?被拒了。
银行(而且似乎真的只有银行?)登录要求“输入你密码的第 2、5、9 位字符”。哈哈什么鬼?这是不是意味着他们存的不是整个密码的哈希?这难道不也缩小了(真正的)暴力破解的搜索空间吗(虽然在现实世界里这并不怎么相关,但管他呢)?与此同时,把你整个密码偷走的那家伙……也同样拿到了那几个特定字符。
因为我的手机上启用了开发者选项就拒绝启动的银行 App。而等我把它关掉之后,又开始禁止截图的银行 App。我刚给某人付了款,他们想要凭证,而 App 不让我截图确认页。我只能去按“下载凭证”,等一个 PDF 生成出来,再发给他们——而那个 PDF 里包含的信息跟截图一模一样。我的余额也一样:不能截图,但这里有个 PDF。
说到 PDF:银行对账单以受密码保护的 PDF 形式通过邮件发送,而密码是我的出生日期。或者更妙,密码在三十秒后发到同一个收件箱的第二封邮件里。能读第一封邮件的人,就能读第二封。
禁用右键和文本选择,“以保护我们的内容”。内容就在我浏览器已经下载好的 HTML 里。查看源代码、阅读模式、截图、curl,或者干脆禁用 JavaScript 浏览。唯一被真正禁用的,是我复制一个快递单号的能力。
这个不算真正的安全边界(GitHub 也没假装它是),但它太精彩了,不能漏掉:GitHub Actions 在日志中遮蔽密钥的方式,是在密钥值出现的任何地方替换它。如果某个密钥的值恰好是 production,那么每一行日志里的每个“production”都会变成 ***。与此同时,echo "$SECRET" | base64 却能完好地打印出密钥:GitHub 也会遮蔽 base64,但 echo 会加一个换行符,这会改变任何长度不是三的倍数的密钥的编码(production 就是其中之一)。
空闲超时,不把打字算作活动,而且只在你花了二十分钟填完表单、按下“提交”之后才告诉你已被登出。空闲超时在共享电脑和高风险系统上是合理的;悄悄把我干的活扔进垃圾桶,在任何地方都不合理。在过期前提醒我,或者保存个草稿,或者随便做点什么。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。