我在这里问了一个相关的问题。基本上,我有一个用Flask构建的 API ,我希望它只能从运行 Flask 应用程序本身的同一台机器上发布。所有其他 POST 请求应得到 401 Unauthorized 响应。
在这一点上,我对如何实现这一点有点困惑。在 SO 的其他地方(我不记得在哪里了)我读到比较 REMOTE_ADDR 标头/字段是执行此操作的正确方法。这里至少有一个例子。
我写了一些我认为可以在视图函数中执行此操作的代码:
if request.environ.get('REMOTE_ADDR', '127.0.0.1') != '127.0.0.1':
abort(401)
post_data = request.form
DPC().store(post_data)
return jsonify(post_data), 201
但是,在实施这些更改之后,我仍然能够从外部机器向 API 发布信息。我为此功能编写的测试掩盖了可能存在的潜在问题:def test_external_post_fails(self):
my_data = {
...
}
result = self.client.post('/daily_population_changes',
data=my_data,
environ_overrides={'REMOTE_ADDR': '127.0.0.2'})
assert result.status_code == 401
测试成功。但问题在于准确性,而不是精确度:我在这里测试正确的东西吗?在Werkzeug 环境中,远程请求实际上是否具有 REMOTE_ADDR 的(非空)值不等于“127.0.0.1”?
我还不能真正检查这些请求对象的值,保存以查看(在生产服务器上)POST 白名单没有成功。也许有人已经对此有所了解,否则我稍后将可以访问更多机器。
谢谢!