Несколько дней назад я сбросил локальную среду фляги, не зацепив зависимости через pip freeze
, прежде чем удалю ее. Поэтому мне пришлось переустановить последнюю версию всего стека.Проверка формы не прошла должным образом CSRF
Теперь я не могу подтвердить форму с помощью формы. Флакон утверждает, что CSRF будет отсутствовать.
def register():
form = RegisterForm()
if form.validate_on_submit():
...
return make_response("register.html", form=form, error=form.errors)
Первый раз, когда я отправить Get
я получить пустой form.errors
, как и ожидалось. Теперь я заполняю форму и отправлю ее, и form.errors
показывает: {'csrf_token': [u'CSRF token missing']}
Это так странно. Интересно, изменилась ли Flask-WTF, и я использую ее неправильно.
Я могу видеть, что form.CSRF_token
существует, так почему он утверждает, что он отсутствовал?
CSRFTokenField: <input id="csrf_token" name="csrf_token" type="hidden" value="1391278044.35##3f90ec8062a9e91707e70c2edb919f7e8236ddb5">
Я никогда не касался рабочего шаблона, но я его здесь, тем не менее:
{% 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 %}
Это новая ошибка?
UPDATE:
Я переустановил все, и проблема остается.
Как предложил Мартейн, я отладки в следующий метод в 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'))
Последнее условие повышения ошибка проверки.
field.data = "1391296243.8##1b02e325eb0cd0c15436d0384f981f06c06147ec"
self.SECRET_KEY = None (? Is this the problem)
self.TIME_LIMIT = 3600
И вы были правы, сравнение HMAC не удается .... оба значения в каждом разном отличаются друг от друга.
return hmac_compare == hmac_csrf
У меня есть как SECRET_KEY, так и CSRF_SESSION_KEY в моей конфигурации.
Вы принимаете печенье? Для архитектуры CSRF требуется, чтобы значение 'csrf_token' присутствовало в сеансе и было действительным; это случайное значение, используемое для подписи токена, и при публикации он используется для проверки токена CSRF с формой (вместе с секретностью на стороне сервера). –
Да, ни Firefox, ни Chrome не блокируют файлы cookie. Я не понимаю. – Houman
Итак, чтобы убедиться, что вы видите файл cookie с именем 'session' (если вы не задали' SESSION_COOKIE_NAME' что-то еще)? –