SpringSecurity(十七)——CSRF

SpringSecurity(十七)——CSRF

一.引入

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

二.什么是CSRF

在这里插入图片描述
CSRF即跨站请求攻击。简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以被访问的站点会绝点是这是真正的用户操作而去运行.
这就利用了web中用户身份认证验证的一个漏洞:简单的身份验证仅仅能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
其实可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包含:以你的名义发送邮件;发消息;盗取你的账号;甚至于购买商品、虚拟货币转账…造成的问题包含个人隐私泄露以及财产安全。

三.Spring Security中CSRF

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

1.实现步骤

1)编写控制器方法

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

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

2)新建login.html

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

<!DOCTYPE html>
<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>

3)修改配置类

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

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

四.开启CSRF后的退出登录

如果我们开启了CSRF保护机制,则默认情况下,不能使用get方式的/logout
官方的说明:
在这里插入图片描述
翻译一下就是最简单的方式就是使用form表单退出,如果非要使用一个链接退出,可以通过JavaScript模拟一个表单,设置post退出。如果非要使用get方式退出,上图中官方也给出了代码
我们可以这么解决:

<form style="float: right" action="/logout" method="post">
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
    <button type='submit'>退出</button>
</form>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2347.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 环信集成常见错码

    环信集成常见错码

  • 百度发布新型肺炎搜索大数据报告:武汉网友关心疫情进展,快递查询需求激增

    百度发布新型肺炎搜索大数据报告:武汉网友关心疫情进展,快递查询需求激增肺炎疫情仍在升级。作为疫情风暴中心,武汉虽处在防疫前线,但“防疫”并不等于“恐鄂”。武汉人民当下的真实生活究竟如何,又最关注疫情的哪些方面,面临着哪些困境?今天,百度发布的《百度新型冠状病毒肺炎搜索大数据报告-武汉篇》(以下简称“报告”)显示,武汉人民相比全国人民“快半拍”关注疫情;武汉当地医疗物资缺乏的情况得到阶段性缓解,但需求仍然强烈;而由于出行不便,快递物流需求激增明显。此外,全国人民…

    2022年10月26日
  • 实现迪杰斯特拉算法求某个源点到其余个点_迪杰斯特拉算法应用举例

    实现迪杰斯特拉算法求某个源点到其余个点_迪杰斯特拉算法应用举例如下图,使用迪杰斯特拉算法求下图的最短路径跌代过程:1)初始时从1开始寻找各节点到该节点的距离,路不通设置为maxint,此时把1归为s里面2)从1)得到距离1最短的路径对应的结点如上图为2,

  • QT QTcpSocket「建议收藏」

    QT QTcpSocket「建议收藏」QTcpSocket类提供TCP套接字。TCP(传输控制协议)是一种可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输。QTcpSocket是QAbstractSocket的一个方便的子类,它允许您建立TCP连接和传输数据流。有关详细信息,请参见QAbstractSocket文档。注意:TCP套接字不能在QIODevice::Unbuffered模式下打开。请参见QTcpServer、QUdpSocket、QNetworkAccessManager、Fortune服务器示例、Fortu

  • nextline函数_Java中的nextline()函数与next()问题

    nextline函数_Java中的nextline()函数与next()问题【写在前面】importJava.util.*;Scannerin=newScanner(http://System.in);【出现的问题】在循环中相连的nextLine();会出现第一个nextLine();跳过的问题.就像这个样子://部分代码for(inti=0;iSystem.out.println();Stringname=in.nextLine();System.o…

  • phpstrom 2021 激活码(最新序列号破解)

    phpstrom 2021 激活码(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号