Spring Security(十一) Spring Security 中 CSRF

从刚开始学习 Spring Security 时,在配置类中一直存在这样一行代码:http.csrf().disable();如果没有这行代码导致用户无法被认证。这行代码的含义是:关闭 csrf 防护。

1 什么是 CSRF

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“OneClick Attack” 或者 Session Riding。通过伪造用户请求访问受信任站点的非法请求访问。

跨域:只要网络协议,ip 地址,端口中任何一个不相同就是跨域请求。

客户端与服务进行交互时,由于 http 协议本身是无状态协议,所以引入了cookie进行记录客户端身份。在cookie中会存放session id用来识别客户端身份的。在跨域的情况下,session id 可能被第三方恶意劫持,通过这个 session id 向服务端发起请求时,服务端会认为这个请求是合法的,可能发生很多意想不到的事情。

2 Spring Security 中 中 CSRF

从 Spring Security4 开始 CSRF 防护默认开启。默认会拦截请求。进行 CSRF 处理。CSRF 为了保证不是其他第三方网站访问,要求访问时携带参数名为_csrf 值为 token(token 在服务端产生)的内容,如果token 和服务端的 token 匹配成功,则正常访问。

2.1 实现步骤

2.1.1 编写控制器方法

编写控制器方法,跳转到 templates 中 login.html 页面。

@GetMapping( "/showLogin")
public String showLogin() {
   return  "login";
}

2.1.2 新建 login.html

在项目 resources 下新建 templates 文件夹,并在文件夹中新建login.html 页面。红色部分是必须存在的否则无法正常登录。

<!DOCTYPE  html>
<l html  xmlns= "http://www.w3.org/1999/xhtml"
xmlns: th= = "http://www.thymeleaf.org">
	<head>
		<meta  charset= "UTF-8">
		<title>Title</ title>
	</head>
	<body>
		<form action ="/login"  method= "post">
			<input type="hidden"  th:value="${_csrf.token}"  name="_csrf"  th:if="${_csrf}"/>
			用户名:<input  type="text"  name= "username"/>< br/>
			密码:<input  type="password"  name= "password"/>< br/>
			<input  type="submit"  value="登录"/>
		</form>
	</body>
</html>

2.1.3 修改配置类

在配置类中注释掉 CSRF 防护失效

//关闭 csrf 防护
//http.csrf().disable();

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Security提供了防止跨站点请求伪造(CSRF)攻击的机制。在Spring Security使用CSRF可以通过以下步骤实现: 1. 在HTML表单添加CSRF令牌。 2. 配置Spring Security以启用CSRF保护。 3. 配置CSRF令牌在表单提交时如何发送到服务器。 下面是一个基本的示例: 1. 在HTML表单添加CSRF令牌 在表单添加CSRF令牌可以防止攻击者向服务器发送伪造的请求。可以使用Spring Security的标签库来添加CSRF令牌。以下是一个示例: ```html <form method="post" action="/process-form"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> <!-- 其他表单元素 --> <button type="submit">Submit</button> </form> ``` 在这个例子,我们使用了隐藏的输入字段来存储CSRF令牌,并使用Spring Security的EL表达式来生成令牌名称和值。 2. 配置Spring Security以启用CSRF保护 要启用Spring SecurityCSRF保护,需要配置一个CsrfTokenRepository。以下是一个示例: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); } } ``` 在这个例子,我们使用了CookieCsrfTokenRepository作为CsrfTokenRepository。这个仓库将生成一个CSRF令牌,并将其存储在一个cookie,这个cookie会在每个请求发送回服务器。 3. 配置CSRF令牌在表单提交时如何发送到服务器 当表单被提交时,需要将CSRF令牌发送回服务器。可以使用以下代码片段来从页面的隐藏字段提取CSRF令牌,并在表单提交时将其发送回服务器: ```javascript $(function () { var csrfToken = $("meta[name='_csrf']").attr("content"); var csrfHeader = $("meta[name='_csrf_header']").attr("content"); $(document).ajaxSend(function(e, xhr, options) { xhr.setRequestHeader(csrfHeader, csrfToken); }); }); ``` 在这个例子,我们使用了jQuery来提取页面CSRF令牌,并将其作为请求头发送回服务器。 以上是一个基本的Spring Security使用CSRF的示例。如果需要更高级的配置,可以参考Spring Security的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

plenilune-望月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值