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。