spring security在java区域获取csrf令牌

时间:2016-08-31 06:09:13

标签: java spring spring-security csrf

使用spring security时,我们可以使用CSRF令牌。 我们可以在spring security xml和jsp中使用

> (<sec:csrfInput /> or <input type=”hidden”
> name=”${_csrf.parameterName}” value=”${_csrf.token}”/>).

但是如何在Java区域中获取csrf标记名称和值?

我必须在我的网络应用中从服务层向用户发送邮件。 并且csrf令牌必须存在于邮件内容中。

String html = new String( "<div style='width:600px; height:300px; margin:0 auto;'>" +
                "<h2 style='color:#FFBB00;'>lock release system</h2>" + 
                "<p style='color:#2F9D27'>your account has been locked. If you want to release the lock, you should click 'release user lock' button below." +
                "</p>" +
                "<hr>" +
                "<form action='http://122.40.73.117:9000/whiteboard/user/release-lock-user' method='post' target='_blank'>" +
                    "<input type='hidden' name='email' value='" + email + "' />" + 
                    "<input type='hidden' name='csrf' value='" + csrf + "' />" + 
                    "<button type='submit' style='font-weight:bold;'>release user lock</button>" + 
                "</form>" +     
            "</div>");

上面的代码使用CSRF变量,但这只是一个虚拟变量。 如何设置CSRF?

请帮帮我。

1 个答案:

答案 0 :(得分:1)

org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository 处理csrf令牌。 它定义了一个方法org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository #loadToken

基本上是

CsrfToken token
=session.getAttribute("HttpSessionCsrfTokenRepository.CSRF_TOKEN");

您可以在代码中尝试相同的操作,但需要访问HttpRequest或HttpSession,这应该不是问题。

一个csrf令牌始终属于一个会话。 因此,当生成csrf令牌时,如果用户通过邮件浏览器连接到与其使用的完全相同的会话,那么邮件中的代码将仅起作用。如果他在另一台设备上打开邮件,或者在会话超时后,这可能会出现问题。

Csrf令牌是客户端和服务器之间的秘密,以提高安全性。 通过邮件之类的不安全通道发送csrf令牌可以消除安全性。