在没有凭据的情况下保护 API 路由

Secure an API route without credentials

我有一个表格可以检查电子邮件是否已经在我的数据库中 (/api/user?email=user@example.com),如果是,它会回复他们的信息。

我似乎无法找到一种方法来保护我的 API 路线免受邮递员的攻击,而只是暴力破解 GET https://example.com/api/user?email=name@domain.com和收集个人信息。

我不需要任何登录凭据就需要此功能。我知道必须有一个行业标准的方法来做到这一点。有些保险公司会用他们的表格来做这件事。 (例如,一旦您输入您的电子邮件,就会用您的名字问候您并要求您完成表格填写。)

换句话说 - 我需要我的 api 路由以某种方式区分发出这些请求的合法浏览器或具有不同意图的人。

没有凭据,就没有 100% 可靠的方法来验证来自用户的真实请求与来自其他人或其他地方的请求。 “行业标准”是一定程度的个人数据,无需任何验证即可公开,例如您提到的保险提供商。

有一些方法可以缓解这种情况,例如检查请求 headers;特别是 origin、referrer、user-agent 等,但如果确实需要,所有这些仍然可以被绕过。如果我处在你的位置,并且“绝对不需要凭据来验证请求”,我只会 return 仅提供少量信息,例如电子邮件和名字,这与还有什么。

没有标准,但你可以保护你的路线免受暴力攻击:

  1. 添加速率限制以避免来自小范围 IP 的暴力破解
  2. 添加验证码检查以避免非客户端请求和廉价机器人。
  3. 为每个用户生成会话(或散列 url)并仅允许具有会话的用户通过输入电子邮件来完成表单
  4. 使用csrf token避免非客户端请求