2015-08-10 11 views
11

Flask-login doc dice che dovremmo convalidare successiva utilizzando next_is_valid(), ma non riesco a trovare un tale metodo:next_is_valid() non esiste in flask-login?

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) 

L'esecuzione di questo ottengo l'errore:

NameError: global name 'next_is_valid' is not defined 

E se lo faccio:

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

Dove si trova loFunzionee, se non esiste, come convalidare il parametro next?

+1

Non dice che devi convalidare 'next' con' next_is_valid'. Questa è solo una funzione di esempio; hai ragione, non esiste. Devi decidere se 'next' se valido in base ai tuoi criteri. 'next' è l'url per reindirizzare su un login riuscito. Spero che questo aiuti alcuni. – bnjmn

+0

@bnjmn questo dovrebbe essere aggiunto come risposta Penso con alcuni riferimenti;) –

risposta

9

Non dice è necessario convalidare next con next_is_valid, solo che

You MUST validate the value of the next parameter.

next_is_valid è solo una funzione di esempio.

È necessario determinare se next è valido in base ai propri criteri. next è l'URL per reindirizzare su un accesso riuscito. Se hai qualche autorizzazione da applicare o restrizioni sul tuo sito, questo è dove vorresti assicurarti che vengano applicate.

Ad esempio, un utente può tentare di accedere con l'url di richiesta http://example.com/login?next=admin/delete/all/users. Se il tentativo di accesso ha avuto esito positivo e l'autorizzazione di amministratore non è stata verificata all'interno della funzione di accesso o sull'endpoint stesso, potrebbero verificarsi problemi. Tutto dipende da come strutturate la vostra applicazione e controllate l'accesso ai singoli endpoint.

+0

Ciò significa tuttavia che se 'http: // example.com/admin/delete/all/users'_is_ è protetto da qualcosa come' @ admin_required' - non devi avere un assegno come 'next_is_valid()'? – qff

+1

@qff Esattamente. Il controllo verrà eseguito dal decoratore '@ admin_required' sulla rotta. – bnjmn