如何确保只有我的单页应用程序可以向 API 发出请求

信息安全 Web应用程序 单页应用
2021-08-28 23:21:34

我有一个可以为多个 Web 客户端提供服务的 REST API。

我想确保只有 my-one-and-only-web-cleint.com 上的单页应用程序可以向我的 API 发出请求。我该怎么做呢?

现在没有什么可以阻止某人复制我的网站的源代码并充当我在 my-one-and-only-web-cleint.com 上的单页应用程序的副本。

我现在唯一的检查是:

  • 在服务器端:我检查请求标头的来源,只允许来自 my-one-and-only-web-cleint.com 的请求

但是我的理解是可以手动更改表头,所以可以绕过这个检查。

2个回答

这听起来像是防止CSRF攻击。同源策略会已经阻止你的API中的任何东西从另一个域被读取,但要防止,使更改你的系统,你将需要防范CSRF请求。

在服务器端:我检查请求标头的来源,只允许来自 my-one-and-only-web-cleint.com 的请求

检查Origin标题或自定义标题X-Requested-With击败 CSRF有效方法

攻击者无法在 Web 浏览器中伪造此标头,因此任何连接到他已连接到您的 API 的攻击者站点的人都将无法使用它,因为他们的浏览器标头无法被篡改。

您还应该依靠授权系统来防止攻击者在服务器端发出 API 请求(他们可以在其中设置他们想要的任何标头)。

这听起来类似于 CSRF 攻击的情况,因此应该可以使用防伪令牌来解决。

防伪令牌应该可以满足您的需求。每次收到 Web 请求时,都会将防伪令牌作为 FORM、脚本或 Web 应用程序的一部分提供给客户端。令牌嵌入日期、登录 ID 和客户端 IP 等值,并使用只有您的服务器知道的密钥进行加密。然后,您只处理包含有效令牌的请求。

中间人无法修改您的网站并将其 API 托管在他们的网站上,因为他们将无法提供有效的令牌。

这是有关如何在 ASP.NET 中执行此操作的更多信息,但同样适用于其他语言。

http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/