Spring CSRF保护

时间:2020-02-23 14:34:02  来源:igfitidea点击:

在本教程中,我们将学习如何保护应用程序免受CSRF的攻击。

什么是CSRF?

如果你已经知道什么是CSRF,可以继续不读这一小节。但如果你不这样做,CSRF代表 跨站点请求伪造,简单地说,就是攻击者让经过身份验证的用户在上执行操作。结果是– 未经授权的用户执行web应用程序信任的操作。

一个典型的例子是当用户登录时,发送令牌信息,作为响应的一部分分配给cookie。现在用户已经登录,攻击者试图让用户访问攻击者的,从那里开始CSRF攻击。为了让用户访问他的,攻击者通常会通过电子邮件发送电子邮件。如果用户单击了该链接,则该上有1个甚至更多的API。一个请求与先前作为用户访问的结果发送的cookie信息一起发送。现在攻击者可以对用户的数据/帐户进行未经授权的更改,例如转账。

如何预防CSRF?

有几种方法可以防止CSRF。

其中之一就是实施同一原产地政策。在此策略下,web浏览器允许包含在一个网页中的脚本访问另一个网页中的数据 但前提是两个网页的来源相同。此方法依赖于HTTP Cookie。

另一种方法是应用persession/per-request令牌来过滤作为CSRF攻击的请求。

如何防止Spring实施中的CSRF

public class TokenFilter extends OncePerRequestFilter {
	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
		CsrfToken csrfToken = (CsrfToken).request.getAttribute(CsrfToken.class.getName());

		if (csrfToken != null) {
			Cookie cookie = WebUtils.getCoookie(request, "XSRF-TOKEN");
			String token = csrf.getToken();

			if (cookie == null || !(token.equals(cookie.getValue())) && token != null) {
				cookie = new Cookie("XSRF-TOKEN", token);
				cookie.setPath("/");
				response.addCookie(cookie);
			}
		}

		filterChain.doFilter(request, response);
	}
}

故障

我们创建了一个名为TokenFilter的类,该类查找特定的cookie,在本例中,该cookie称为XSRF-TOKEN

Cookie cookie = WebUtils.getCoookie(request, "XSRF-TOKEN");

如果没有,我们将创建一个并分配令牌值,然后将cookie添加到服务器响应中。

if (cookie == null || !(token.equals(cookie.getValue())) && token != null) {
	cookie = new Cookie("XSRF-TOKEN", token);
	cookie.setPath("/");
	response.addCookie(cookie);
}

因此,我们通过编写自己的过滤器类来防止CSRF,该类查找特定的cookie,如果存在,它会将其添加到服务器响应中,如果没有,则使用给定的名称创建一个新的cookie。