如何使用 Flask CORS 将域列入白名单
Posted
技术标签:
【中文标题】如何使用 Flask CORS 将域列入白名单【英文标题】:How to whitelist domain using Flask CORS 【发布时间】:2020-04-08 12:23:48 【问题描述】:我无法让 Flask CORS 将某些域列入白名单,使其无法执行 POST 请求。我正在从 www.google.com 发出 curl 请求,但使用域 googl.com 来确认帖子。
目前每篇文章都允许加入,因为我的 curl 是“Access-Control-Allow-Origin: *”
我只是希望能够确保只有一个设置的域可以发出 POST 请求
@app.route('/api/userreset', methods=['POST'])
@cross_origin(origin='http://www.googl.com')
def resetFunction():
curl --header "Content-Type: application/json" --request POST "Origin: http://www.google.com" --verbose --data '"email":"test@example.com"' http://0.0.0.0:8080/api/userreset
我也尝试了以下没有做的事情:
cors = CORS(app, resources=r"/api/*": "origins": "http://www.googl.com")
POST的回复如下:
* Trying 0.0.0.0...
* TCP_NODELAY set
* Connected to 0.0.0.0 (127.0.0.1) port 8080 (#0)
> POST /api/userreset HTTP/1.1
> Host: 0.0.0.0:8080
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Type: application/json
> Content-Length: 219
>
* upload completely sent off: 219 out of 219 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 55
< Access-Control-Allow-Origin: *
< Server: Werkzeug/0.16.0 Python/3.8.0
< Date: Mon, 16 Dec 2019 02:21:49 GMT
【问题讨论】:
【参考方案1】:CORS 标头告诉浏览器允许访问哪些域。这并不是要完全限制对服务器的访问,而是告诉浏览器允许从哪些域访问服务器。仍然由浏览器来遵守。如果您从 CURL 执行此操作,它将始终有效,因为 curl 不像浏览器那样强制执行 CORS。
【讨论】:
好的,所以我使用 POSTMAN 也得到了相同的结果。没有办法通过flask_cors 限制域?或者无论如何都可以忽略 IP 白名单,并且通常不是 100% 安全的锁定单个域请求的方法? 根据我在看到您的回复后的理解,curl 会忽略 CORS,因为 CORS 是针对浏览器的,并且 API 需要身份验证才能确保安全,或者像任何开放 API 一样,如果我有任何请求都可以获得响应或 POST POST 打开。 Postman 基本上是 CURL 的 GUI。不,我不会指望 CORS 限制对某个域的访问。不一定会有您可以验证的可靠域名传入,但有一个 IP。听起来这会让你最接近你正在寻找的东西,这并不理想,除非你可以控制地址空间并确保它会保持静态。最好的方法是使用一些身份验证机制。实在太多不一一列举了,但是基本认证、摘要认证、api token、oauth、双向 TLS 都很常见。 是的,不幸的是我不控制请求来自的域,但这是我可以尝试查看的选项。谢谢! 是的,没错。再次查看您的示例,如果此用户重置端点将被浏览器击中,无需身份验证,并且此 api 位于发出请求的页面之外的另一个域上,那么您就在正确的轨道上。您需要 cors 标头才能正常工作,如果 cors 标头不正确,浏览器应阻止请求。但是,curl 和 postman 仍然可以工作,人们可以通过代码或更改浏览器安全设置等来使用端点。以上是关于如何使用 Flask CORS 将域列入白名单的主要内容,如果未能解决你的问题,请参考以下文章