如何对单页应用程序使用 Flask-WTF CSRF 保护?
How to use Flask-WTF CSRF protection for Single Page Apps?
我注意到 Flask-WTF 生成的令牌会在一小时后过期,并且每个请求都会生成一个不同的令牌。当页面打开时间超过一个小时时,这将导致 SPA 出现问题。页面加载后一小时后发出的 XHR 请求将开始失败,即使用户处于活动状态也是如此。
我的解决方法是在每次 API 调用时在浏览器中设置一个新令牌。在服务器中,所有 API 响应都包含一个新生成的令牌:
from flask_wtf.csrf import generate_csrf
def api_response(data, error=None):
response = {"csrftoken": generate_csrf(), "data":data}
...
return make_response(jsonify(response), response_code)
在浏览器中,我们在每个 API 响应上设置 csrftoken。
then(function(result) {
if(result.csrftoken) csrftoken=result.csrftoken;
callback(result);
})
这个方法还安全快速吗?有没有更好的方法来处理这个问题?我不太确定直接使用generate_csrf。
不,没有其他方法可以在 Flask-WTF 中使用 CSRF 保护。当您需要 CSRF 令牌时,您需要生成一个并使用它。像你这样生成应该没有问题。它仍然在服务器上以相同的方式生成和验证,并通过相同的通道传输到客户端。
我注意到 Flask-WTF 生成的令牌会在一小时后过期,并且每个请求都会生成一个不同的令牌。当页面打开时间超过一个小时时,这将导致 SPA 出现问题。页面加载后一小时后发出的 XHR 请求将开始失败,即使用户处于活动状态也是如此。
我的解决方法是在每次 API 调用时在浏览器中设置一个新令牌。在服务器中,所有 API 响应都包含一个新生成的令牌:
from flask_wtf.csrf import generate_csrf
def api_response(data, error=None):
response = {"csrftoken": generate_csrf(), "data":data}
...
return make_response(jsonify(response), response_code)
在浏览器中,我们在每个 API 响应上设置 csrftoken。
then(function(result) {
if(result.csrftoken) csrftoken=result.csrftoken;
callback(result);
})
这个方法还安全快速吗?有没有更好的方法来处理这个问题?我不太确定直接使用generate_csrf。
不,没有其他方法可以在 Flask-WTF 中使用 CSRF 保护。当您需要 CSRF 令牌时,您需要生成一个并使用它。像你这样生成应该没有问题。它仍然在服务器上以相同的方式生成和验证,并通过相同的通道传输到客户端。