限制对烧瓶REST API的访问

时间:2019-01-13 16:56:59

标签: python rest api flask cors

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

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

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

成为允许拨打电话的网站域。

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

3 个答案:

答案 0 :(得分:1)

在Flask中进行CORS的更好方法

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

首先安装Flask-CORS pip:

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。它不会阻止人们简单地使用CuRL或等效语言直接访问您的API。如果要阻止对API的访问,则应实施某种形式的令牌/密钥身份验证凭据,以仅对希望获得访问权限的用户进行身份验证,并向任何没有有效凭据的用户返回“未经授权” 401。

答案 1 :(得分:0)

是的,但是请确保使用正确的格式。

“访问控制权限来源”:“ https://example.com”,

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

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

答案 2 :(得分:0)

CORS

  

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

Robert Putt建议使用Flask CORS软件包是解决此问题的正确方法,但他本人指出,这不会阻止您的API被其他人使用,这将导致我们遇到下一个问题,我将尝试进行更详细的介绍。

API滥用

  

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

简短的回答是“否”,因为您的API可以通过许多其他方式使用,例如使用Postman,自动脚本或由机器人抓取,等等。

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

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

最后,我建议您的Web应用程序也使用CSP header,这将允许您设置内容安全策略并实时报告违规情况。