2015-08-10 11 views
11

Flask-login doc mówi powinniśmy zweryfikować za pomocą next_is_valid() obok, ale nie mogę znaleźć takiej metody:next_is_valid() nie istnieje w oknie dialogowym w kolbie?

Warning: You MUST validate the value of the next parameter. If you do not, your application will be vulnerable to open redirects.

@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) 

Running to pojawia się błąd:

NameError: global name 'next_is_valid' is not defined 

A jeśli robię:

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

Gdzie jest next_is_valid(), a jeśli nie istnieje, w jaki sposób sprawdzić poprawność parametru next?

+1

Nie oznacza to, że musisz potwierdzić 'next' za pomocą' next_is_valid'. To tylko przykładowa funkcja; masz rację, to nie istnieje. Musisz zdecydować, czy "następny", jeśli jest ważny, na podstawie własnych kryteriów. 'next' to adres URL do przekierowania do udanego logowania. Mam nadzieję, że to pomaga niektórym. – bnjmn

+0

@ bnjmn to powinno być dodane jako odpowiedź, myślę, że z pewnymi odniesieniami;) –

Odpowiedz

9

To nie powiedzieć trzeba zweryfikować next z next_is_valid, tylko że

You MUST validate the value of the next parameter.

next_is_valid jest tylko funkcja przykładem.

Musisz ustalić, czy next jest ważne na podstawie własnych kryteriów. next to adres URL, pod którym można się zalogować po udanym logowaniu. Jeśli masz jakieś uprawnienia do zastosowania lub ograniczenia na swojej stronie, to powinieneś upewnić się, że są one egzekwowane.

Na przykład użytkownik może spróbować zalogować się za pomocą adresu URL żądania http://example.com/login?next=admin/delete/all/users. Jeśli próba zalogowania się powiodła, a uprawnienia administratora nie zostały sprawdzone w ramach funkcji logowania lub samego punktu końcowego, mogło dojść do złych rzeczy. Wszystko zależy od tego, w jaki sposób tworzysz strukturę aplikacji i kontrolujesz dostęp do poszczególnych punktów końcowych.

+0

Czy to jednak oznacza, że ​​jeśli 'http: // example.com/admin/delete/all/users' _is_ jest chronione przez coś podobnego' @ admin_required' - nie musisz mieć sprawdzenia typu 'next_is_valid()'? – qff

+1

@ qff Dokładnie. Czek zostanie wykonany przez dekoratora '@ admin_required' na trasie. – bnjmn

Powiązane problemy