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

Rest CORS-本地主机作为生产中允许的源,rest,security,http,webserver,cors,Rest,Security,Http,Webserver,Cors,偶尔在对生产中的bug进行故障排除时,可以方便地从我的本地开发环境中访问我们的生产REST服务器。但我担心将localhost添加到允许的源中会带来安全风险。搜索结果产生了相互冲突的信息。我的担心有效吗?为什么?为什么不?我想你有 Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: https://localhost 风险在于,在用户机器上运行的任何服务都可能有效地绕过您的站点 因此,如果您有一个REST UR

偶尔在对生产中的bug进行故障排除时,可以方便地从我的本地开发环境中访问我们的生产REST服务器。但我担心将localhost添加到允许的源中会带来安全风险。搜索结果产生了相互冲突的信息。我的担心有效吗?为什么?为什么不?

我想你有

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://localhost
风险在于,在用户机器上运行的任何服务都可能有效地绕过您的站点

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

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

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

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

如果您真的需要这样做,我建议您为您的REST服务提供一个特殊的开发人员帐户,当访问该帐户时,会添加
访问控制允许源代码:https://localhost
标题仅适用于您的请求。这样,您就不会让其他用户面临风险,因为您知道您只在
https://localhost
这样您就不会受到开放CORS设置的影响


另一种方法可能是对前端的本地副本使用类似于
noowouldusethis2859282.localhost
的内容。然后您可以安全地添加
访问控制允许原点:https://noonewouldusethis2859282.localhost
头,因为没有其他人会使用它,并且不会受到CORS攻击。

在生产环境中将localhost添加到CORS设置中没有安全问题

通过添加以下内容:

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

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
这将使您的网站可用于每个网站。相反,锁定您的
访问控制,允许源站
访问需要它的站点。不幸的是,
accesscontrolalloworigin
只接受一个值,所以您必须在服务器端处理主机请求并返回有效值()

调用CORS端点时的身份验证 当您发出需要身份验证的CORS请求时,您应该向呼叫添加
授权
头,而不是传递cookie- . 因此,对CORs端点的任何调用都将通过javascript进行,并在头中添加一个令牌,该令牌仅用于该会话。如果您确实通过cookie或localstorage存储令牌,请注意它只能从该域()访问。您的生产端点和本地主机将不具有相同的cookie和共享本地存储

在Chrome中禁用CORS 最后,通过使用
--禁用web安全性
()启动Chrome,您可以从Chrome向任何站点发出CORS请求


最后,Google Chrome只允许服务人员在安全的网站和网站上运行。如果您选择创建一个local.example.com进行开发,则需要创建一个SSL证书,并在本地计算机上执行所有配置以使其运行。我建议您只使用。

@Eliran-当您的编辑更改了我答案的含义时,请将其还原。请参阅-CORS是关于读取数据,而不是提交数据(即CSRF)。如果配置不正确,CORS当然可以允许读取CSRF令牌,但是,这不是我在这里要表达的(
GetUserDetails
是一个读取操作,而不是写入)。哦,对不起,我无意中认为语义是错误的。thanx用于澄清:)