当前位置: 首页 > news >正文

springboot logback 日志注入安全问题 统一处理

背景

日志注入一般指的是恶意用户输出换行等内容,混淆正常的日志,导致排查问题是无法正确定位问题,因此,我们需要对要打印的日志内容进行过滤。
但是,如果是每个接口单独处理的话,成本较高,因此,我们需要一个统一处理的机制。

当然,统一处理可能会误伤正常的日志,这个需要自己进行斟酌了。我们在绝大情况下不会在打印日志的内容中使用换行等特殊字符,所以这样处理我认为是比较稳妥的。

这个处理仅会对用户输入的参数进行处理,不会对堆栈的正常的内容处理,所以大部分的日志是可以正常打印出来的。

方案

springboot集成的logback,其配置文件是 org/springframework/boot/logging/logback/base.xml,其默认参数配置都在org/springframework/boot/logging/logback/defaults.xml。我们不打算修改这些配置,而是沿用。

我们对logback进行定制,spring集成的默认log_pattern为:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(%applicationName[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}},中间可以全部不管,输出的重点就是靠后部分的%m,这个是一个Converter,对消息进行处理,默认是不进行任何处理,直接输出原消息,我们对他进行定制。

我们自定义自己的Converter:


import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import org.slf4j.helpers.MessageFormatter;/*** @author */
public class LineSeparatorConverter extends ClassicConverter {@Overridepublic String convert(ILoggingEvent event) {Object[] argumentArray = event.getArgumentArray();// 没有用户传入的参数,直接返回if (argumentArray == null || argumentArray.length == 0) {return event.getFormattedMessage();}Object[] argumentArrayProcessed = new Object[argumentArray.length];for (int i = 0; i < argumentArray.length; i++) {Object o = argumentArray[i];if (o == null || o instanceof Throwable) {argumentArrayProcessed[i] = o;} else {String oString = o.toString();argumentArrayProcessed[i] = cleanLineSeparator(oString);}}return getFormattedMessage(event.getMessage(), argumentArrayProcessed);}public String getFormattedMessage(String message, Object[] argumentArray) {String formattedMessage;if (argumentArray != null) {formattedMessage = MessageFormatter.arrayFormat(message, argumentArray).getMessage();} else {formattedMessage = message;}return formattedMessage;}private String cleanLineSeparator(String line) {if (line == null || line.isEmpty()) {return line;}return line.replace("\n", "\\n").replace("\r", "\\r");}}

然后,声明logback-spring.xml,使用spring的默认配置,并且覆盖%m的默认Converter,改成我们自己的

<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="false"><include resource="org/springframework/boot/logging/logback/base.xml"/><!-- 将默认的输出器改为自定义输出器,会替换掉换行符,防止日志注入 --><conversionRule conversionWord="m"converterClass="xxx.LineSeparatorConverter"/></configuration>

如果放到了resources目录下,该文件应该可以正常识别到,不需要额外配置。
如果日志处理是一个maven的子模块,那就手动声明一下文件位置
logging.config=classpath:logback-spring.xml
如果放到其他目录,写成:logging.config=file:/xxx/xxx/logback-spring.xml

相关文章:

springboot logback 日志注入安全问题 统一处理

背景 日志注入一般指的是恶意用户输出换行等内容&#xff0c;混淆正常的日志&#xff0c;导致排查问题是无法正确定位问题&#xff0c;因此&#xff0c;我们需要对要打印的日志内容进行过滤。 但是&#xff0c;如果是每个接口单独处理的话&#xff0c;成本较高&#xff0c;因此…...

linux进阶高级配置,你需要知道的有哪些(13)-Squid代理服务器

1、squid代理的作用&#xff1a;缓存网页对象&#xff0c;减少重复请求 2、代理的基本类型 传统代理&#xff1a;适用于Internet互联网&#xff0c;需明确指定服务端&#xff08;浏览器需要配置&#xff09; 透明代理&#xff1a;适用于共享上网网关&#xff0c;不需要指定服务…...

SpringBoot自动装配(二)

近日&#xff0c;余溺于先贤古哲之文无法自拔。虽未明其中真意&#xff0c;但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰&#xff1a;“臣闻之&#xff1a;‘疑行无名&#xff0c;疑事无功。’君亟定变法之虑&#xff0c;殆无顾天下之议之也。且夫有高人之行者&#xff0c;…...

数据结构 顺序表1

1. 何为顺序表&#xff1a; 顺序表是一种线性数据结构&#xff0c;是由一组地址连续的存储单元依次存储数据元素的结构&#xff0c;通常采用数组来实现。顺序表的特点是可以随机存取其中的任何一个元素&#xff0c;并且支持在任意位置上进行插入和删除操作。在顺序表中&#xf…...

C++基础-编程练习题1

文章目录 一、哥德巴赫猜想二、哥德巴赫猜想2三、打印成绩单四、成绩输入输出五、数组输出奇数位偶数位 一、哥德巴赫猜想 【试题描述】 哥德巴赫提出了以下的猜想&#xff1a;任何一个大于 2 的偶数都可以表示成 2 个质数之和。 质数是指除了 1 和本身之外没有其他约数的数&a…...

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店&#xff0c;只靠49个男人用一套方法卖白酒…...

如何将公众号添加到CSDN个人主页

1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下&#xff1a; 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 &#xff0c;例如我的个人公众号 htt…...

64K方法数限制原理及解决方案

64K限制的原因 Android APK文件本质上是一个压缩文件&#xff0c;它包含的classes.dex文件是可执行的Dalvik字节码文件&#xff0c;这个.dex文件中存放的就是编译后的Java代码。Dalvik可执行文件规范限制了单个.dex文件最多引用的方法数是65536个。其中包含联网Android Framew…...

产品品牌CRUD

文章目录 1.renren-generator生成CRUD1.数据库表设计1.数据表设计2.分析 2.代码生成器生成crud1.查看generator.properties&#xff08;不需要修改&#xff09;2.修改application.yml 连接的数据库修改为云数据库3.启动renren-generator模块4.浏览器访问 http://localhost:81/5…...

惠普发布全新AI战略,重塑办公空间 引领企业智能化新浪潮

近日、全球知名科技公司惠普在北京隆重举办了以“用智能&#xff0c;开启无限可能”为主题的2024惠普商用AI战略暨AI PC新品发布会&#xff0c;此次盛会标志着惠普在人工智能领域迈出了重要一步&#xff0c;惠普紧跟时代步伐&#xff0c;推出了更高效、更安全、更灵活的AI PC产…...

python中的数据可视化:极坐标散点图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python中的数据可视化&#xff1a; 极坐标散点图 [太阳]选择题 关于以下代码输出结果的说法中正确的是? import matplotlib.pyplot as plt import numpy as np n 150 r 2 * np.r…...

5.12.1 Detecting and classifying lesions in mammograms with Deep Learning

计算机辅助检测 (CAD) 系统的开发是为了帮助放射科医生分析筛查性乳房 X 光检查&#xff0c;深度 CNN 有可能彻底改变医学图像分析。我们提出了一种基于最成功的对象检测框架之一 Faster R-CNN 的 CAD 系统。该系统无需任何人为干预即可检测乳房 X 光照片上的恶性或良性病变并对…...

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求&#xff1f; urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…...

OceanBase v4.3特性解析:新功能“租户克隆”的场景与应用指南

熟悉或曾用过OceanBase的朋友&#xff0c;对于“多租户”这一理念定不陌生。OceanBase的租户概念&#xff0c;与我们熟知的传统数据库实例颇为相似。举例来说&#xff0c;OceanBase的租户支持MySQL兼容模式&#xff0c;对于用户而言&#xff0c;选用一个MySQL兼容模式的租户&am…...

RS3236-3.3YUTDN4功能和参数介绍及PDF资料

RS3236-3.3YUTDN4功能和参数介绍及PDF资料-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 品牌: RUNIC(润石) 封装: XDFN-4-EP(1x1) 描述: 带过温保护 输出类型: 固定 最大输入电压: 7.5V 输出电压: 3.3V 最大输出电流: 500mA RS3236-3.3YUTDN4 是一款低压差线性稳压器&#x…...

Vue如何引入公用方法

文章目录 1. 在全局范围内引入2. 在单文件组件中引入3. 使用Vuex或Vue Composition API4. 使用mixins5. 使用插件 1. 在全局范围内引入 在你的main.js或main.ts文件中引入并注册你的公用方法&#xff0c;使得它们可以在整个Vue应用中使用。 // 引入你的公用方法文件 import {…...

Java面试题:ConcurrentHashMap

ConcurrentHashMap 一种线程安全的高效Map集合 jdk1.7之前 底层采用分段的数组链表实现 一个不可扩容的数组:segment[] 数组中的每个元素都对应一个HashEntry数组用以存放数据 当放入数据时,根据key的哈希值找到对应的segment数组下标 找到下标后就会添加一个reentrantlo…...

现在闪侠惠递寄快递有福利了,千万不要因没把握住而后悔呀!

闪侠惠递平台寄快递现在真的是太便宜了&#xff0c;优惠价格把握不住&#xff0c;后悔都来不及&#xff01;大家可以在闪侠惠递上面寄快递&#xff0c;价格真的非常优惠呢&#xff0c;比咱们平常寄快递的价格都优惠呢&#xff0c;真的&#xff0c;小编都亲自替大家尝试过了呢。…...

vue+ant-design+formBuiler表单构建器——技能提升——form design——亲测有效

最近看到后端同事在弄一个后台管理系统&#xff0c;额&#xff0c;前端真的是夹缝中生存啊&#xff0c;AI抢饭碗&#xff0c;后端也想干前端的活儿。。。 他用到了表单构建器&#xff0c;具体效果如下: 网上有很多适用于ElementUi和ant-design的form design插件&#xff0c;下…...

Git 如何管理标签命令(tag)

1.查看本地仓库tag --1.查看本地仓库tag UserDESKTOP-2NRT2ST MINGW64 /e/GITROOT/STARiBOSS/STARiBOSS-5GCA (gw_frontend_master) $ git tag 1stBossUpgrade V10.0.1_20220224_test V10.0.1_20220301_test tag-gwfrontend-V1.0.12-230625 tag-gw_frontend-23.08.29 tag-gw_f…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...