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>

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • getchar的用法举例_c语言strlen函数用法

    getchar的用法举例_c语言strlen函数用法在K&R的开头碰到了getchar函数的用法有些迷糊,在查找了一些资料以及动手实践后有了大致的了解。getchar函数,是从缓冲区读取数据的,而不是直接从键盘输入中读取数据的键盘的输入会保存在缓冲区中,同时会显示在屏幕上getchar函数执行时,每次从缓冲区中读取一个字符键盘输入enter或者ctrl+D后,getchar会检查缓冲区中是否有数据,如果有的话,会开始读…

    2022年10月9日
    4
  • python的flask框架_flask框架实例

    python的flask框架_flask框架实例Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,英文不好的同学也可以参考中文文档1.安装flaskpipinstallflask2.简单上手一个最小的Flask应用如下:fromflaskimportFlaskapp=Flask(__name__)@app.route(‘/’)defhello_world():return’HelloWorld’if__na

    2022年10月9日
    2
  • vscode怎样新建HTML文件_vscode快速生成html

    vscode怎样新建HTML文件_vscode快速生成html1、点击OpenFolder:2、选择目标文件夹,在本地新建一个拓展名为html的文件:3、在第1行输入!(英文状态下),按tab键,新建成功。界面如下图所示:…

    2022年8月22日
    7
  • 转 -如何改变*.sln文件的路径「建议收藏」

    转 -如何改变*.sln文件的路径「建议收藏」工具-》选项—》项目和解决方案,可以设置项目和解决方案的目录。选中解决方案,点击文件,可以出现,*.sln另存为的选项转载于:https://www.cnblogs.com/9421/archive/2010/02/01/1660764.html…

    2022年5月18日
    75
  • WIN32 API —— 最简单的Windows窗口封装类[通俗易懂]

    WIN32 API —— 最简单的Windows窗口封装类[通俗易懂]1开发语言抉择1.1关于开发Win32程序的语言选择C还是C++在决定抛弃MFC,而使用纯Win32API开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++。C+

    2022年8月1日
    4
  • 链式求导法则公式_链式法则求导基础题

    链式求导法则公式_链式法则求导基础题原题链接“计算图”(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络。 图中的节点表示基本操作或输入变量,边表示节点之间的中间值的依赖性。 例如,下图就是一个函数 ( 的计算图。现在给定一个计算图,请你根据所有输入变量计算函数值及其偏导数(即梯度)。 例如,给定输入,,上述计算图获得函数值 (;并且根据微分链式法则,上图得到的梯度 ∇。知道你已经把微积分忘了,所以这里只要求你处理几个简单的算子:加法、减法、乘

    2022年8月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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