如何使用remote_addr标头限制对POST api的访问?

时间:2013-11-01 06:02:22

标签: python post http-headers flask whitelist

我问了一个相关的问题here。基本上,我有一个用Flask构建的API,我希望能够从运行Flask应用程序本身的同一台机器上POST。所有其他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

但是,在实施这些更改后,我仍然可以从外部计算机POST到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 environment中的REMOTE_ADDR的(非空)值不等于'127.0.0.1'?

我还没有能够像我想要的那样对这些请求对象进行实际检查,除了(在生产服务器上)看到POST白名单没有成功。也许有人已经深入了解这一点,否则我将有机会获得更多的机器。

谢谢!

1 个答案:

答案 0 :(得分:1)

可能绊倒你的一件事是使用request.environ.get('REMOTE_ADDR', '127.0.0.1')。如果第一个键不存在,get()的{​​{1}}方法将返回第二个值。因此,如果没有dict,无论出于何种原因,它都会自动填入'REMOTE_ADDR'

尝试类似:

'127.0.0.1'

代替。这有帮助吗?