如何使用CORS保护REST API?

6
我正在开发一个Web应用程序,其中数据将通过REST API对前端和各种客户端(curl和其他工具)可访问。前端和后端都在同一域上。我想使用CORS来保护我的前端,这给我带来了困境。如果我将Access-Control-Allow-Origin设置为*,那么所有其他客户端都将能够访问API,但是我的前端将更加容易受到攻击。另一方面,将其设置为我的域名会强制客户端提供(伪造的)Origin标头,并有效地禁止使用浏览器作为客户端(通过不同域上的前端)。
这通常如何解决?我应该为API使用两个不同的端点,一个用于公共访问,另一个用于与我的前端一起使用吗?我需要一些建议。

你的客户端(前端和其他客户端)是否可以访问不同的功能,或者当你调用相同的函数时,你会返回不同的数据(例如:更多数据到你的网站)? - Kevin H.
不,功能是一样的。当然,每个用户都经过身份验证,因此每个用户的数据都不同(但每个用户都可以使用我的前端或他们自己的客户端,他们将获得相同的数据)。 - johndodo
2个回答

5
我希望使用CORS保护我的前端。
CORS不能保护前端的任何内容,它只是一种防止未经授权的网站进行跨站点脚本攻击的方式。CORS标头仅对浏览器的XHR调用有效。这不会阻止资源的直接加载。
如果我将Access-Control-Allow-Origin设置为*,则所有其他客户端都将能够访问API,但是我的前端将更加容易受到攻击。
在我看来,你的前端将像以前一样可以访问。CORS标头仅对浏览器的XHR调用有效。
另一方面,将其设置为我的域会强制客户端提供(虚假的)Origin标头,并且有效地禁止使用浏览器作为客户端(通过不同域上的前端)。
不是真的。有几个选项:
- 您可以为每个API客户端拥有允许的主机列表(有效地基于客户端身份验证设置起源标头)。这就是许多API提供者所做的(例如FB,Google,Amazon等)。 - 浏览器(在XHR调用中)发送Origin标头,您可以检查并发送或拒绝Origin标头中的主机名。 - 非浏览器客户端不受CORS标头限制。
我应该为API使用两个不同的端点,一个用于公共访问,另一个用于与我的前端一起使用吗?我希望得到一些建议。
如评论所述-假设功能相同并且用户已经通过身份验证,则在内部/公共使用之间没有分离服务的必要。这些都是针对特定问题的答案,但我仍然不确定您想要实现什么/为什么/如何实现清楚。

4
CORS只与浏览器和HTML有关,curl不关心它。因此,如果您将服务限制为仅从您的域访问,则其他站点将无法访问它。为了使您的服务对它们可用-那些站点可以设置nginx或apache来转发一些流量到您的服务。因此,第三方站点将访问其自己配置了CORS的主机,并且该主机将与您的服务通信。
另一个(类似的)解决方案是为您设置两个主机名(子域?),这些主机名指向相同的服务。并公开一个给您自己的站点(具有严格的CORS),而另一个则为外部客户端公开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接