【发布时间】:2013-04-25 16:22:30
【问题描述】:
现在,我们每个会话都有 csrf 令牌。并使用隐藏字段添加此令牌 jsp。以下 sn-p 每个会话只给出一个:
token = (String) session.getAttribute(CSRF_TOKEN_FOR_SESSION_NAME);
if (null==token) {
token = UUID.randomUUID().toString();
session.setAttribute(CSRF_TOKEN_FOR_SESSION_NAME, token);
}
对于每个请求,
//calls the above snippet and this time token will not be null
String st = CSRFTokenManager.getTokenForSession(request.getSession());
String rt = CSRFTokenManager.getTokenFromRequest(request);
在这里,使用等于比较字符串并返回真或假。
我的问题是,如果我尝试为每个请求生成令牌而不从会话中获取令牌会发生什么情况。在比较时,我会从会话中得到请求。这是个好主意还是遗漏了什么?
我将不使用上面的 sn-ps,而是使用以下
//for every request generate a new and set in session
token = UUID.randomUUID().toString();
session.setAttribute(CSRF_TOKEN_FOR_SESSION_NAME, token);
//get the token from session and request and compare
String st = (String) request.getSession().getAttribute("CSRF_TOKEN_FOR_SESSION_NAME");
String rt = CSRFTokenManager.getTokenFromRequest(request);
【问题讨论】:
-
您可以生成一个令牌,根本不将其存储在会话中。将其作为隐藏字段添加到表单并作为 cookie。当您收到请求时,比较字段和 cookie 的值。
-
不确定..但是,我认为 cookie 容易受到 CSRF 攻击
-
@ user1609085 CSRF 令牌的想法是攻击者试图发送“隐藏”请求冒充另一个用户 A。攻击者使用其他网站可以注入一些恶意 javascript 代码,这里很重要是他不能从这个站点发送 cookie 或特殊标头中的令牌(浏览器不允许攻击者这样做),这就是为什么令牌通常放在那里。
标签: java jsp spring-security csrf