【发布时间】:2013-11-01 06:02:21
【问题描述】:
我问了一个相关问题here。基本上,我有一个用Flask 构建的 API,我希望它只能从运行 Flask 应用程序本身的同一台机器上发布。所有其他 POST 请求都应该得到 401 Unauthorized 响应。
在这一点上,我对如何实现这一点有点困惑。在 SO 的其他地方(我不记得在哪里了)我读到比较 REMOTE_ADDR 标头/字段是执行此操作的正确方法。 Here 至少是一个例子。
我编写了一些我认为可以在视图函数中执行此操作的代码:
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 进行 POST。我为此功能编写的测试掩盖了可能存在的潜在问题: 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 environment 中具有不等于“127.0.0.1”的 REMOTE_ADDR 值(非空)?
我还不能真正检查这些请求对象的值,保存以查看(在生产服务器上)POST 白名单未成功。也许有人已经对此有所了解,否则我将可以访问更多机器。
谢谢!
【问题讨论】:
-
您是否在某种 Proxy 后面运行 Flask(例如,使用 Nginx 转发到 Flask)?如果是这样,Nginx 将发出一个可能正在使用环回接口的新请求,并且 Flask 正在看到该请求(因此 REMOTE_ADDR 将为 127.0.0.1)。请参阅This question 了解更多信息。
-
是的,我是!感谢您的提示,我正在调查。
-
那么,基本上,Nginx 将用户的 IP 存储在
X-Forwarded-ForHeader 中?哇,这需要我一段时间才能弄清楚。 -
是的,我很确定这正是我的情况。但实际上,标头取决于您的 nginx 配置保存 $remote_addr 值的位置。对我来说,它位于 X-Real-IP 标头中。
-
你应该为此写一个答案。我认为这是正确的答案,如果是,答案很有价值,应该单独写下来供其他人使用。
标签: python post http-headers flask whitelist