CORS - 本地主机作为生产中允许的来源

CORS - localhost as allowed origin in production

有时在排除生产中的错误时,能够从我的本地开发环境访问我们的生产 REST 服务器会很方便。但我担心将本地主机添加到允许的来源会带来安全风险。搜索产生了相互矛盾的信息。我的担心有道理吗?为什么或为什么不?

我假设你有

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://localhost

风险在于用户计算机上的任何服务 运行 都可以有效地绕过您站点的 Same Origin Policy

因此,如果您有 REST URL,例如

https://example.com/User/GetUserDetails

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

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

如果用户是 运行 访问某些内容的本地反向代理,则可能会使您面临风险的另一种情况。如果该目标站点是恶意的或被破坏,这将使目标站点能够通过您的站点危害用户。这是因为用户将访问域为 localhost.

的目标站点

如果您真的需要这样做,我建议您为您的 REST 服务创建一个特殊的开发者帐户,当访问该帐户时,仅将 Access-Control-Allow-Origin: https://localhost header 添加到您的请求中。这样,您就不会将其他用户置于危险之中,因为您知道您只是 运行 front-end 服务器 https://localhost,因此您不会受到开放 CORS 设置的影响。

另一种方法可能是对 front-end 的本地副本使用 noonewouldusethis2859282.localhost 之类的东西。然后你可以安全地添加 Access-Control-Allow-Origin: https://noonewouldusethis2859282.localhost header 因为没有其他人会使用它并且不会受到 CORS 攻击。

在生产中将本地主机添加到您的 CORS 设置中没有安全问题。

通过添加如下内容:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:3000

现在允许浏览器从 localhost:3000 调用您的服务,绕过 Same Origin Policy. Any web developer can now create a webpage running from their local machine to make a call to your API, which is useful for your team. However, localhost is not a publicly routable address - You can't share a link to http://localhost:3000。请记住,CORS 只是 Web 浏览器调用您网站的一种安全措施。任何人仍然可以通过服务器到服务器调用(或脚本)来调用您的端点。但是,您应该避免:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *

这将使您的网站可供所有网站使用。相反,将您的 Access-Control-Allow-Origin 锁定在需要它的网站上。不幸的是,Access-Control-Allow-Origin 只需要一个值,所以你必须处理 HOST 请求服务器端和 return 有效的请求(more info)。

调用 CORS 端点时进行身份验证

当您发出需要身份验证的 CORS 请求时,您应该在调用中添加 Authorization header,而不是传递 cookie - fetch does this by default. Thus any calls made to a CORs end point would be made via javascript adding a token to the header that it only has for that session. If you do store the token via a cookie or localstorage, note that its only accessible from that domain (more info)。您的生产端点和本地主机将不会有相同的 cookie 和共享本地存储。

在 Chrome

中禁用 CORS

最后,您可以从 Chrome 向任何站点发出 CORS 请求,方法是从 Chrome 开始 --disable-web-security (more info)。

最后,Google Chrome 只允许服务人员在安全网站上 运行 和 http://localhost. If you choose to create a local.example.com for development, you'll need to create an SSL cert and do all the configuration on your local machine to get that running. I recommend just using http://localhost:XXXX.