浏览器返回按钮问题与CSRF预防机制



我尝试使用OWASAP机制来保护我的遗留应用程序表单CSRF,但导航和后退按钮出现了问题。然后我尝试使用struts-1令牌机制,但遇到了同样的问题。我认为令牌注入机制的问题是,最初我们将在jsp中生成一个令牌,并将其存储在会话中,然后执行一些操作。

考虑一下A.jsp.lets在jsp中取令牌值1,我们将把它存储在会话中。现在我们将在filter/Action类中验证它。之后,我们将在B.jsp中进行一些其他操作,在jsp和会话中我们将获得令牌新值2。在验证表单服务器之后,我们将在会话中获得值2。现在,如果我们使用浏览器返回按钮导航并移动到第1页并提交它,它将从缓存加载值,A.jsp将使用值1作为令牌,在此时提交A.jsp之后,它将显示CSRF错误,因为它与会话中的值相矛盾。

有没有一种方法可以在不干扰应用程序的情况下实现CSRF预防机制?

所以,如果我正确理解您的问题,按下"后退"按钮,您会用旧令牌从缓存中获得页面吗?如果我是对的,那么有一种简单的方法可以解决这个问题——不要缓存页面,而是一直从服务器加载它们。

可以通过设置以下响应标头来实现

Cache-Control: max-age=0, no-cache, must-revalidate

另一种更困难的方法是实现单页应用程序,在这种情况下,浏览器内存中总是有实际的令牌。