问题 flask-login中不存在next_is_valid()?


Flask-login doc 说我们应该验证下次使用 next_is_valid(),但我找不到任何这样的方法:

警告:您必须验证下一个参数的值。如果不这样做,您的应用程序将容易受到开放重定向的影响。

@app.route('/login', methods=['GET', 'POST'])
def login():
    # Here we use a class of some kind to represent and validate our
    # client-side form data. For example, WTForms is a library that will
    # handle this for us.
    form = LoginForm()
    if form.validate_on_submit():
        # Login and validate the user.
        login_user(user)

        flask.flash('Logged in successfully.')

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

        return flask.redirect(next or flask.url_for('index'))
    return flask.render_template('login.html', form=form)

运行这个我收到错误:

NameError: global name 'next_is_valid' is not defined

如果我这样做:

from flask.ext.login import next_is_valid
>> ImportError: cannot import name next_is_valid

哪儿是 next_is_valid() 功能,如果它不存在,我该如何验证 next 参数?


12290
2017-08-10 19:06


起源

它并没有说你必须验证 next 同 next_is_valid。这只是一个示例功能;你是对的,它不存在。你必须决定是否 next 如果根据您自己的标准有效。 next 是成功登录时重定向到的URL。希望这会有所帮助。 - bnjmn
@bnjmn这应该作为一个答案添加我想与一些参考;) - Abdelrahman Elkady


答案:


它并没有说你必须验证 next 同 next_is_valid, 只有这样

您必须验证下一个参数的值。

next_is_valid 只是一个示例功能。

你必须确定是否 next 根据您自己的标准有效。 next 是成功登录时重定向到的URL。如果您有权对您的网站进行申请或限制,那么您可以确保这些权限得到执行。

例如,用户可以尝试使用请求URL登录 http://example.com/login?next=admin/delete/all/users。如果登录尝试成功并且未在登录功能或端点本身中检查管理员权限,那么可能会发生错误。这完全取决于您如何构建应用程序并控制对各个端点的访问。


9
2017-08-12 13:44



这是否意味着如果 http://example.com/admin/delete/all/users  是 受到类似的保护 @admin_required  - 你不必像支票那样 next_is_valid()? - qff
@qff完全正确。检查将由。执行 @admin_required 装饰在路线上。 - bnjmn