【问题标题】:How to restrict access to POST api with remote_addr header?如何使用 remote_addr 标头限制对 POST api 的访问?
【发布时间】: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-For Header 中?哇,这需要我一段时间才能弄清楚。
  • 是的,我很确定这正是我的情况。但实际上,标头取决于您的 nginx 配置保存 $remote_addr 值的位置。对我来说,它位于 X-Real-IP 标头中。
  • 你应该为此写一个答案。我认为这是正确的答案,如果是,答案很有价值,应该单独写下来供其他人使用。

标签: python post http-headers flask whitelist


【解决方案1】:

使用request.environ.get('REMOTE_ADDR', '127.0.0.1') 可能会让您感到困惑。如果第一个键不存在,dicts 的 get() 方法将返回第二个值。所以如果没有'REMOTE_ADDR',不管什么原因,它会自动填上'127.0.0.1'

尝试类似:

if request.environ.get('REMOTE_ADDR', False) == '127.0.0.1':

相反。这有帮助吗?

【讨论】:

  • 这是我下一个要研究的线索,因为我有意愿再次搞砸这个问题。问题是,我不确定environ['REMOTE_ADDR'] 是否总是设置。事实上,我知道有时不是(直接访问 dict 时出错,这是我添加默认值的时候)。由于属性的名称似乎表明它是一个 remote 地址,我猜测它没有被设置可能意味着它只是本地的。
  • 我发现environ['REMOTE_ADDR] 未设置的原因仅仅是我的反向代理服务器正在设置它,但我在测试时没有使用它。我在测试中添加了一个environ_overrides={'REMOTE_ADDR': '127.0.0.1'} 参数,并简单地提供了一个一次性名称foo 以与'127.0.0.1' 进行比较。但是服务器仍然接受来自我本地机器的 POST 请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多