Как получить функцию is_safe_url () для использования с Flask и как она работает? - PullRequest
1 голос
/ 04 марта 2020

Flask -Login рекомендует использовать функцию is_safe_url () после входа пользователя в систему:

Вот ссылка на часть документации, которая обсуждает это: https://flask-login.readthedocs.io/en/latest/#login -пример

Они ссылаются на этот фрагмент, но я не понимаю, как он реализуется is_safe_url(): https://palletsprojects.com/p/flask/

next = request.args.get('next')
if not is_safe_url(next):
     return abort(400)

Это не похоже на Flask. Я относительно новичок в кодировании. Я хочу понять:

  • Что именно происходит, когда request получает аргумент next?

  • Что означает is_safe_url() функция do для обеспечения безопасности URL-адреса?

  • Нужно ли проверять следующий URL-адрес только при входе в систему? Или есть другие места и время, когда важно включить эту меру безопасности?

  • И самое главное: есть ли надежная функция is_safe_url(), которую я могу использовать с Flask?

Редактировать: добавлена ​​ссылка на Flask -Логиновая документация и включенный фрагмент.

1 Ответ

1 голос
/ 26 апреля 2020

Как уже упоминалось в комментариях, Flask -Логин сегодня (2020-04-26) имеет недействительную ссылку в документации ( выпуск на GitHub). Обратите внимание на предупреждение в оригинальной flask документации фрагментов:

фрагменты являются неофициальными и не поддерживаются. Ни один из сопровождающих Flask не курировал и не проверял фрагменты кода на предмет безопасности, правильности или дизайна.

Фрагмент

from urllib.parse import urlparse, urljoin

def is_safe_url(target):
    ref_url = urlparse(request.host_url)
    test_url = urlparse(urljoin(request.host_url, target))
    return test_url.scheme in ('http', 'https') and \
           ref_url.netloc == test_url.netloc

Теперь ответим на ваши вопросы:

Что именно происходит, когда запрос получает следующий аргумент?

Часть кода, на которой мы фокусируемся, это

next = request.args.get('next')
return redirect(next or url_for('dashboard')) 

, которая по умолчанию перенаправляет пользователя на панель мониторинга (например, после успешного входа в систему). Однако, если пользователь попытался связаться, например, с конечной точкой profile и не вошел в систему, мы бы хотели перенаправить его на страницу входа. После входа в систему по умолчанию перенаправление будет перенаправлять пользователя на dashboard, а не на profile, где он намеревался go. Чтобы повысить удобство работы с пользователем, мы можем перенаправить пользователя на страницу его профиля путем создания URL-адреса /login?next=profile, что позволяет flask перенаправлять на profile вместо значения по умолчанию dashboard.

* 1030. * Поскольку пользователь может злоупотреблять URL-адресами, мы хотим проверить, является ли URL-адрес безопасным, или прервать его в противном случае.

Что делает функция is_safe_url () для обеспечения безопасности URL-адреса?

Данный фрагмент кода - это функция, которая гарантирует, что цель перенаправления приведет к тому же серверу.

Нужно ли проверять следующий URL только при входе в систему? Или есть другие места и случаи, когда важно включить эту меру безопасности?

Нет, вам следует проверить все опасные URL-адреса. Пример безопасного перенаправления URL будет redirect(url_for('index')), так как он жестко задан в вашей программе. См. Примеры безопасных и опасных URL-адресов в Непроверенные перенаправления и пересылки - OW ASP cheatsheet .

И самое главное: есть ли надежная функция is_safe_url (), которую я могу использовать с Flask?

Существует Django is_safe_url (), связанный как автономный пакет на pypi .

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