CORS目的并非保护API端点 - nikofischer


CORS 不会保护API端点免受攻击,因为您始终可以在浏览器之外发出相同的请求,而且它不会保护任何站点防止跨站点请求,因为CORS始终可以在服务器端禁用。
CORS可以防止恶意网站欺骗未经修改的浏览器对合法网站进行跨站请求的情况。如果用户有合法网站的认证cookie,cookie将与请求一起被发送。因此,恶意网站可以代表用户在合法网站上进行交易,尽管它不能直接访问认证cookie。

CORS进一步复杂化,因为某些形式的跨站请求一直被浏览器所允许,因此为了向后兼容,必须保持默认启用。对不同网站的GET请求是允许的,因为这一直是被允许的,例如嵌入其他域的图像。POST请求是允许的,但要注意不能检查结果,因为你一直能够从一个html表单中发起一个帖子到不同的网站。
 
这篇文章是因为我正在寻找将 Vue APP 验证到 Drupal 后端的方法。Designkojo 的文章是最早出现在搜索引擎顶部的文章之一。此外,这篇文章有魅力:描述得很好,简洁。特别是对于初学者来说,所描述的方法易于实施。它表明:通过 API 密钥进行身份验证是 Web 应用程序的常用方式。这就是它变得危险的地方:尤其是没有经验的开发人员可能会上当,并认为这是通过 Web 应用程序向后端进行身份验证的常用方法。
文章中介绍的设置:后端由 Drupal 提供。Drupal 从版本 8 开始在核心中集成了 JSON API,可以通过模块管理轻松激活。有了这个,现在可以访问所有实体(例如用户、节点等)并通过 GET 请求读取它们。
JSON API 基于 Drupal 系统中定义的权限。因此,如果用户对某个内容没有读取权限,则该内容也无法通过 JSON API 加载。写访问也是如此:只有当访问用户具有适当的权限时,才能创建、修改或删除实体。
作者描述了他如何在客户端 Vue 应用程序中访问 Drupal 后端以创建内容。只有登录的用户才能创建文章。因此,为了通过 JSON API 创建文章,他必须首先验证自己。
有几种方法可以向 Drupal 进行身份验证。通常的方法是通过用户名和密码。这不仅可以直接通过前端实现,也可以通过 API 实现。此处 Drupal 在成功验证后返回一个会话 ID,您可以将其缓存并用于所有进一步的请求。
作者现在使用了另一种方式:他安装了Key auth模块。这将为后端中的每个用户创建一个 API 密钥,可用于对 API 的身份验证。为此,必须将参数“api-key”与键作为每次调用的值一起传递。这样,用户就会在 Drupal 中自动进行身份验证,并拥有所有分配的权限。文章中描述的“Key auth”模块只是用户名和密码的替代品。
在这里他犯了一个危险的错误:他将来自 Drupal 后端的 API 密钥集成到他的 Vue.js 应用程序中,以便能够对 API 进行身份验证并创建内容。Vue.js 应用程序在用户浏览器的客户端执行。这意味着源代码是从服务器直接发送到浏览器的。现在,用户可以完全访问源代码,还可以读取其中包含的身份验证密钥。
 
CORS 设置确保只能从某个站点域名访问后端?
没有!没有 CORS是在浏览器中的一种实现,旨在通过确保浏览器中的资源只允许访问特定的端点来保护用户免受恶意应用程序的侵害。

这种浏览器的实现可以在任何时候被绕过。首先,这取决于浏览器本身:如果CORS没有被集成,或者没有被干净地集成,那么它将无法工作。服务器发送一个 CORS 标头,由浏览器决定如何处理它。这不是一个安全要素,因为在这里拒绝访问不在服务器的手中,而完全在浏览器的手中。
攻击者可以通过 Web 应用程序的源代码访问 API 密钥并使用它,例如通过 cURL 请求直接访问后端的 API 资源。使用 cURL,没有 CORS 生效,因此攻击者可以直接访问用户的全部权限。
API 密钥是用户名和密码的替代品。没有人会想到在 Web 应用程序的源代码中存储用户名和密码。
文章中描述的“Key auth”模块只是用户名和密码的替代品。