Flask-Login建议在用户登录后使用is_safe_url()函数:
这里是指向讨论此内容的文档部分的链接:https://flask-login.readthedocs.io/en/latest/#login-example
他们链接到此代码段,但我不知道它如何实现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()
函数如何确保URL安全?
是否仅需要在登录时检查下一个URL?还是在其他地方和时间重要的是要包含此安全措施?
最重要的是:是否可以在Flask中使用可靠的is_safe_url()
函数?
编辑:向Flask-Login文档添加了链接,并包含了摘要。
如评论中所述,Flask-Login今天(2020-04-26)在文档中有固定链接(在GitHub上为issue)。请注意原始烧瓶摘要文档中的警告:
摘要是非官方的,没有维护。 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
。为了提供更好的用户体验,我们可以通过building URL /login?next=profile
将用户重定向到他的个人资料页面,这使烧瓶可以重定向到profile
,而不是默认的dashboard
。
由于用户可以滥用URL,因此我们要检查URL是否安全,否则请中止。
is_safe_url()函数如何确保URL安全?
该代码段是确保重定向目标将引导到同一服务器的功能。
是否仅需要在登录时检查下一个URL?还是在其他地方和时间重要的是要包含此安全措施?
否,您应该检查所有危险的URL。安全URL重定向的示例为redirect(url_for('index'))
,因为它已在程序中进行了硬编码。请参见Unvalidated Redirects and Forwards - OWASP cheatsheet上的安全和危险URL示例。
最重要的是:是否可以在Flask中使用可靠的is_safe_url()函数?
[pypi上有Django的is_safe_url()捆绑为独立的软件包。