Как уже упоминалось в комментариях, 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 .