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 安全问题的主要内容,如果未能解决你的问题,请参考以下文章
如何为 CORS 预检请求绕过 AWS API Gateway 代理资源上的 Cognito 授权方?