2

我在这里问了一个相关的问题。基本上,我有一个用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 白名单没有成功。也许有人已经对此有所了解,否则我稍后将可以访问更多机器。

谢谢!

4

1 回答 1

1

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

尝试类似:

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

反而。这有帮助吗?

于 2013-11-01T16:09:29.307 回答