Formulaire de validation échoue en raison manquant CSRF

Il y A quelques jours j'ai réinitialiser mon local flacon de l'environnement sans avoir capturé les dépendances via un pip freeze avant je l'ai supprimé. Par conséquent, j'ai dû ré-installer la version la plus récente de l'ensemble de la pile.

Maintenant hors de la bleue, je ne suis plus en mesure de valider avec les formes. Flacon revendications CSRF serait absente.

def register():
    form = RegisterForm()
    if form.validate_on_submit():
       ...
    return make_response("register.html", form=form, error=form.errors)

La première fois que j'envoie un Get - je récupérer un vide form.errors comme prévu.
Maintenant je remplir le formulaire et de le soumettre et de form.errors montre: {'csrf_token': [u'CSRF token missing']}

C'est tellement étrange. Je me demande si en Flacon de WTF a changé et je l'utilise à tort.

Je peux clairement voir la form.CSRF_token existe, alors pourquoi est-il en affirmant qu'il manquait?

CSRFTokenField: <input id="csrf_token" name="csrf_token" type="hidden" value="1391278044.35##3f90ec8062a9e91707e70c2edb919f7e8236ddb5">

Je n'ai jamais touché le travail de modèle, mais je l'ai poster ici néanmoins:

{% from "_formhelpers.html" import render_field %}
{% extends "base.html" %}
{% block body %}
<div class="center simpleform">
    <h2>Register</h2>
    {% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
    <form class="form-signin" action="{{ url_for('register') }}" method=post>
        {{form.hidden_tag()}}
        <dl>
            {{ render_field(form.name) }}
            {{ render_field(form.email) }}
            {{ render_field(form.password) }}
            {{ render_field(form.confirm) }}
            <dd><input type=submit value=Register class='btn btn-primary'>
        </dl>
    </form>
</div>
{% endblock %}

Est-ce un nouveau bug?

Mise à JOUR:

J'ai réinstallé le tout et le problème persiste.

Que Martijn a suggéré, je suis de débogage dans la méthode suivante dans flask_wtf :

def validate_csrf_token(self, field):
        if not self.csrf_enabled:
            return True
        if hasattr(request, 'csrf_valid') and request.csrf_valid:
            # this is validated by CsrfProtect
            return True
        if not validate_csrf(field.data, self.SECRET_KEY, self.TIME_LIMIT):
            raise ValidationError(field.gettext('CSRF token missing'))

La dernière condition est la collecte de l'erreur de validation.

field.data = "1391296243.8##1b02e325eb0cd0c15436d0384f981f06c06147ec"
self.SECRET_KEY = None (? Is this the problem)
self.TIME_LIMIT = 3600

Et vous avez eu raison de la HMAC échec de la comparaison....les deux valeurs sont à chaque fois différents.

return hmac_compare == hmac_csrf

J'ai à la fois SECRET_KEY et CSRF_SESSION_KEY dans ma config défini.

Êtes-vous d'accepter les cookies? Les CSRF architecture exige que le csrf_token valeur est présente dans la session et valide; c'est une valeur aléatoire utilisé pour signer le jeton et le poster est utilisé pour vérifier le jeton CSRF avec le formulaire (avec le serveur-côté secret).
Oui, Ni Firefox ni Chrome sont le blocage des cookies. Je ne comprends pas.
Donc, pour vérifier, vous voyez l'un cookie nommé session set (à condition de ne pas en SESSION_COOKIE_NAME à autre chose)?
Oui. Dans Eclipse, en vertu de Débogage de la liste de surveillance, quand je rentre session, j'obtiens ceci: LocalProxy: <SecureCookieSession {'csrf_token': '2182effc89ce180a53622272d88d4466679920cd'}>
J'ai eu ce problème pendant une longue période, réalisé que c'était mon SESSION_COOKIE_SECURE = True paramètre d'application. Espérons que cela aide quelqu'un d'autre.

OriginalL'auteur Houman | 2014-02-01