Flask-WTF CSRF 保护P3

使用FlaskForm处理请求的任何视图函数都已经获得了CSRF保护。如果有些视图函数还在使用FlaskForm或AJAX请求,请尽快使用FlaskForm提供的CSRF扩展来保护它们。

导入

想要为Flask应用程序启用全局CSRF保护,请注册CSRFProtect扩展。

from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect(app)

像其他Flask扩展一样,您可以傻瓜地应用它:

csrf = CSRFProtect()

def create_app():
    app = Flask(__name__)
    csrf.init_app(app)

注意
CSRF保护需要一个秘密密钥来安全地签署令牌。 默认情况下,这将使用Flask应用程序的SECRET_KEY。 如果要使用单独的令牌,可以设置WTF_CSRF_SECRET_KEY。

HTML Forms

当使用FlaskForm时,可以像正常平时一样渲染表单的CSRF字段。

<form method="post">
    {{ form.csrf_token }}
</form>

如果模板不使用FlaskForm,则设置input表单中的type为hidden。

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

JavaScript 请求

发送AJAX请求时,将X-CSRFToken头添加到请求中。例如在jQuery中,您可以配置发送的token给所有请求。

<script type="text/javascript">
    var csrf_token = "{{ csrf_token() }}";

    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrf_token);
            }
        }
    });
</script>

自定义错误响应

当CSRF验证失败时,会引发CSRFError。 默认情况下,这将返回一个带有失败原因的响应和一个400代码。 您可以使用Flask的errorhandler()自定义错误响应。

from flask_wtf.csrf import CSRFError

@app.errorhandler(CSRFError)
def handle_csrf_error(e):
    return render_template('csrf_error.html', reason=e.description), 400

视图保护过滤¶

我们强烈建议您使用CSRF保护您的所有观点。 但是如果确实需要,您可以使用装饰器过滤掉某些视图.

@app.route('/foo', methods=('GET', 'POST'))
@csrf.exempt
def my_handler():
    # ...
    return 'ok'

您可以过滤掉蓝图的所有视图。

csrf.exempt(account_blueprint)

默认情况下,通过将WTF_CSRF_CHECK_DEFAULT设置为False,可以在所有视图中禁用CSRF保护,只有在需要时才选择性地调用protect()。这也使您能够在检查CSRF token之前对请求进行一些预处理。

@app.before_request
def check_csrf():
    if not is_oauth(request):
        csrf.protect()
posted @ 2017-09-21 20:31  jihu9  阅读(958)  评论(0编辑  收藏  举报