使用 React Form、Flask 服务器和 Flask-WTF 保护 CSRF

Hum*_*01d 6 javascript csrf-protection flask-wtforms reactjs

TL;DR 我需要保护我的表单免受 CSRF 攻击,我想在前端使用 ReactJS,在后端使用 Flask/Flask-WTF。

我正在重构一个使用 Python、Flask 和 Flask-WTF 构建的用于表单的网站,我想将 React 用于前端,而不是通过 PyPugjs 使用 Jinja2。我正在使用 Flask-WTF 来呈现表单,它负责处理 CSRF 令牌等。我知道如何使用 React 制作表单,但如何获得 CSRF 保护?

现在我的表单渲染看起来像这样:(使用 Pug)

mixin render_form(form, id='', action='Submit')
    form(method='POST', action='', id=id)
        =form.csrf_token

        each field in form
            fieldset
                if field.errors
                    each error in field.errors
                        .notification.error
                            #{error}

                #{field(placeholder=field.label.text)}

        button(type='submit') #{action}
Run Code Online (Sandbox Code Playgroud)

kav*_*vun 6

X-CSRFTokenPOST 表单时,您需要将 csrf 令牌作为标头发送。在此处查看他们的文档:http : //flask-wtf.readthedocs.io/en/stable/csrf.html#javascript-requests

他们的示例 w/ POSTing via jQueryX-CSRFToken在发送任何 POST/PUT/DELETE ajax 请求之前设置:

<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>
Run Code Online (Sandbox Code Playgroud)

根据您用于将表单 POST 发送回服务器的库,您设置标头的实现X-CSRFToken将有所不同。


bla*_*lah 4

您可以在index.html的元标记中抛出{{csrf_token()}}

 <meta  id="csrf-token" content={{csrf_token()}}>
Run Code Online (Sandbox Code Playgroud)

然后当你想发布/获取时,只需将其添加到你的标题中

export const post = (path, data={}) => {

const options = {
    method: 'POST', 
    headers: {
        // 'Accept': 'application/json; charset=utf-8',
        // 'Content-Type': 'application/json; charset=utf-8',
        // 'Cache': 'no-cache',
        // 'X-Requested-With': 'XMLHttpRequest', 
        'X-CSRFToken': document.getElementById("csrf-token").getAttribute("content")
    }, 
    body: data
};

return fetch(path, options);
}
Run Code Online (Sandbox Code Playgroud)

PS这仍然感觉很hacky,我仍在寻找一种更具反应性的方式