【发布时间】:2017-09-01 08:22:37
【问题描述】:
大家好。
我的 Web 应用程序基于异步请求。 Timer 小部件正在工作并通过 AJAX 每秒更新它的状态(是的,这是必要的)。
我用每个 AJAX 发送我的 CSRF 令牌:
project_data.append(csrf_name_key,csrf_name_value);
project_data.append(csrf_value_key,csrf_value_value);
作为回应,我正在更新该全局变量:
function setCSRF(response) {
csrf_name_key = response.nameKey;
csrf_name_value = response.name;
csrf_value_key = response.valueKey;
csrf_value_value = response.value;
}
一切都很好。但是,如果我将执行另一个 AJAX,例如当我将待办事项列表中的任务更改为“完成”时,它有时会以错误结束,因为我在从之前的请求中获取新令牌之前发送 AJAX。
我真的不知道如何解决这个问题。第一个想法是,我将使用 5 个不同的令牌制作“类似堆栈数组”,但一个 https 请求 = 一对令牌,我无法生成它。
也许是某种类型的 ajax 请求队列,但是在正确的时间执行它们会怎样 - 我不知道。
我的实际伪解决方案是“如果失败,最多再试 10 次”:
if(e.target.response=="Failed CSRF check!") {
if(failedAjax<10) checkForSurvey();
failedAjax++;
return;
}
它通常可以工作,但控制台中出现错误,这是非常肮脏的解决方案。
我正在使用带有 CSRF 扩展的 Slim 3 微框架。真的请帮忙解决这个有趣的问题。
我将不胜感激,
亚瑟
【问题讨论】:
-
我会给每个动作(定时器、更新待办事项等)自己的 csrf 令牌。
-
但要生成令牌,您需要发出 http 请求。为了提出这个请求,您需要传递实际的令牌或等待 - 也许我会关闭“令牌生成器”路由的 CSRF 保护?这是保存解决方案吗?
-
你不能在页面加载时发送初始令牌吗?
-
您可以采用这种方法,因为您可以为每个会话库创建一个 CSRF 令牌数组,然后检查数组中是否存在传入的令牌。如果是,那么您可以验证请求,否则,每分钟触发另一个 ajax,这将从数组中删除旧的 csrf 令牌。但由于我不知道苗条框架,所以我不能建议你如何破解苗条来实现这个。我希望这可以达到您的目的
-
那么你应该使用 CSRF 令牌来请求一个新的 csrf 令牌数组,正如 @AbhisekMalakar 所说如果你不担心性能,你可以让 ajax 请求等到新的 CSRF 令牌到达.
标签: javascript php ajax csrf slim