文章目录

  • 一、漏洞描述
  • 二、解决建议
  • 二、解决方法
    • Springboot 配置文件增加配置
    • 编写配置类
    • 编写过滤器

提示:以下是本篇文章正文内容,下面案例可供参考

一、漏洞描述

跨站请求伪造(Cross-site request forgery,简称CSRF),是一种常见的Web安全漏洞,由于在Web请求中重要操作的所有参数可被猜测到,攻击者可通过一些技术手段欺骗用户的浏览器去访问一个用户曾经认证过的网站,遂使攻击者可冒用用户的身份,进行恶意操作。
经测试,服务器未校验Referer头,因此攻击者可以直接构造一个恶意的访问地址让用户在不知情的情况下访问从而实现CSRF恶意操作。

二、解决建议

增加拦截器,判断referer是否合法,合法则放行。

二、解决方法

Springboot 配置文件增加配置

# 信息安全
security:#跨站点伪造请求配置csrf:#是否开启跨站点伪造请求过滤(开启:true 关闭:false)enable: true#不拦截的urlexcludes-url:- /- /login- /logout- /getLoginUrl#不拦截的域名excludes-domain:- localhost- 127.0.0.1

编写配置类

/*** @author wcs* @desccription: 系统安全配置类* @Date: 11:03 2022/2/17*/
@Configuration
@ConfigurationProperties(prefix = "security")
public class SecurityConfig {private CsrfConfig csrf;private AccountConfig account;public CsrfConfig getCsrf() {return csrf;}public void setCsrf(CsrfConfig csrf) {this.csrf = csrf;}public AccountConfig getAccount() {return account;}public void setAccount(AccountConfig account) {this.account = account;}
}
import java.util.List;/*** @author wcs* @desccription: 跨站点请求伪造* @Date: 11:05 2022/2/17*/
public class CsrfConfig {/*** 是否启用*/private boolean enable;public void setEnable(boolean enable) {this.enable = enable;}public boolean isEnable() {return enable;}/*** 忽略的URL*/private List<String> excludesUrl;public void setExcludesUrl(List<String> excludesUrl) {this.excludesUrl = excludesUrl;}public List<String> getExcludesUrl() {return excludesUrl;}/*** 忽略的domain*/private List<String> excludesDomain;public void setExcludesDomain(List<String> excludesDomain) {this.excludesDomain = excludesDomain;}public List<String> getExcludesDomain() {return excludesDomain;}
}

编写过滤器

/*** CSRF过滤器** @author wcs*/
@Configuration
@WebFilter(filterName = "CsrfFilter", urlPatterns = "/*")
public class CsrfFilter implements Filter {private static Logger LOGGER = LoggerFactory.getLogger(CsrfFilter.class);/*** 过滤器配置对象*/FilterConfig filterConfig = null;@Autowiredprivate SecurityConfig security;/*** 初始化*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;security.getCsrf().getExcludesDomain().addAll(Arrays.asList(new String[]{"localhost", "127.0.0.1"}));}/*** 拦截*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;String referer = request.getHeader("Referer");String serverName = request.getServerName();//如果 referer 为空放行if (StringUtils.isBlank(referer)) {filterChain.doFilter(servletRequest, servletResponse);return;}URL url = null;try {url = new URL(referer);} catch (MalformedURLException e) {servletResponse.setContentType("application/json; charset=UTF-8");servletResponse.getWriter().write(JSONUtil.toJsonStr(new ReturnT<>(ReturnT.FAIL_CODE, "系统不支持当前域名的访问!")));LOGGER.error("域名:{}解析异常", url);}referer = url.getHost();// 不启用或者已忽略的URL不拦截if (!security.getCsrf().isEnable() || isExcludeUrl(request.getServletPath())) {filterChain.doFilter(servletRequest, servletResponse);return;}if (StringUtils.isNotBlank(referer)) {// 不启用或者已忽略的domain不拦截if (!security.getCsrf().isEnable() || isExcludesDomain(referer)) {filterChain.doFilter(servletRequest, servletResponse);return;}}// 判断是否存在外链请求本站if (StringUtils.isNotBlank(referer) && referer.indexOf(serverName) < 0) {LOGGER.error("拦截到非法请求:=> 服务器域名:{} => 非法访问域名:{}", serverName, referer);servletResponse.setContentType("application/json; charset=UTF-8");servletResponse.getWriter().write(JSONUtil.toJsonStr(new ReturnT<>(ReturnT.FAIL_CODE, "系统不支持当前域名的访问!")));} else {filterChain.doFilter(servletRequest, servletResponse);}}/*** 销毁*/@Overridepublic void destroy() {this.filterConfig = null;}/*** 判断是否为忽略的URL** @param urlPath URL路径* @return true-忽略,false-过滤*/private boolean isExcludeUrl(String urlPath) {if (security.getCsrf().getExcludesUrl() == null || security.getCsrf().getExcludesUrl().isEmpty()) {return false;}return security.getCsrf().getExcludesUrl().stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(urlPath)).anyMatch(Matcher::matches);}/*** 判断是否为忽略的域名** @param urlPath URL路径* @return true-忽略,false-过滤*/private boolean isExcludesDomain(String urlPath) {if (security.getCsrf().getExcludesDomain() == null || security.getCsrf().getExcludesDomain().isEmpty()) {return false;}return security.getCsrf().getExcludesDomain().stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(urlPath)).anyMatch(Matcher::find);}
}

CSRF跨站请求伪造漏洞修复相关推荐

  1. 【安全牛学习笔记】CSRF跨站请求伪造***漏洞的原理及解决办法

    CSRF跨站请求伪造***漏洞的原理及解决办法 CSRF,夸张请求伪造漏洞 漏洞的原理及修复方法 1.常见的触发场景 2.漏洞原理:浏览器同源策略 3.DEMO 4.漏洞危害 5.如何避免&修 ...

  2. CSRF(跨站请求伪造)漏洞

    CSRF(Cross-site request forgery) 跨站请求伪造,由客户端发起,是一种劫持受信任用户向服务器发送非预期请求的攻击方式,与XSS相似,但比XSS更难防范,常与XSS一起配合 ...

  3. 漏洞解决方案-跨站请求伪造漏洞

    跨站请求伪造漏洞CSRF 跨站请求伪造漏洞CSRF 一.问题描述: 二.整改建议: 三.案例: 1. 客户端进行CSRF防御 2. 服务端进行CSRF防御 跨站请求伪造漏洞CSRF 一.问题描述: C ...

  4. 【安全牛学习笔记】CSRF跨站请求伪造攻击漏洞的原理及解决办法

    CSRF跨站请求伪造攻击漏洞的原理及解决办法 CSRF,夸张请求伪造漏洞 漏洞的原理及修复方法 1.常见的触发场景 2.漏洞原理:浏览器同源策略 3.DEMO 4.漏洞危害 5.如何避免&修复 ...

  5. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程...

    一.服务端请求伪造漏洞 服务端请求伪造(Server-Side Request Forgery),是指Web服务提供从用户指定的URL读取数据并展示功能又未对用户输入的URL进行过滤,导致攻击者可借助 ...

  6. 【CSRF漏洞-01】跨站请求伪造漏洞靶场实战

    概述 跨站请求伪造(Cross-site request forgery,CSRF)是一种攻击,它强制终端用户在当前对其进行身份验证后的web应用程序上执行非本意的操作. CSRF攻击的主要目的在伪造 ...

  7. Cisco跨站请求伪造漏洞

    Cisco于11月2日发布了安全更新,修复其部分产品中的多个漏洞.其中最严重的是跨站请求伪造漏洞(CVE-2022-20961),它影响了身份服务引擎(ISE),根本原因是基于Web的管理界面的CSR ...

  8. WordPress Citizen Space插件跨站请求伪造漏洞

    漏洞名称: WordPress Citizen Space插件跨站请求伪造漏洞 CNNVD编号: CNNVD-201307-463 发布时间: 2013-07-23 更新时间: 2013-07-23 ...

  9. WordPress WP cleanfix插件‘eval()’函数跨站请求伪造漏洞

    漏洞名称: WordPress WP cleanfix插件'eval()'函数跨站请求伪造漏洞 CNNVD编号: CNNVD-201305-381 发布时间: 2013-05-20 更新时间: 201 ...

  10. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结。

    之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让自己在接下来的面试有个清晰的概念. XSS跨站脚本攻击: xss 跨站脚本攻击(Cross Site Scripting),为了不和 ...

最新文章

  1. 快应用开发常见问题以及解决方案【持续更新】
  2. MySQL导出到excle显示不了_mysql导出select语句结果到excel文件遇到问题及解决方法_MySQL...
  3. background:#e5eecc;
  4. 2008春节长白山哈尔滨雪乡游
  5. boost的chrono模块时间间隔的测试程序
  6. Android怎么实现选课功能,选课系统android
  7. 综合布线故障排除和诊断—DSX-600
  8. C#如何回到主线程,如何在委托指定线程执行
  9. tablednd保存 php,JQuery-tableDnD 拖拽的基本使用介绍
  10. 【传输文件】文件传输协议FTP、SFTP和SCP
  11. android 下拉刷新监听,说说在 Android 的 RecyclerView 中如何实现下拉刷新
  12. ubuntu16.04环境下使用ros运行ORB-SLAM3
  13. 微软和Google的盈利模式对比分析
  14. BUAA 1489
  15. 【优化算法】改进的灰狼优化算法(IGWO)【含Matlab源码 1349期】
  16. 微信小程序实训day03
  17. 【cocos2d-x入门实战】微信飞机大战之八:自定义敌机精灵
  18. Flink Joining
  19. 汇编语言mov al,0c5h,汇编语言读书笔记 Day 04
  20. 项目经验之:针对昨日FDO连接SDF文件报错,国个GIS论坛给出了一个思路.帮助我过关.

热门文章

  1. 入门力扣自学笔记96 C++ (题目编号749)
  2. python选择时间窗口_对pandas中时间窗函数rolling的使用详解
  3. 拓扑排序算法原理及Java代码实现
  4. ssm项目_什么是SSM,以及javaweb项目包的含义(三层架构)
  5. 用AVX2指令集优化浮点数组求和
  6. 暑期训练第四次团队赛
  7. 智慧校园物联网管理平台建设方案2.0
  8. esp8266WIFI模块教程:正点原子ATK-ESP8266进行网络通信,单片机与电脑,单片机与手机发送数据
  9. 计算二叉树叶子结点数
  10. python支持复数类型以下说法错误的是_关于Python的数字类型,以下选项中描述错误的是...