限制对烧瓶 REST API 的访问

Posted

技术标签:

【中文标题】限制对烧瓶 REST API 的访问【英文标题】:restrict access to a flask REST API 【发布时间】:2019-06-07 19:50:23 【问题描述】:

我已经用烧瓶在 python 中构建了一个 get REST API。 我从自己的网站调用此 API,并希望避免其他网站使用它。

为此,在我设置的 api 定义的标题中

'Access-Control-Allow-Origin' = '****'

被允许拨打电话的网站的域名。

这足以避免其他人使用我的api吗?

【问题讨论】:

【参考方案1】:

是的,但请确保以正确的格式输入。

"Access-Control-Allow-Origin": "https://example.com",

这将只允许来自 example.com 的请求。

关于您的第二个问题,如果其他人正在使用或可以从 mydomain.com 发送请求,那么他们当然可以使用您的 API。如果您真的担心其他人使用您的 API,我强烈建议您使用 Flask-WTF 实施 CSRF 保护 - 这样就没有人可以伪造请求。

【讨论】:

【参考方案2】:

在 Flask 中执行 CORS 的更好方法

我可能会使用 Flask-CORS 为您的 Flask 项目添加适应性跨域资源共享功能...

首先 pip 安装 Flask-CORS:

pip install -U flask-cors

然后在你的应用实例化中实现:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
cors = CORS(app, resources=r"/api/*": "origins": "example.com")

这将只允许从 example.com 访问该特定路由并为您处理所有标头,类似于 Avian 建议的但以 Flasky 的方式。当然,如果您希望特定来源(或实际上任何来源)能够访问您的完整 API(或部分 API),您可以使用通配符。

这足以避免其他人使用我的api吗?

不,这只会阻止人们使用 JS 从其他网站/来源访问您的 API。它不会阻止人们直接使用 CurRL 或等效工具直接访问您的 API。如果您想阻止对您的 API 的访问,您应该实施某种形式的令牌/密钥身份验证凭据,以仅对您希望获得访问权限的用户进行身份验证,并向任何没有有效凭据的用户返回“未授权”401。

【讨论】:

这个。此外,请确保保护自己免受 CSRF 的影响,并对私有路由实施基于令牌的访问。【参考方案3】:

CORS

我已经用烧瓶在 python 中构建了一个 get REST API。我从自己的网站调用此 API,并希望避免其他网站使用它。

Robert Putt 建议使用 Flask CORS 包是解决此问题的正确方法,但他自己指出这不会阻止您的 API 被其他人使用,这导致我们提出您的下一个问题,我会尝试更详细地解决。

API 滥用

这足以避免其他人使用我的api吗?

简短的回答是否定的,因为您的 API 可以通过许多其他方式使用,例如使用 Postman、自动化脚本或被机器人抓取,仅举几例。

保护 API 的通常步骤是使用令牌形式的机密信息,例如用于识别执行请求的 API 密钥(也称为网络应用或移动应用)以及用于识别正在执行的用户的用户身份验证令牌请求,但两者都注定很容易从其原始使用范围中提取出来,而是由攻击者在自动化脚本中或在 Postman 等工具中手动使用。这很容易在攻击者控制的设备中完成,但也可以通过在攻击者的笔记本电脑上运行的免费 wifi 强制门户来完成。当攻击者在机场、火车站/汽车站和其他公共场所使用免费 wifi 强制门户技术时,他们会诱骗用户安装自定义证书,这将允许他们解密所有 https 连接,从而获得对其令牌的访问权限,从而能够在他们不知情的情况下代表他们执行对 API 服务器的调用,这将在允许用户正常浏览网站的同时完成。

因此,任何在客户端运行并需要一些秘密才能访问 API 的东西注定会以多种方式被滥用,您可以在this series 了解有关移动 API 安全技术的文章的更多信息。本文将教您如何使用 API 密钥、用户访问令牌、HMAC、TLS Pinning 来保护 API 以及如何绕过它们。这些文章更多地是在移动应用程序的 API 上下文中,但它们很好地说明了为什么您不能在网络应用程序上下文中有效地保护您的 API,您只能让它变得更加困难。

作为最后一点,我建议您的网络应用也使用CSP header,这将允许您设置内容安全策略并实时报告违规行为。

【讨论】:

以上是关于限制对烧瓶 REST API 的访问的主要内容,如果未能解决你的问题,请参考以下文章

按角色限制对烧瓶视图功能的某些区域的访问?

在 Spring-boot 中成功登录后如何限制 POST Rest Api 以供公共访问

如何按角色限制对 Spring Data REST 投影的访问?

保护对 Kafka Connect 的 REST API 的访问

将 WordPress Rest API 请求限制到我的域

根据条件限制/锁定所有 Post/Delete Rest API 端点 [关闭]