149.md 3.0 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 春季 CSRF 保护

> 原文: [https://javatutorial.net/csrf-protection-in-spring](https://javatutorial.net/csrf-protection-in-spring)

在本教程中,您将学习如何保护应用程序免受 CSRF 的侵害。

![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)

## 什么是 CSRF?

如果您已经知道什么 CSRF,请随时继续阅读本分点。 但是,如果您不这样做,CSRF 代表**跨站点请求伪造**,简单地说,就是攻击者使经过身份验证的用户在网站上执行操作。 结果– **未经授权的用户执行 Web 应用程序信任的操作。**

一个典型的例子是,当用户登录时,网站发送分配给 cookie 的令牌信息作为响应的一部分。 现在用户已经登录,攻击者将尝试使用户从 CSRF 攻击开始的地方访问攻击者的网站。 为了使用户访问其网站,攻击者通常通过电子邮件发送电子邮件。 如果用户单击该链接,则网站上有 1 个或什至更多的 API。 与用户访问过的 Cookie 信息一起发送了请求。 现在,攻击者可以对用户的数据/帐户进行未经授权的更改,例如转移资金。

## 如何预防 CSRF?

有两种方法可以防止 CSRF。

W
wizardforcel 已提交
19
其中之一是通过实现相同的来源策略。 根据此策略,Web 浏览器允许一个网页中包含的脚本访问另一个网页**中的数据,但前提是两个网页具有相同的来源。** 此方法取决于 [HTTP Cookies](https://en.wikipedia.org/wiki/HTTP_cookie)
W
init  
wizardforcel 已提交
20 21 22

另一个是通过应用每个会话/每个请求令牌来过滤作为 CSRF 攻击而来的请求。

W
wizardforcel 已提交
23
## Spring 实现中如何防止 CSRF
W
init  
wizardforcel 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

```java
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,在这种情况下,它称为 XSRF-TOKEN。

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

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

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

因此,我们设法编写了自己的 Filter 类来查找特定的 cookie,以防止 CSRF;如果该 cookie 存在,则将其添加到服务器响应中;如果不存在,则使用给定名称创建一个新的 cookie。