Функция белого списка IP-адресов - Flask - Python3.x - PullRequest
0 голосов
/ 14 сентября 2018

Я создал веб-приложение, которое будет общедоступным.Есть некоторые инструменты администратора, которые ИТ-отдел будет использовать, например, для администрирования определенных вещей в базах данных.

У меня есть все мои маршруты и модели для базы данных, я просто хочу получить представление о том, будет ли моя функциябыть подходящим методом внесения в белый список 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 голосов
/ 14 сентября 2018

Я сделаю что-то вроде этого:

# 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 или что-то подобное, по моему мнению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...