IP白名单功能-烧瓶-Python3.x

时间:2018-09-14 15:10:59

标签: python nginx flask

我创建了一个将面向公众的Web应用程序。例如,IT部门将使用一些管理工具来管理数据库中的某些内容。

我拥有数据库的所有路由和模型,我只是想了解一下我的功能是否适合将IP地址列入路由白名单以及是否遗漏了一些东西。

def allowed_ip(request):
    if not request:
        now = time.strftime("%b-%d-%Y_%H:%M:%S", time.gmtime(time.time()))
        app.logger.info('No request was sent -=- {}'.format(now))
        return False
    if request and request.headers['X-Real-IP']:
        if request.headers['X-Real-IP'] not in config.Config.ALLOWED_IPS:
            now = time.strftime("%b-%d-%Y_%H:%M:%S", time.gmtime(time.time()))
            app.logger.info('Request received from non-whitelist client {} -=- {}'.format(request.headers['X-Real-IP'],
                                                                                          now))
            return False
        else:
            now = time.strftime("%b-%d-%Y_%H:%M:%S", time.gmtime(time.time()))
            app.logger.info('Request received from whitelisted client {} -=- {}'.format(request.headers['X-Real-IP'],
                                                                                        now))
            return True
    else:
        now = time.strftime("%b-%d-%Y_%H:%M:%S", time.gmtime(time.time()))
        app.logger.info('Request received from but no IP sent -=- {}'.format(now))
        return False

该函数检查它是否收到了请求((我知道这似乎没有意义,但我没有此行就收到了一些奇怪的错误),如果它收到了请求,则检查X-Real-IP标头以查看它是否在我们的白名单中。

我缺少任何可以在这里操作的东西吗?

我很欣赏这可能是一个广泛的问题,也可能是题外话,但我也乐于接受其他方法。也许对我而言,在Nginx的级别上管理白名单会更好?

我的答案已适应我的代码:

from functools import wraps
def whitelisted(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if request.headers['X-Real-IP'] not in app.config.get('ALLOWED_IPS'):
            return redirect(url_for('login', next=request.url))
        return f(*args, **kwargs)
    return decorated_function

现在这是可能的:

@app.route('/map')
@whitelisted
@login_required
def show_all():

1 个答案:

答案 0 :(得分:2)

我会做这样的事情:

# helpers.py
from flask import request, current_app

def check_ip():
    def decorator(f):
        def wrapped_function(*args, **kwargs):
            ip = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
            if ip:
                if ip in current_app.config.get('ALLOWED_IPS'):
                     return f(*args, **kwargs)
            return 'Nice try! <3' # Do a real thing like real http code for forbiden, etc ... use response

        return update_wrapper(wrapped_function, f)
    return decorator




# routes.py
index = Blueprint('index ', __name__)
@index.route('/')
@check_ip()
def hello_world():
    return render_template('home.html')

但是仅仅使用IP是不安全的,如果您想要更好的东西,我应该使用flask_login或类似的东西。