应如何显示注册表单错误响应

How should signup form error responses be displayed

我有一个基于订阅的应用程序,它是使用 MERN 构建的。我最近提交了应用程序进行安全测试,我收到的回复之一是应用程序不应具体告诉用户为什么他们的注册申请在所有情况下都被拒绝。例如,如果他们输入已注册的用户名或电子邮件,我不应该 return 显示“抱歉,此用户名已注册”的错误消息,因为这将允许用户构建列表已在我们网站注册的用户和电子邮件。

我明白为什么我们需要阻止这种情况,但我不明白我如何告诉用户为什么注册提交失败而不告诉他们这是因为该电子邮件已经注册。在不给他们具体理由的情况下拒绝他们的注册表单似乎毫无意义,有人知道这里最好的做法是什么吗?

I have a subscription based application that is build using MERN

您使用 MongoDB、Express、React 和 NodeJS 的事实与您的 end-users 和访问者如何使用您的产品无关。

I've recently submitted the application to be security tested...

当心 - 我遇到的大多数“安全顾问”提供的只是运行一些针对网站的商品脚本和漏洞扫描器进行“分析”然后轻轻 touch-up 生成的报告,使它们看起来 hand-written.

one of the responses that I received was that the application should not specifically tell the user why their signup application has been rejected for all cases

Hnnnng - 不是在“所有”情况下,是的 - 但不幸的是,可用性和安全性往往是跷跷板的两端,你需要仔细平衡。

如果您是 non-expert 或其他缺乏经验的人,我会向您的 security-consultant 索取他们认为可能有害 information-disclosure 的那些情况的详尽清单,然后您应该 运行 您的 UX 团队(和您的法律团队)列出的 weigh-in.

我要补充(如果不是强调的话)web-application 安全场景充满了 security-theatre 和 cargo-cult-programming 实践,并且糟糕和过时的建议在人们脑海中停留了太久(例如,还记得每个人过去是如何坚持每 ~90 天更改一次密码的吗?not anymore: it turns out that due to human-factors reasons that changing passwords frequently is often less secure)。

For example, if they enter a username or email that has already been registered, I shouldn't return an error message that says "Sorry, this username is already registered", as this would allow the user to build a list of users and emails that have registered with our site.

在考虑任何具体情况之前,首先要考虑你的 web-application 和你的 threat-model 的性质,并问问自己 user-experience 最终的损害是否与安全收益相称,或者即使获得了任何实际的安全保障。

例如,并专门使用该问题(即如果用户名 and/or e-mail 地址已经是 in-use,则不在注册页面上通知用户),我认为对于具有 general-audience 的 public 互联网网站, 用户名 (即 login-names、screen-names 等)不是特别敏感,并且它们通常是可变的,因此披露用户名是否已被占用并没有真正的 end-user 危害。

...但是 user-accounts 数据库中 e-mail 地址的存在或详细信息通常 不应该 透露给未经身份验证的访问者。 但是,我认为这真的不可能对访问者隐藏:如果有人使用完全有效的数据填写您的注册表(除了已经-in-use e-mail 地址)并且网站以模糊或完全无用的错误消息拒绝注册尝试,那么新手用户将会感到沮丧并且 give-up(并认为您的网站 刚刚损坏 ),而恶意用户(甚至对 web-application 的工作原理有基本了解)会立即知道这是因为 e-mail 地址是 in-use,因为在他们提交时它会起作用一个不同的 e-mail 地址 - 因此:您实际上并没有获得任何安全利益,同时由于您的注册过程非常困难而失去业务。

但是,考虑替代方法

针对此问题的一种可能的替代方法是使注册看起来成功,但在恶意用户验证 e-mail 通过电子邮件 link 地址(如果不是他们的地址,他们将无法做到),如果只是 novice-user 已经注册但没有意识到只需给他们发一封电子邮件,提醒他们这一事实。这种方法在 social-media 网站上可能更可取,因为在该网站上不泄露与任何其他用户的 PII 相关的任何内容很重要 - 但这种方法可能不适合 line-of-business 系统。

另一种替代方法:没有自己的注册系统:只需使用 OIDC,让用户通过 Google、Facebook、Apple 等进行身份验证和注册。这也使您的用户不必记住另一个密码。

至于 information-harvesting 的风险:我很欣赏 brute-force 大量 form-submissions 的机器人听起来很适合从不泄露信息,更好的解决方案是只添加验证码并添加到 rate-limit 客户端(通过限制总数 requests-per-hour 以及在用户注册处理中人为延迟(例如,人类通常不关心注册表单 POST 是否需要 500 毫秒或 1500 毫秒,但这 1000 毫秒的差异将极大地影响机器人。

在我构建 web-application 的所有时间里,我从未遇到过通过自动注册表或登录表单提交对 information-harvesting 的任何认真尝试:它总是只是营销垃圾邮件,并添加验证码(即使没有 rate-limiting)也足以结束这种情况。

(我 看到 在 information-harvesting 的“non-serious” 尝试是手动 non-technical human-users 之类的事情“ brute-forcing" 他们自己通过键盘输入:他们都 give-up 经过几十次尝试)。

I understand why we need to prevent this, but I don't understand how I can tell the user why there signup submission failed without telling them that it's because that email has already been registered. It seems pointless to reject their signup form without giving them a specific reason, does anyone know what the best thing to do here is?

我感觉你可能被你的安全“顾问”骗了 making-up 在他们给你的报告中夸大了风险 - 而不是你的 web-application 实际上有被利用的风险。