AWS Cognito 和 CORS 安全问题

Posted

技术标签:

【中文标题】AWS Cognito 和 CORS 安全问题【英文标题】:AWS Cognito and CORS Security Concern 【发布时间】:2018-06-16 20:26:19 【问题描述】:

我有一个 Web 客户端通过 AWS API Gateway 向 AWS Lambda 发出请求。我正在使用 AWS Cognito 和 Auth0 对用户进行身份验证。

我的问题与来自 AWS API Gateway 端点的 CORS 响应标头有关,特别是设置为任何“' * '”的 Access-Control-Allow-Origin 响应标头。本文指出了在我们的后端使用任何“' * '”参数的风险,即“黑客可以在我们的网站上请求任何方法”:(CORS Security link)。

虽然 Cognito 的身份验证可能证明发出请求的最终用户就是他所说的那个人,但 Cognito 的身份验证并不一定证明代表用户发出请求的网站是 mywebsite.com 而不是 attacker.com

Cognito 是否保证请求来自 mywebsite.com?

是否有一种安全的方法来实现任何“' * '”Access-Control-Allow-Origin 响应标头?

【问题讨论】:

“我的问题与发送到 AWS 的 POST 请求中的 CORS 标头有关” AWS 的哪个部分?认知服务,还是您的 API 网关端点? Access-Control-Allow-Origin 是响应标头,而不是请求标头,所以这不是“发送到”,而是“接收自”...从什么地方,究竟是什么? 这是一个响应标头,从 AWS API Gateway 端点接收。谢谢,我已经编辑了帖子。 【参考方案1】:

Cognito 是否保证请求来自 mywebsite.com?

没有。 Cognito 与您的域无关。它只关心用户身份验证/管理。

是否有一种安全的方法来实现任何“' * '”Access-Control-Allow-Origin 响应标头?

嗯,是的,不是的。正如您在帖子中所说,Cognito 将对用户进行身份验证所以这意味着设置了Access-Control-Allow-Origin: *,任何域都可以发出跨域请求,但如果他们不能提供有效的身份验证令牌,那么他们会得到 401错误返回。

如果要限制可以访问的域,则不能使用** 是通配符,因此允许任何值。因此,如果您只想让 mywebsite.com 能够发出 CORS 请求,则将 * 替换为 mywebsite.com。这使得它只允许来自该域的请求。来自attacker.com 的请求现在将失败,因为它们没有正确的标头。

【讨论】:

以上是关于AWS Cognito 和 CORS 安全问题的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地使用 AWS 放大

如何为 CORS 预检请求绕过 AWS API Gateway 代理资源上的 Cognito 授权方?

AWS Cognito 和 DynamoDB

AWS Cognito JWT 令牌验证

具有公共/私有访问权限的 Appsync 身份验证,无需 AWS Cognito

在静态网页上保护 AWS Cognito 用户池和客户端 ID