Skip to main content
 首页 » 编程设计

python之如何使用 remote_addr header 限制对 POST api 的访问

2025年05月04日10rubylouvre

我问了一个相关问题here .基本上,我有一个用 Flask 构建的 API ,我希望只能从运行 Flask 应用程序本身的同一台机器上发布。所有其他 POST 请求应该得到 401 Unauthorized 的响应。

此时我对如何实现这一点感到有点困惑。在 SO 的其他地方(我不记得在哪里了)我读到比较 REMOTE_ADDR header /字段是执行此操作的正确方法。 Here至少是一个例子。

我写了一些我认为可以在 View 函数中执行此操作的代码:

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 白名单没有成功。也许有人已经对此有深入的了解,否则我很快就会接触到更多的机器。

谢谢!

请您参考如下方法:

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

尝试这样的事情:

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

相反。这有帮助吗?