CORS - localhost作为生产中允许的来源

Dev*_*ams 15 security rest webserver http cors

有时,在对生产中的错误进行故障排除时,能够从我的本地开发环境中访问我们的生产REST服务器会很方便.但我担心将localhost添加到允许的来源将是一个安全风险.搜索产生了相互矛盾的信息.我的担忧有效吗?为什么或者为什么不?

Sil*_*Fox 16

我假设你有

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://localhost
Run Code Online (Sandbox Code Playgroud)

风险在于,在用户计算机上运行的任何服务都可以有效地绕过您站点的同源策略.

所以,如果你有一个REST URL,如

https://example.com/User/GetUserDetails
Run Code Online (Sandbox Code Playgroud)

在用户的计算机上运行的恶意或受损服务可以通过用户的浏览器发出该请求,然后获取有关用户的详细信息,因为他们的身份验证cookie将随请求一起传递.

现在,您可以争辩说,在用户计算机上运行的恶意服务可以直接从浏览器中获取身份验证cookie,然后自行发出请求.但是,如果该服务有自己的一些缺陷(比如XSS),这可能允许另一个站点通过您的REST服务(evil.example.org --XSS-> localhost -CORS-> example.com/User/GetUserDetails)破坏用户.

如果用户正在运行本地反向代理来访问某些内容,则可能会使您面临风险.如果目标站点是恶意的或受到攻击,这将使目标站点能够通过您的站点危害用户.这是因为用户将使用域访问目标站点localhost.

如果您确实需要这样做,我建议您为REST服务设置一个特殊的开发人员帐户,访问时Access-Control-Allow-Origin: https://localhost只会将标头添加到您的请求中.这样,您就不会让其他用户面临风险,因为您知道您只是在运行前端服务器,https://localhost因此您不会被开放的CORS设置所破坏.

另一种方法可能是使用类似于noonewouldusethis2859282.localhost您的本地前端副本的东西.然后你可以安全地添加Access-Control-Allow-Origin: https://noonewouldusethis2859282.localhost标题,因为没有其他人会使用它,并且可以安全地免受CORS攻击.

  • @Eliran - 恢复您的编辑,因为它们改变了我答案的含义。请参阅 https://security.stackexchange.com/a/97938/8340 - CORS 是关于读取数据,而不是提交数据(即 CSRF)。如果配置不正确,CORS 当然可以允许读取 CSRF 令牌,但是,这不是我在这里要传达的内容(“GetUserDetails”是读取操作,而不是写入操作)。 (2认同)

Chr*_*nzo 12

将 localhost 添加到生产中的 CORS 设置没有安全问题。

通过添加类似的东西:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:3000
Run Code Online (Sandbox Code Playgroud)

现在允许浏览器从 localhost:3000 调用您的服务,绕过Same Origin Policy。现在,任何 Web 开发人员都可以创建一个在本地机器上运行的网页,以调用您的 API,这对您的团队很有用。但是, localhost 不是可公开路由的地址- 您不能共享指向http://localhost:3000的链接。请记住,CORS 只是 Web 浏览器调用您的站点的一种安全措施。任何人仍然可以通过服务器到服务器调用(或脚本)调用您的端点。但是,您应该避免

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

这将使您的网站可用于每个网站。相反,将您锁定Access-Control-Allow-Origin到需要它的站点。不幸的是,Access-Control-Allow-Origin只需要一个值,所以你必须处理 HOST 请求服务器端并返回有效的(更多信息)。

调用 CORS 端点时的身份验证

当您发出需要身份验证的 CORS 请求时,您应该向Authorization调用添加一个标头,而不是传递 cookie - fetch 默认执行此操作。因此,对 COR 端点的任何调用都将通过 javascript 添加一个令牌到它只具有该会话的标头来进行。如果您确实通过 cookie 或 localstorage 存储令牌,请注意它只能从该域访问(更多信息)。您的生产端点和 localhost 将不会具有相同的 cookie 和共享的本地存储。

在 Chrome 中禁用 CORS

最后,您可以通过以--disable-web-security(更多信息)启动 Chrome 来从 Chrome 向任何站点发出 CORS 请求。

最后,谷歌浏览器只允许服务工作者在安全网站和http://localhost 上运行。如果您选择创建一个 local.example.com 进行开发,则需要创建一个 SSL 证书并在本地计算机上进行所有配置以使其运行。我建议只使用http://localhost:XXXX