python - CSRF protection on AJAX authentication in Flask -



python - CSRF protection on AJAX authentication in Flask -

i'd ajaxify both login , signup form on site. i've been using wtforms built-in csrf protetion, project didn't sense worth -- layer of abstraction, , hence frustration, should pretty simple.

so came across this snippet on flask's security section:

@app.before_request def csrf_protect(): if request.method == "post": token = session.pop('_csrf_token', none) if not token or token != request.form.get('_csrf_token'): abort(403) def generate_csrf_token(): if '_csrf_token' not in session: session['_csrf_token'] = some_random_string() homecoming session['_csrf_token'] app.jinja_env.globals['csrf_token'] = generate_csrf_token

i understand thought process behind code. in fact, makes perfect sense me (i think). can't see wrong it.

but doesn't work. thing i've changed code replacing pseudofunction some_random_string() phone call os.urandom(24). every request has 403'd far because token , request.form.get('_csrf_token') never same. when print them becomes obvious -- they're different strings, occasionally, , seemingly no underlying reason, 1 or other none or truncated version of output of os.urandom(24). out of sync, i'm not understanding is.

you can convenience of flask-wtf without heaviness, , without rolling own:

from flask_wtf.csrf import csrfprotect

then on init, either:

csrfprotect(app)

or:

csrf = csrfprotect() def create_app(): app = flask(__name__) csrf.init_app(app)

the token available app-wide @ point, including via jinja2:

<form method="post" action="/"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> </form>

(via docs)

python ajax flask csrf

Comments

Popular posts from this blog

xslt - DocBook 5 to PDF transform failing with error: "fo:flow" is missing child elements. Required content model: marker* -

mediawiki - How do I insert tables inside infoboxes on Wikia pages? -

Local Service User Logged into Windows -