我如何获得is_safe_url()函数与Flask一起使用以及它如何工作?

问题描述 投票:1回答:1

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文档添加了链接,并包含了摘要。

python security flask
1个回答
1
投票

如评论中所述,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()捆绑为独立的软件包。

© www.soinside.com 2019 - 2024. All rights reserved.