Конфликт между капчей и CSRF - PullRequest
0 голосов
/ 07 ноября 2018

Для моей страницы входа в систему я включил капчу, где пользователь должен ввести 4 цифры, как показано на рисунке. Для этого я использую модуль flask-session-captcha. Я следовал точно так же, как в инструкции.

На той же странице входа у меня также есть скрытый токен CSRF.

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>

Он работает нормально, когда я разрабатывал и тестировал его в своем локальном окружении (на моем ноутбуке), но не работал, когда я тестировал его на тестовом сервере. Это приведет к ошибкам типа «токены CSRF не совпадают». или «Неправильная капча» (даже если я правильно ответил) или иногда «Отсутствует токен CSRF».

Я пробовал так много вещей, как использование decorator @csrf_exempt для этой конкретной страницы входа. Я также добавил это:

@app.after_request
def apply_caching(response):
    response.headers["X-Frame-Options"] = "SAMEORIGIN"
    response.headers["Cache-Control"] = "public, max-age=0, no-cache, no-store, must-revalidate"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "0"
    return response

Но, похоже, ничего не работает. Меня действительно удивляет, почему он работает на локальном, а не на тестовом сервере. Я пытался не использовать csrf_token () на странице входа в систему, но он выдал ошибку из-за отсутствия токена csrf. Использование Google ReCaptcha не вариант, потому что пользователь не хочет использовать это.

Интересно, это потому, что токен captcha конфликтует с токеном csrf?

1 Ответ

0 голосов
/ 08 ноября 2018

Можете ли вы попробовать flask_recaptcha?

Ниже приведены свернутые примеры.

#app/__init__.py
from flask_recaptcha import ReCaptcha
recaptcha = ReCaptcha(app=app)

#app/views/your_view.py
@app.route('/a_view_for_demo/', methods=['GET', 'POST'])
def a_view_for_demo():
    a_form = AForm()
    if a_form.validate_on_submit() and recaptcha.verify():
        # do your thing after validation.

    return render_template('a_template.html', a_form=a_form)

#app_config
RECAPTCHA_ENABLED=True
RECAPTCHA_SITE_KEY="get this key from Google"
RECAPTCHA_SECRET_KEY="get this key from Google"

# a_template.html

<form .....>
   {{ a_form.csrf_token }}
   {{ recaptcha }}
</form>
...