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)
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将有所不同。
您可以在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,我仍在寻找一种更具反应性的方式
| 归档时间: |
|
| 查看次数: |
3202 次 |
| 最近记录: |