我有一个现有的Flask应用程序,该应用程序广泛使用ajax请求来更改数据和页面。有许多动作会向服务器发出ajax请求,以修改和更改数据。
应用程序使用flask-wtf CSRF来防止跨站点Requst伪造。我的CSRF令牌的到期时间为60分钟。
现在,如果用户在选项卡中打开页面的时间超过一个小时,并提交了CSRF验证失败的表格,则抛出错误。
我想知道在我提出ajax请求时是否可以延长CSRF令牌的到期时间。
我当前的骇客:
现在我正在考虑拥有一个 csrf_fail_handler 函数,该函数可以在前一个失败时生成一个新的CSRF令牌,并在响应中将其发送为某些唯一状态代码。
然后,我的ajax响应处理程序功能可以检查响应中的状态代码并更新_csrf_token字段。
像这样的苏富美:
Python代码
@csrf.error_handler
def csrf_error(reason):
return render_template('csrf_error.html', reason=reason), 701 # my unique resposne code
csrf_error.html
{"_csrf" : {{csrf_token() }} }
针对ajaxError的jQuery ajax全局处理程序:
$( document ).ajaxError(function( x, response) {
if ( x.status == 701 ) {
$( "#csrf_token" ).val( response._csrf);
$('#notifiy').text("Please Retry").show();
}
});
这将给我新的CSRF令牌,以在前一个令牌失败时作出响应。然后在我的ajax处理程序中。
我想知道什么是最好的方法?这会影响安全性吗?
注意: 我知道最好的解决方案就是增加配置文件中CSRF的到期时间。但是,客户认为,如果到期时间超过一个小时,则可能是安全漏洞。