《白帽子讲 Web 安全:点击劫持》
目录
摘要:
一、点击劫持概述
二、点击劫持的实现示例:诱导用户收藏指定淘宝商品
案例
构建恶意页面:
设置绝对定位和z - index:
控制透明度:
三、其他相关攻击技术
3.1图片覆盖攻击与 XSIO
3.2拖拽劫持与数据窃取
3.3Flash 劫持技术
3.4Filejacking 劫持攻击
四、浏览器的防御机制
4.1.原生防御策略
4.2.多维度防御体系
4.2.1.客户端防御 Frame Busting
Frame Busting 原理和绕过
绕过方式:
4.2.2.服务端头信息防御
(1)X - Frame - Options
(2)CSP:frame - ancestors 指令
(3)Cookie 的 samesite 属性
4.3.3. 复合防御策略
总结
摘要:
在 Web 安全的领域中,点击劫持(Clickjacking)是一种通过视觉欺骗诱导用户点击隐藏元素的攻击方式,是一种常见且具有潜在危害的攻击手段。吴翰清和叶敏所著的《白帽子讲 Web 安全》一书中对点击劫持进行了全面而深入的讲解,下面就来详细总结这部分内容。
一、点击劫持概述
点击劫持,英文名为 Clickjacking,也被称为 UI - 覆盖攻击。
它首次出现在 2008 年,由互联网安全专家罗伯特・汉森和耶利米・格劳斯曼首创。点击劫持(Clickjacking)是一种视觉上的欺骗手段,攻击者通过透明的 iframe 或其他隐藏元素通过覆盖不可见的框架来诱使用户在不知情的情况下执行某些操作。表面上受害者点击的是他们所看到的网页,但实际上点击的是被黑客精心构建的另一个置于原网页上面的透明页面。
例如:用户可能在浏览一个看似正常的网页并点击某个按钮时,却在不知情的情况下触发了另一个页面上的恶意操作,如转账、下载恶意软件等。
二、点击劫持的实现示例:诱导用户收藏指定淘宝商品
书中以诱导用户收藏指定淘宝商品为例,详细讲解了点击劫持的实现过程。攻击者创建一个页面,在其中使用 iframe 嵌入目标淘宝商品页面。为了实现劫持效果,需要注意以下几点:
- 绝对定位:使用绝对定位来控制 iframe 的位置,确保其能够精确覆盖在用户正常浏览的页面之上。
- z - index 属性:将 z - index 设置得足够大,使劫持页面的 iframe 处于所有页面的最上层,这样用户的点击操作会首先作用在 iframe 上。
- 透明度控制:通过 opacity 属性控制页面的透明度,使 iframe 变得透明或半透明,让用户无法察觉其存在,从而在不知不觉中执行收藏商品等操作。
案例
假设攻击者想要诱导用户收藏指定的淘宝商品,他们可以通过以下步骤来实现点击劫持:
构建恶意页面:
攻击者创建一个网页,在这个网页中使用<iframe>标签将淘宝商品页面嵌入其中。例如:
<iframe src="https://detail.tmall.com/item.htm?id=123456"></iframe>
这里的src属性指向要劫持的淘宝商品页面链接。
设置绝对定位和z - index:
为了使嵌入的<iframe>能够覆盖在当前页面的上方,需要对其进行绝对定位,并设置足够大的z - index值。例如:
iframe {position: absolute;top: 0;left: 0;width: 100%;height: 100%;z - index: 9999;}
- 通过position: absolute将<iframe>脱离文档流,使其可以自由定位在页面的任何位置;
- top: 0和left: 0
- 将其定位在页面的左上角;width: 100%和height: 100%使其覆盖整个页面;
- z - index: 9999确保它位于所有页面元素的最上层。
控制透明度:
为了让用户难以察觉<iframe>的存在,需要将其透明度设置为合适的值。
例如:
iframe {opacity: 0.5;}
这里将透明度设置为 0.5,使<iframe>呈现半透明状态,既不会完全看不见,又不会过于明显,从而增加用户误点击的可能性。用户在浏览恶意页面时,以为点击的是当前页面的内容,实际上点击的是被<iframe>覆盖的淘宝商品页面上的收藏按钮,进而在不知情的情况下完成了商品收藏操作。
三、其他相关攻击技术
3.1图片覆盖攻击与 XSIO
攻击者利用图片的style属性或者 CSS 控制,将恶意链接或按钮等元素通过图片覆盖在正常页面之上,诱使用户点击图片时执行恶意操作。当用户点击图片时,实际上触发的是被覆盖的恶意元素的操作。XSIO(Cross - Site Iframe Observing)则是通过观察 iframe 中的内容变化来获取敏感信息,攻击者可以利用这些技术进一步实施攻击。
例如:攻击者可以将一张看似普通的图片放置在网页上,通过 CSS 将其定位在某个重要按钮的位置,并且设置图片的pointer - events属性为none(使图片不响应鼠标事件,从而让用户的点击能够穿透图片到达下方的恶意元素),这样用户点击图片区域时,就会触发下方隐藏的恶意操作。
3.2拖拽劫持与数据窃取
浏览器中的拖拽对象可以是链接、文字等,并且拖拽不受同源策略限制。攻击者利用这一特性,诱使用户从隐藏不可见的<iframe>中拖拽出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面,从而窃取数据。在 JavaScript 的支持下,这个攻击过程会变得非常隐蔽。
例如,攻击者可以在一个看似正常的网页中隐藏一个<iframe>,在<iframe>中放置一些敏感数据的链接或元素,然后通过一些诱导信息,让用户误以为是在进行正常的网页操作,将这些数据从<iframe>中拖拽到攻击者指定的区域,从而实现数据窃取。
攻击者可以通过监听用户的拖拽事件,劫持用户的拖拽操作,将用户的敏感数据(如文本、文件等)拖到指定的区域,从而实现数据窃取。这种攻击方式利用了用户在网页上的正常操作行为,具有较高的隐蔽性。
3.3Flash 劫持技术
曾经兴起过利用 Adobe Flash 程序漏洞的点击劫持攻击,通过嵌入恶意的 Flash 文件来实现点击劫持等攻击。
例如:制作一个 Flash 游戏,诱导用户点击 “CLICK” 按钮,每次点击后按钮位置发生变化,通过一步步操作,最终控制用户的摄像头等设备。但随着技术的发展和安全意识的提高,以及浏览器对 Flash 的支持逐渐减少,这种攻击方式已逐渐被淘汰。
3.4Filejacking 劫持攻击
Filejacking 是一种通过劫持用户的文件选择操作来窃取本机文件的攻击方式。攻击者利用 HTML5 的文件 API 和表单元素,诱使用户点击看似普通的按钮或链接选择本地文件,然后将文件内容发送到攻击者的服务器,从而窃取用户本机文件。
实现原理:通过巧妙地利用 HTML 的<input type="file">元素,结合 JavaScript 的事件处理,在用户不知情的情况下,让用户选择并上传本地文件,通过隐藏的表单元素和 JavaScript 代码来获取文件信息。
例如,攻击者可以将<input type="file">元素设置为透明且覆盖在一个正常按钮的位置,当用户点击正常按钮时,实际上触发了文件上传操作,攻击者就可以获取用户选择的文件内容。
四、浏览器的防御机制
4.1.原生防御策略
-
跨域限制:同源策略限制跨域iframe操作
-
拖拽安全:现代浏览器禁止跨域获取拖拽数据
-
文件访问限制:禁止通过JS读取完整文件路径
4.2.多维度防御体系
4.2.1.客户端防御 Frame Busting
javascriptif (top != self) {top.location = self.location; // 强制跳出iframe
}
Frame Busting 原理和绕过
Frame Busting 是一种常见的防御点击劫持的技术,其原理是在页面中添加 JavaScript 代码,检测页面是否被嵌套在 iframe 中,如果是则采取相应的措施,如跳出 iframe 或阻止页面加载。然而,攻击者可以通过一些技术手段绕过 Frame Busting,如利用浏览器的漏洞或采用新的攻击方式。
绕过方式:
-
使用XSS Filter绕过(IE)
-
通过
security=restricted
属性禁用JS -
使用多层iframe嵌套
4.2.2.服务端头信息防御
防御方式 | 实现代码 | 特点 |
---|---|---|
X-Frame-Options | X-Frame-Options: DENY | 兼容性最佳(IE8+) |
CSP frame-ancestors | Content-Security-Policy: frame-ancestors 'none' | 更细粒度的域名控制(现代浏览器) |
SameSite Cookie | Set-Cookie: key=val; SameSite=Lax | 阻止跨域携带认证信息 |
(1)X - Frame - Options
作用:这是微软提出的一个 HTTP 头,专门用来防御利用<iframe>嵌套的点击劫持攻击,并且在 IE8、Firefox3.6、Chrome4 以上的版本均能很好地支持。
属性值:
DENY:拒绝任何域加载当前页面的<iframe>。
例如,如果一个网站的服务器配置中设置了X - Frame - Options: DENY,那么无论在任何其他网站中尝试使用<iframe>嵌入该网站页面,浏览器都会拒绝加载,从而有效防止点击劫持攻击。
SAMEORIGIN:允许同源域下加载当前页面的<iframe>。即只有当<iframe>的src属性指向与当前页面同源(协议、域名、端口都相同)的页面时,浏览器才会允许加载。这样可以防止其他恶意网站通过<iframe>嵌入本网站页面进行点击劫持,但本网站内的合法页面之间可以通过<iframe>正常嵌套。
ALLOW - FROM uri:可以定义允许<iframe>加载的页面地址。
例如X - Frame - Options: ALLOW - FROM https://trusted - site.com,表示只允许https://trusted - site.com这个特定的网站通过<iframe>嵌入当前页面,其他网站的嵌入请求将被拒绝。
(2)CSP:frame - ancestors 指令
作用:Content - Security - Policy(CSP)中的frame - ancestors指令用于指定哪些页面可以作为当前页面的<iframe>祖先页面,即哪些页面可以通过<iframe>嵌入当前页面。
设置方式:例如,设置Content - Security - Policy: frame - ancestors'self',表示只允许同源的页面(即当前页面自身所在的源)通过<iframe>嵌入当前页面。如果设置为Content - Security - Policy: frame - ancestors'self' https://trusted - site.com,则表示允许同源页面以及https://trusted - site.com这个特定的可信网站通过<iframe>嵌入当前页面,其他网站的嵌入将被阻止。通过这种方式,可以精确控制页面的嵌入来源,有效防范点击劫持攻击。
Content Security Policy(CSP)是一种用于增强网页安全性的机制,CSP:frame - ancestors 指令可以指定允许嵌套当前页面的父页面的源。通过设置该指令,可以有效防止点击劫持攻击。
(3)Cookie 的 samesite 属性
作用:samesite属性用于控制 Cookie 在跨站请求时的发送行为,从而防范 CSRF(跨站请求伪造)攻击,同时对点击劫持也有一定的防御作用。
属性值:
Strict:严格模式,表明这个 Cookie 在任何情况下都不可能作为第三方的 Cookie,有能力阻止所有 CSRF 攻击。此时,在 B 站点下发起对 A 站点的任何请求,A 站点的 Cookie 都不会包含在 Cookie 请求头中。这就意味着,攻击者通过点击劫持诱导用户在第三方页面上发起对目标网站的请求时,由于目标网站的 Cookie 不会被发送,攻击者无法利用用户已登录的身份进行恶意操作。
Lax:宽松模式,与 Strict 相比,放宽了限制,允许发送安全 HTTP 方法(如Get、OPTIONS、HEAD请求)带上 Cookie,但是不安全 HTTP 方法(如POST、PUT、DELETE请求)时,不能作为第三方链接的 Cookie。这种模式在一定程度上平衡了安全性和可用性,既可以防范大部分危险的跨站请求,又不会对一些正常的跨站链接访问造成太大影响。
Cookie 的 samesite 属性可以控制 Cookie 在跨站请求中的发送行为。通过设置 samesite 属性为“Strict”或“Lax”,可以限制 Cookie 在跨站请求中的使用,从而减少点击劫持等跨站攻击的风险。
4.3.3. 复合防御策略
推荐组合使用:
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self';
Set-Cookie: SESSIONID=xxx; SameSite=Lax; Secure
总结
点击劫持是一种具有较高风险的 Web 安全威胁,了解其实现原理和防御方法对于保障 Web 应用的安全至关重要。《白帽子讲 Web 安全》一书为我们提供了全面而深入的知识,帮助我们更好地应对这些安全挑战。点击劫持作为一种隐蔽且危险的 Web 安全威胁,需要我们在开发和使用 Web 应用时保持高度警惕。通过了解其原理、实现方式和防御方法,我们可以采取有效的措施来保护用户的安全和隐私,确保 Web 应用的安全性和可靠性。
喜欢的点点赞和关注,持续分享
相关文章:
《白帽子讲 Web 安全:点击劫持》
目录 摘要: 一、点击劫持概述 二、点击劫持的实现示例:诱导用户收藏指定淘宝商品 案例 构建恶意页面: 设置绝对定位和z - index: 控制透明度: 三、其他相关攻击技术 3.1图片覆盖攻击与 XSIO 3.2拖拽劫持与数据…...
PostgreSQL10 逻辑复制实战:构建高可用数据同步架构!
PostgreSQL10 逻辑复制实战:打造高可用数据同步架构! 概述 PostgreSQL 10 引入了逻辑复制(Logical Replication),为数据库高可用和数据同步提供了更灵活的选择。PostgreSQL 复制机制主要分为物理复制和逻辑复制两种&…...
Spring Boot 异步编程深入剖析
Spring Boot 异步编程深入剖析 1. 异步方法的使用 原理深度解析 Spring Boot 的异步方法基于 Spring 的 AOP(面向切面编程)实现。当在方法上添加 Async 注解时,Spring 会为该方法所在的类创建一个代理对象。当调用该异步方法时,…...
《动手学习深度学习》的笔记,将会持续更新。
1.什么是机器学习? 机器学习是:换句话说,我们用数据训练(train)模型。 数据不断的训练出比较好的模型。 1.2 机器学习的关键零件 1.学习的数据。 2. 如何转换数据的模型。 3.一个目标函数。 4.调整模型参数以优化目标函数的算法。 1,数据有什么组成? 数据=样本+…...
[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解
一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…...
VUE3+Vite使用TailwindCSS【若依前后端分离框架】
参考:https://tailwind.nodejs.cn/docs/guides/vite#vue 和 https://blog.csdn.net/hjl_and_djj/article/details/144694485依次运行命令: cnpm install -D tailwindcss3.4.17 postcss autoprefixernpx tailwindcss init -p修改配置文件tailwind.config.…...
【Linux文件IO】系统IO详情
目录 一、前言 二、相关API介绍 2.1 open 2.2 read 2.3 write 2.4 lseek 2.5 close 三、简单示例 3.1 示例1 3.2 示例2 一、前言 在 Linux 系统编程中,系统 I/O(又称低级 I/O)是直接通过操作系统提供的系统调用实现的文件操作接口…...
【弹性计算】弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术
弹性裸金属服务器和神龙虚拟化(三):弹性裸金属技术 1.弹性裸金属技术背景1.1 传统 KVM 虚拟化系统导致 CPU 计算特性损失1.2 传统 KVM 虚拟化系统导致资源争抢不可避免1.3 传统 KVM 虚拟化系统导致 I/O 性能瓶颈 2.弹性裸金属技术实现2.1 VPC…...
(贪心 合并区间)leetcode 56
思路来源:代码随想录--代码随想录_合并区间题解 首先用lambda 按照左界值升序排序 建立答案的二维数组,将第一个行区间放入,判断从第二行开始 第i行的左区间一定大于第i-1行的左区间(排序过了),所以只判断…...
如何理解语言模型
统计语言模型 先看语言模型,语言即自然语言,模型及我们要解决的某个任务。 任务一:判断哪句话出现的概率大 任务二:预判空缺的位置最有可能是哪个词 再看统计,统计即解决上述两个任务的解决方法。先对语句进行分词…...
动态规划/贪心算法
一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术,尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题,并保存这些子问题的解以避免重复计算,从而提高效率。 动态规划的核心思想 最优子结…...
Hadoop简介
1. Hadoop简介 官网:http://hadoop.apache.org 1.1 Hadoop架构 Hadoop由三个模块组成:分布式存储HDFS、分布式计算MapReduce、资源调度引擎YARN 1.2 Hadoop历史 Hadoop作者Doug Cutting Apache Lucene是一个文本搜索系统库 Apache Nutch作为前者的一部…...
Vscode 便用快捷键设置教程
文章目录 简介:1. go to define (跳转到函数定义的位置)2. go to declaration (跳转到函数声明的位置)3. move line (上下移动本行代码)3.1上下复制本行代码 4. 前进和后退(就是前进到光标上一次停留的位置,和后退到那…...
数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表
一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 :“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令 命令解释 SHOW DATABASES; 展示所有的数据库 CREATE DATABASE 数据…...
水滴tabbar canvas实现思路
废话不多说之间看效果图,只要解决了这个效果水滴tabbar就能做出来了 源码地址 一、核心实现步骤分解 布局结构搭建 使用 作为绘制容器 设置 width=600, height=200 基础尺寸 通过 JS 动态计算实际尺寸(适配高清屏) function initCanvas() {// 获取设备像素比(解决 Re…...
windows安装vue
1、下载nodejs安装包 https://nodejs.cn/download/ 2、安装node 中途记得可以自己改安装路径,其他都是下一步 3、安装完成后检查 node -v :查看nodejs的版本 npm -v :查看npm的版本 4、修改npm默认安装目录与缓存日志目录的位置 在nodejs目…...
使用3090显卡部署Wan2.1生成视频
layout: post title: 使用3090显卡部署Wan2.1生成视频 catalog: true tag: [Kubernetes, GPU, AI] 使用3090显卡部署Wan2.1生成视频 1. 环境说明2. 模型下载3. 克隆仓库4. 安装依赖5. 生成视频 5.1. 使用generate脚本生成5.2. 使用gradio启动UI界面生成 5.2.1. 启动gradio服务5…...
DCN讲解
DCN是DeepFM的升级版,后者是只能做二阶交叉特征,随着阶数上升,模型复杂度大幅提高,且FM网络层较浅,表达能力有限。google团队通过构建深度交叉网络来自动进行特征的高阶交叉,且时空复杂度均为线性增长&…...
ARM 架构下 cache 一致性问题整理
本篇文章主要整理 ARM 架构下,和 Cache 一致性相关的一些知识。 本文假设读者具备一定的计算机体系结构和 Cache 相关基础知识,适合有相关背景的读者阅读 1、引言 简单介绍一下 Cache 和内存之间的关系 在使能 Cache 的情况下,CPU 每次获取数…...
算法-二分查找
二分查找 其实二分查找是一个很简单理解的东西,从他的名字就可以看出,就是要分为两段去查找一个元素 我们确定一个中间元素,然后将这一个元素和左边的部分和右边的部分做对比 然后根据实际情况来选择一个部分来继续做这么一个步骤 直到找…...
Python Cookbook-2.24 在 Mac OSX平台上统计PDF文档的页数
任务 你的计算机运行着比较新的MacOSX系统(10.3的“Panther”或更新的版本),现在需要知道一个 PDF 文档的页数。 解决方案 PDF格式和 Python都已经集成到了Mac OsX系统中(10.3或更高版本),因而这个问题解决起来也相对比较容易: #!/usr/bin python im…...
【MySQL】索引(页目录、B+树)
文章目录 1. 引入索引2. MySQL与磁盘交互的基本单位3. 索引的理解3.1 页目录3.2 B树 4. 聚簇索引、非聚簇索引5. 索引的操作5.1 索引的创建5.1.1 创建主键索引5.1.2 创建唯一索引5.1.3 普通索引的创建5.1.4 全文索引的创建 5.2 索引的查询5.3 删除索引 1. 引入索引 索引&#…...
工业AR眼镜的‘芯’动力:FPC让制造更智能【新立电子】
随着增强现实(AR)技术的快速发展,工业AR智能眼镜也正逐步成为制造业领域的重要工具。它不仅为现场工作人员提供了视觉辅助,还极大地提升了远程协助的效率、优化了仓储管理。FPC在AI眼镜中的应用,为工业AR智能眼镜提供了…...
开启mysql的binlog日志
mysql版本5.7 1.查看是否开启bin_log show global variables like’log_bin’; off的话需要先开启 在mysql的文件夹目录中找到my.ini 加一行log-bin“C:/ProgramData/MySQL/MySQL Server 5.7/logs/log-bin” 并提前创建好目录 2.数据库会把日志放进logs目录中 3.查看log日…...
SpringSecurity基于JWT实现Token的处理
前面介绍了手写单点登录和JWT的应用,本文结合SpringSecurity来介绍下在SpringBoot项目中基于SpringSecurity作为认证授权框架的情况下如何整合JWT来实现Token的处理。 一、认证思路分析 SpringSecurity主要是通过过滤器来实现功能的!我们要找到SpringSecurity实现认证和校验…...
数据结构与算法-图论-最短路-floyd扩展
floyd和它的拓展: 在计算机科学领域,Floyd通常指Floyd Warshall算法,由罗伯特弗洛伊德(Robert W. Floyd)提出,这是一种用于在加权有向图中查找所有顶点对之间最短路径的算法。 算法原理 Floyd Warsha…...
c++中所有构造函数的介绍与使用
C 中,构造函数是一种特殊的成员函数,用于在创建对象时对对象进行初始化。C 中有多种类型的构造函数,下面详细介绍这些构造函数及其特点和使用场景。 1. 默认构造函数 定义:默认构造函数是指在没有提供任何参数的情况下可以被调用…...
力扣1584. 连接所有点的最小费用
力扣1584. 连接所有点的最小费用 题目 题目解析及思路 题目要求返回最小生成树 最小生成树模版题 法一:prim 主要思想是每次找离树最近的顶点,将其加入树种,并更新其他所有点到该点的距离 代码 class Solution { public:int minCostCo…...
FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
处理大数据的架构模式:Lambda 架构 和 Kappa 架构
Lambda 架构 和 Kappa 架构 是两种用于处理大数据的架构模式,尤其在实时数据处理场景中广泛应用。 1. Lambda 架构 核心思想 Lambda 架构将数据处理分为两条独立的流水线: 批处理层(Batch Layer): 处理全量数据&…...
Docker网络模式实战
docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分 docker安装后会自动创建3种网络:bridge、host、none docker原生bridge网路 docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口 docker安装时…...
Linux网络基础(协议 TCP/IP 网络传输基本流程 IP VS Mac Socket编程UDP)
文章目录 一.前言二.协议协议分层分层的好处 OSI七层模型TCP/IP五层(或四层)模型为什么要有TCP/IP协议TCP/IP协议与操作系统的关系(宏观上是如何实现的)什么是协议 三.网络传输基本流程局域网(以太网为例)通信原理MAC地址令牌环网 封装与解包分用 四.IP地址IP VS Mac地址 五.So…...
MFC: 控件根据文本内容大小自动调整
背景: 针对不同语言下,控件显示不全的现象; 例如: 现象1:中文下显示全部信息,英语下只能显示部分文字 现象2:中文下显示不全## 实现思路: 控件绑定按钮计算控件文本长度根据文本长…...
记一次线上Tomcat服务内存溢出的问题处理
背景:JavaWeb项目部署在Tomcat服务器上,服务器用的Windows。 问题表现:系统出现偶发性无法访问(隔几天就会在早上无法访问) Tomcat的日志catalina中,有如下报错信息。 java.lang.OutOfMemoryError: GC ov…...
go设计模式
刘:https://www.bilibili.com/video/BV1kG411g7h4 https://www.bilibili.com/video/BV1jyreYKE8z 1. 单例模式 2. 简单工厂模式 代码逻辑: 原始:业务逻辑层 —> 基础类模块工厂:业务逻辑层 —> 工厂模块 —> 基础类模块…...
通往 AI 之路:Python 机器学习入门-语法基础
第一章 Python 语法基础 Python 是一种简单易学的编程语言,广泛用于数据分析、机器学习和人工智能领域。在学习机器学习之前,我们需要先掌握 Python 的基本语法。本章将介绍 Python 的变量与数据类型、条件语句、循环、函数以及文件操作,帮助…...
【再谈设计模式】备忘录模式~对象状态的守护者
一、引言 在软件开发过程中,我们常常会遇到需要保存对象状态以便在之后恢复的情况。例如,在文本编辑器中,我们可能想要撤销之前的操作;在游戏中,玩家可能希望恢复到之前的某个游戏状态。备忘录模式(Memento…...
算法:判断链表是否有环
/*** brief 判断链表是否有环* * 该函数使用快慢指针法来判断链表中是否存在环。* 快指针每次移动两步,慢指针每次移动一步。* 如果链表中存在环,那么快指针最终会追上慢指针;* 如果链表中不存在环,快指针会先到达链表末尾。* * p…...
Android Logcat 高效调试指南
工具概览 Logcat 是 Android SDK 提供的命令行日志工具,支持灵活过滤、格式定制和实时监控,官方文档详见 Android Developer。 基础用法 命令格式 [adb] logcat [<option>] ... [<filter-spec>] ... 执行方式 直接调用(通过ADB守…...
【数据结构与算法】Java描述:第一节:ArrayList顺序表
这篇文章我们自己实现一个顺序表, 从而更好的认识它。 一、顺序表的本质 顺序表的本质其实就是一个数组,但是在插入,查找与删除上,有些复杂,顺序表通过对方法进行封装,方便了使用。 二、自己的顺序表 2.…...
报错The default superclass, “jakarta.servlet.http.HttpServlet“(已经配置好tomcat)
报错报错DescriptionResourcePathLocationType The default superclass,“jakarta.servlet.http.HttpServlet”, according to the project’s Dynamic Web Module facet version (5.0), was not found on the Java Build Path. 解决办法: 根据错误信息࿰…...
在笔记本电脑上用DeepSeek搭建个人知识库
最近DeepSeek爆火,试用DeepSeek的企业和个人越来越多。最常见的应用场景就是知识库和知识问答。所以本人也试用了一下,在笔记本电脑上部署DeepSeek并使用开源工具搭建一套知识库,实现完全在本地环境下使用本地文档搭建个人知识库。操作过程共…...
数学建模:MATLAB极限学习机解决回归问题
一、简述 极限学习机是一种用于训练单隐层前馈神经网络的算法,由输入层、隐藏层、输出层组成。 基本原理: 输入层接受传入的样本数据。 在训练过程中随机生成从输入层到隐藏层的所有连接权重以及每个隐藏层神经元的偏置值,这些参数在整个…...
Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据
文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们,你们好呀!今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册,并…...
Python标准库【os】5 文件和目录操作2
文章目录 8 文件和目录操作8.7 浏览目录下的内容8.8 查看文件或目录的信息8.9 文件状态修改文件标志位文件权限文件所属用户和组其它 8.10 浏览Windows的驱动器、卷、挂载点8.11 系统配置信息 os模块提供了各种操作系统接口。包括环境变量、进程管理、进程调度、文件操作等方面…...
相控阵雷达
相控阵雷达 **1. 基本概念与数学模型**(1) **阵列信号模型**(2) **波束形成原理** **2. 经典波束形成算法****(1) 常规波束形成(Conventional Beamforming, CBF)****(2) 自适应波束形成(Adaptive Beamforming)****2.1 最小方差无失…...
Java 大视界 -- 基于 Java 的大数据分布式缓存一致性维护策略解析(109)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
AI: Cursor是否已奠定AI开发环境的龙头地位?
近年来,人工智能(AI)在软件开发领域的应用迅速升温,而Cursor作为一款AI驱动的代码编辑器,凭借其创新功能和市场表现,引发了广泛讨论。许多人认为,Cursor已经奠定了AI开发环境的龙头地位。然而&a…...
PHP:IDEA开发工具配置XDebug,断点调试
文章目录 一、php.ini配置二、IDEA配置 一、php.ini配置 [xdebug] zend_extension"F:\wamp64\bin\php\php7.4.0\ext\php_xdebug-2.8.0-7.4-vc15-x86_64.dll" xdebug.remote_enable on xdebug.remote_host 127.0.0.1 xdebug.remote_port 9001 xdebug.idekey"…...
回忆Redis的持久化机制
Redis的持久化机制 前言RDB触发方式配置方式手动触发bgsave的执行流程 缺点 AOF重写机制触发方式手动触发自动触发 MP-AOF RDB和AOF混合模式 前言 大家都知道,Redis是内存数据库,也就是说client与Redis交互的过程,无论是读key还是写key都是直…...