首页 > 解决方案 > 我是否能够为 Flask 提供 IP 白名单范围,而不是 IP 列表?

问题描述

我有一个基本的烧瓶服务器,用于通过 Google 聊天机器人进行 Python 开发。我想将可以访问服务器的 IP 范围限制在一定范围内。为此,例如 123.0.0.1 到 123.255.255.255。

从网上看到的类似问题,我知道如何轻松地为单个 IP 执行此操作。

从烧瓶导入中止,请求

@app.before_request
def limit_remote_addr():
    if request.remote_addr != '123.0.0.1':
        abort(403)  # Forbidden

但我不想对每个IP都这样做,或者必须列出一个列表。那可能吗?还是我最好配置我的防火墙以删除此步骤?

标签: pythonflask

解决方案


正如@Klaus D. 提到的,您可以检查远程地址是否以地址的一部分开头。

您可以检查远程地址是否列在@before_request装饰器中的特定 IP 地址列表中。

在这里,我展示了一个在 Python 中将 IP 地址列入白名单的示例。

使用本地网络(通过 WiFi 连接)进行测试。

Flask 服务器的本地 IP 地址:192.168.0.107

app.py

from flask import abort, Flask, render_template, request


ALLOWED_IPS = ['192.168.1.', '127.0.0.1']

app = Flask(__name__)

@app.errorhandler(403)
def permission_error(e):
    return render_template('403.html', error_code=403), 403

@app.before_request
def limit_remote_addr():
    client_ip = str(request.remote_addr)
    valid = False
    for ip in ALLOWED_IPS:
        if client_ip.startswith(ip) or client_ip == ip:
            valid = True
            break
    if not valid:
        abort(403)


@app.route('/', methods = ['GET'])
def home():
    return "Your IP: {}".format(request.remote_addr)

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

403.html

<h3>Your IP address is not white listed</h3>

输出:

从不在ALLOWED_IPS列表中的 IP 访问应用程序:

被封锁的 IP

从列表中的 IP 访问应用程序ALLOWED_IPS

白名单IP

ALLOWED_IPS将列表更新为 后ALLOWED_IPS = ['192.168.0.', '127.0.0.1'],我可以从以下位置访问 Flask 应用程序192.168.0.107

有效 IP


推荐阅读