全站CSRF漏洞

文章目录

          • 二、解决方案
            • 2.1. 创建CSRF防御统一管理
            • 2.2. 创建csrfToken校验
            • 2.3. 加密工具类
            • 2.4. 查询实战
            • 2.5. 添加和更新实战

默认guns不支持添加headers的需要添加ax2

二、解决方案
2.1. 创建CSRF防御统一管理
package com.gblfy.sys.config.web.csrf;import com.gblfy.base.utils.SHACoderUtil;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;/*** CSRF防御统一管理** @author gblfy* @date 2020-12-13*/
public final class CSRFTokenManager {/*** token令牌参数名*/static final String CSRF_PARAM_NAME = "cSRFToken";/*** 会话中存储令牌的位置(session中的csrfToken的key)*/public static final String CSRF_TOKEN_FOR_SESSION_ATTR_NAME = CSRFTokenManager.class.getName() + ".tokenval";public static String getTokenForSession(HttpSession session) {String token = null;//我不能允许一个会话中有多个令牌——在两个的情况下//尝试并发地初始化token令牌的请求// init the token concurrentlysynchronized (session) {token = (String) session.getAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME);if (null == token) {token = SHACoderUtil.encodeSHA256Hex(cn.hutool.core.lang.UUID.randomUUID().toString());session.setAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME, token);}}return token;}/*** Extracts the token value from the session** @param request* @return*/public static String getTokenFromRequest(HttpServletRequest request) {return request.getParameter(CSRF_PARAM_NAME);}private CSRFTokenManager() {}public static void main(String[] args) {System.out.println(CSRF_TOKEN_FOR_SESSION_ATTR_NAME);}
}
2.2. 创建csrfToken校验
package com.gblfy.sys.config.web.csrf;import com.gblfy.sys.core.exception.page.InvalidCSRFTokenException;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Component
public class CsrfToken {/*** 校验CsrfToken是否合法** @param request* @param session*/public static void checkCsrfToken(HttpServletRequest request, HttpSession session) {String requestHeaderToken = request.getHeader("__RequestVerificationToken");String sessionCsrfToken = session.getAttribute(CSRFTokenManager.CSRF_TOKEN_FOR_SESSION_ATTR_NAME).toString();if (requestHeaderToken == null|| "".equals(requestHeaderToken)|| "".equals(sessionCsrfToken)|| sessionCsrfToken == null|| !requestHeaderToken.equals(sessionCsrfToken)) {throw new InvalidCSRFTokenException();}}
}
2.3. 加密工具类
  <!--SHA256Hex加密--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.13</version></dependency>
package com.gblfy.base.utils;import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Component;@Component
public  class SHACoderUtil {
/*** SHA256Hex加密** @param data 待加密数据* @return String 消息摘要* @throws Exception*/public static String encodeSHA256Hex(String data)  {// 执行消息摘要return DigestUtils.sha256Hex(data);}public static void main(String[] args) throws Exception {String pasww = encodeSHA256Hex("");System.out.println("####"+pasww);}}
2.4. 查询实战
/*** 跳转到查看管理员列表的页面** @author gblfy* @Date 2018/12/24 22:43*/@RequestMapping("")public String index(Model model,HttpServletRequest request)  {model.addAttribute(ConstDb.CSRF_TOKEN, CSRFTokenManager.getTokenForSession(request.getSession()));return PREFIX + "user.html";}
 <input type="hidden" id="cSRFToken" value="${csrf}" name="cSRFToken">

在这里插入图片描述

   var headers = {};headers['__RequestVerificationToken'] = $("#cSRFToken").val();// 渲染表格var tableResult = table.render({elem: '#' + MgrUser.tableId,url: Feng.ctxPath + '/mgr/list',headers:headers,page: true,height: "full-98",cellMinWidth: 100,toolbar: '<div>工具栏</div>',defaultToolbar: ['filter', 'print'],cols: MgrUser.initColumn()});

在这里插入图片描述

/*** 查询管理员列表** @author gblfy* @Date 2018/12/24 22:43*/@RequestMapping("/list")@Permission@ResponseBodypublic Object list(@RequestParam(required = false) String name,@RequestParam(required = false) String timeLimit,@RequestParam(required = false) Long deptId, HttpServletRequest request, HttpSession session)  {//校验CsrfToken是否合法CsrfToken.checkCsrfToken(request,session);// ----------------------正常逻辑----------------------//拼接查询条件String beginTime = "";String endTime = "";if (ToolUtil.isNotEmpty(timeLimit)) {String[] split = timeLimit.split(" - ");beginTime = split[0];endTime = split[1];}if (ShiroKit.isAdmin()) {Page<Map<String, Object>> users = userService.selectUsers(null, name, beginTime, endTime, deptId);Page wrapped = new UserWrapper(users).wrap();return LayuiPageFactory.createPageInfo(wrapped);} else {DataScope dataScope = new DataScope(ShiroKit.getDeptDataScope());Page<Map<String, Object>> users = userService.selectUsers(dataScope, name, beginTime, endTime, deptId);Page wrapped = new UserWrapper(users).wrap();return LayuiPageFactory.createPageInfo(wrapped);}}
2.5. 添加和更新实战
/*** 跳转到查看管理员列表的页面** @author gblfy* @Date 2018/12/24 22:43*/@RequestMapping("/user_add")public String addView(Model model,HttpServletRequest request)  {model.addAttribute(ConstDb.CSRF_TOKEN, CSRFTokenManager.getTokenForSession(request.getSession()));return PREFIX + "user_add.html";}/*** 跳转到编辑管理员页面** @author gblfy* @Date 2018/12/24 22:43*/@Permission@RequestMapping("/user_edit")public String userEdit(@RequestParam Long userId,Model model,HttpServletRequest request)  {model.addAttribute(ConstDb.CSRF_TOKEN, CSRFTokenManager.getTokenForSession(request.getSession()));if (ToolUtil.isEmpty(userId)) {throw new ServiceException(BizExceptionEnum.REQUEST_NULL);}User user = this.userService.getById(userId);LogObjectHolder.me().set(user);return PREFIX + "user_edit.html";}
<input type="hidden" id="cSRFToken" value="${csrf}" name="cSRFToken">

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

layui.use(['layer', 'form', 'admin', 'laydate', 'ax', 'ax2'], function () {var $ = layui.jquery;var $ax = layui.ax;var $ax2 = layui.ax2;var form = layui.form;var admin = layui.admin;var laydate = layui.laydate;var layer = layui.layer;
    var headers = {};headers['__RequestVerificationToken'] = $("#cSRFToken").val();// 表单提交事件form.on('submit(btnSubmit)', function (data) {var ajax = new $ax2(Feng.ctxPath + "/mgr/add", headers, function (data) {Feng.success("添加成功!");//传给上个页面,刷新table用admin.putTempData('formOk', true);//关掉对话框admin.closeThisDialog();}, function (data) {Feng.error("添加失败!" + data.responseJSON.message)});ajax.set(data.field);ajax.start();});
});

在这里插入图片描述

layui.define(['jquery'], function (exports) {var $ = layui.$;var $ax2 = function (url,headers,success, error) {this.url = url;this.type = "post";this.data = {};this.dataType = "json";this.async = false;this.success = success;this.error = error;this.headers = headers;};$ax2.prototype = {start: function () {var me = this;var result = "";if (this.url.indexOf("?") === -1) {this.url = this.url + "?jstime=" + new Date().getTime();} else {this.url = this.url + "&jstime=" + new Date().getTime();}$.ajax({type: me.type,url: me.url,dataType: me.dataType,async: me.async,data: me.data,headers: me.headers,beforeSend: function (data) {},success: function (data) {result = data;if (me.success !== undefined) {me.success(data);}},error: function (data) {if (me.error !== undefined) {me.error(data);}}});return result;},set: function (key, value) {if (typeof key === "object") {for (var i in key) {if (typeof i === "function")continue;this.data[i] = key[i];}} else {this.data[key] = (typeof value === "undefined") ? $("#" + key).val() : value;}return this;},setData: function (data) {this.data = data;return this;},clear: function () {this.data = {};return this;}};exports('ax2', $ax2);
});

在这里插入图片描述
在这里插入图片描述

    /*** 添加管理员** @author gblfy* @Date 2018/12/24 22:44*/@RequestMapping("/add")@BussinessLog(value = "添加管理员", key = "account", dict = UserDict.class)@Permission(Const.ADMIN_NAME)@ResponseBodypublic ResponseData add(@Valid UserDto user, BindingResult result, HttpServletRequest request, HttpSession session)  {//校验CsrfToken是否合法CsrfToken.checkCsrfToken(request,session);// ----------------------正常逻辑----------------------if (result.hasErrors()) {throw new ServiceException(BizExceptionEnum.REQUEST_NULL);}this.userService.addUser(user);return SUCCESS_TIP;}/*** 修改管理员** @author gblfy* @Date 2018/12/24 22:44*/@RequestMapping("/edit")@BussinessLog(value = "修改管理员", key = "account", dict = UserDict.class)@ResponseBodypublic ResponseData edit(@Valid UserDto user, BindingResult result, HttpServletRequest request, HttpSession session)  {//校验CsrfToken是否合法CsrfToken.checkCsrfToken(request,session);// ----------------------正常逻辑----------------------if (result.hasErrors()) {throw new ServiceException(BizExceptionEnum.REQUEST_NULL);}this.userService.editUser(user);return SUCCESS_TIP;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AutoML数据增广

DeepAugment是一个专注于数据扩充的自动化工具。 它利用贝叶斯优化来发现针对您的图像数据集定制的数据增强策略。 DeepAugment的主要优点和特点是&#xff1a; 降低CNN模型的错误率(WRN-28-10显示CIFAR10的错误率降低了60%)通过自动化流程可以节省时间比谷歌之前的解决方案—…

基于TensorFlow.js的JavaScript机器学习

Credits: aijs.rocks 虽然python或r编程语言有一个相对容易的学习曲线&#xff0c;但是Web开发人员更喜欢在他们舒适的javascript区域内做事情。目前来看&#xff0c;node.js已经开始向每个领域应用javascript&#xff0c;在这一大趋势下我们需要理解并使用JS进行机器学习。由…

阿里巴巴、支付宝员工都在用的知识管理工具,究竟有何特别?

公司内各部门工作文档难以共享&#xff1f;缺乏高效便捷的团队协作工具&#xff1f;文档放到在线云平台担心安全&#xff1f;…… 2019年4月22日&#xff0c;蚂蚁金服旗下知识创作与分享工具语雀发布“空间功能”。语雀在支持在线文档编写、多人协作、灵活的团队管理和金融级安…

探索处理数据的新方法,8 个重点带你搞懂云数据库——DBaaS(数据库即服务)到底是什么!...

作者| Rohan Wadiwala、Mangesh More翻译 | 天道酬勤&#xff0c;编辑 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在分析的世界中&#xff0c;网站的每次点击都是数据分析的候选对象&#xff0c;显然&#xff0c;这会涉及大量的数据生成。对于海…

阿里开发者招聘节 | 面试题05: 关于epoll和select的区别,哪些说法是正确的?

为帮助开发者们提升面试技能、有机会入职阿里&#xff0c;云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次将陆续放出&#xff08;面试题官方参考答案将在专辑结束后统一汇总分享&#xff0c;点此进入答题并围观他…

c语言printf里的自增,笔试题记录:C语言——函数printf()的执行机制;先自增与后自增的区别;取值运算与自增运算的优先级...

考点&#xff1a;函数printf()的执行机制&#xff1a;参数按照从右至左的顺序入栈&#xff0c;在调用时出栈&#xff1b;考察运算符“”在变量之前、变量之后的运算机制&#xff0c;即是先赋值/还是先自增*(p)、*(p)、*(p1)之间的区别后面两项主要是考察&#xff1a;取值运算与…

分布式系统:CAP 理论的前世今生

CAP 理论是分布式系统设计中的一个重要理论&#xff0c;虽然它为系统设计提供了非常有用的依据&#xff0c;但是也带来了很多误解。本文将从 CAP 诞生的背景说起&#xff0c;然后对理论进行解释&#xff0c;最后对 CAP 在当前背景下的一些新理解进行分析&#xff0c;澄清一些对…

你的企业混合云了吗?来看看评估混合云解决方案时要注意的6个原则!

作者| Matt Kimball翻译 | 天道酬勤&#xff0c;编辑 | Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;混合云如今很流行。几乎每个IT公司都声称已部署了解决方案&#xff0c;但实际上实现的却很少。相反&#xff0c;它们拥有与多个云实例进行某种程度…

c语言int超出范围字符串,Go返回int64类型字段超出javascript Number范围的解决方法...

Go返回int64类型字段超出javascript Number范围的解决方法最近在项目中&#xff0c;一个go服务给前端提供了一个接口&#xff0c;返回json格式数据&#xff0c;其中Int64字段会超出javascript Number可表示的最大的Int值会丢精度&#xff0c;可以通过返回string类型值来屏蔽这个…

构建可靠系统的原则与实践

随着阿里技术的发展&#xff0c;我们的技术系统越来越成为社会的基础设施&#xff0c;对于这些系统的可靠性要求也就越来越高。但是实际上很多的基础的产品和系统确仍然会出现一些稳定性问题&#xff0c;那么如何才能构建可靠的系统呢&#xff1f;是不是制定非常严格而细致的规…

看完就能独自把集群搭起来!Hadoop HDFS完全分布式环境搭建以及技术详解

作者 | 慢慢变成大佬责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在文章开始之前&#xff0c;作者想要告诉大家&#xff1a;读懂本篇文章&#xff0c;能让小白快速入门&#xff0c;并且能够搭建完全分布式的集群&#xff0c;以及能对Hadoop …

使用idea创建JavaWeb项目

【第一步】 File—New—Project 【第二步】 选择Java Enterprise版本&#xff0c;然后配置tomcat 注意&#xff1a;这里关联的tomcat home指的是tomcat的解压目录&#xff08;bin目录的上一级目录&#xff09;&#xff1b; 【第三步】 选择使用模板创建项目 【第四步】 填写…

阿里云栖开发者沙龙PHP技术专场-聊聊服务稳定性保障这些事

本文主要带大家了解服务稳定性的重要性和相关策略。策略大概分两部分&#xff0c;第一方面从架构层面介绍保障服务稳定性的常见策略&#xff08;限流&#xff0c;降级&#xff0c;隔离&#xff0c;超时&#xff0c;重试和集群&#xff09;。第二个方面是从流程方面&#xff08;…

ccs读取dat文件c语言程序,TMS320DM642学习----第六篇(CCS中.dat文件类型详解)

1、如下为.dat文件中文件头的基本格式&#xff1a;MagicNumber Format StartingAddress PageNum Length [NewFormat]下面是分别的解释&#xff1a;MagicNumber&#xff1a;1651.Format&#xff1a;a number from 1 to 4, indicating the format of the samples in the file. Th…

阿里开发者招聘节 | 面试题06-07: MySQL的数据如何恢复到任意时间点

为帮助开发者们提升面试技能、有机会入职阿里&#xff0c;云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次将陆续放出&#xff08;面试题官方参考答案将在专辑结束后统一汇总分享&#xff0c;点此进入答题并围观他…

通过接口操作MyBatis及数据库配置文件

优点&#xff1a; 不用每次实例化SqlSession配置优于硬编码减少sql书写错误的概率规范代码&#xff0c;面向接口服务 文章目录一、回顾二、如何通过接口操作MyBatis2.1. 文件结构2.2. 依赖jar包2.3. 表结构2.4. mybatis配置文件2.5. db配置文件2.6. 获取SqlSession工具类2.7. 基…

厉害!中国AI企业50强榜单!看完员工待遇,网友:我酸了!

有自媒体说&#xff0c;现在各大国对AI的部署&#xff0c;就像对“核武器”的部署一样&#xff0c;这份脑力和智力的比拼&#xff0c;超级大国都绝对不能输。在最近&#xff0c;赛迪研究院就发布了「2019人工智能企业综合实力100强名单」&#xff0c;BAT毫无疑问霸榜&#xff0…

蚂蚁金服SOFA开源负责人鲁直:不只是中间件,未来会开源更多

近日&#xff0c;技术媒体Linux中国的创始人王兴宇对蚂蚁金服SOFA开源负责人鲁直&#xff0c;就SOFA 5、ServiceMesh、Serverless、Seata等技术内容进行了探讨&#xff0c;以下为专访文章。 虽然我和鲁直在微信上已经联系很久了&#xff0c;但这还是第一次见面。交谈中&#x…

Redis radix tree源码解析

Redis实现了不定长压缩前缀的radix tree&#xff0c;用在集群模式下存储slot对应的的所有key信息。本文将详述在Redis中如何实现radix tree。 核心数据结构 raxNode是radix tree的核心数据结构&#xff0c;其结构体如下代码所示&#xff1a; typedef struct raxNode {uint32…

针对提高48V 配电性能的诸多思考!

作者&#xff1a;Phil Davies 众所周知配电网络 (PDN) 是所有电源系统的主干部分&#xff0c;但随着系统电源需求的不断上升&#xff0c;传统 PDN 承受着提供足够性能的巨大压力。 对于功耗和热管理而言&#xff0c;主要有两种方法可以改善 PDN 对电源系统性能的影响&#x…