WEB攻防-文件下载文件读取文件删除目录遍历目录穿越
目录
一、文件下载漏洞
1.1 文件下载案例(黑盒角度)
1.2 文件读取案例(黑盒角度)
二、文件删除
三、目录遍历与目录穿越
四、审计分析-文件下载漏洞-XHCMS
五、审计分析-文件读取漏洞-MetInfo-函数搜索
六、审计分析-文件删除-74CMS-函数搜索
一、文件下载漏洞
1. 白盒审计流程:功能点抓包-代码文件的特定函数-寻变量控制-构造测试
2. 黑盒流程:查看网站是否有文件下载的功能
在文件下载中一般会遇到两种情况:
常规下载URL:http://www.xiaodi8.com/upload/123.pdf
在常规下载中,如过下载一个代码文件,比如1.php是不行的,因为.php结尾会被执行,不会被下载也看不到源码。
而在高版本中00截断也是不存在的
可能存在安全URL:http://www.xiaodi8.com/xx.xx?file=123.pdf
下载的文件以参数值去发送解析下载
下载和读取,其实是差不多的,最终的目的都是读取敏感信息,获取敏感文件等
1.1 文件下载案例(黑盒角度)
这是一个文件下载功能,URL:http://67.202.70.133/files/readfile.php,如果是直连下载,一般是直接指向资源的,如上面例子http://www.xiaodi8.com/upload/123.pdf,在这里其实是通过一个file参数接收路径的方式来获取的

利用我们已知的文件,如当前页面readfile.php,通过参数是否可以下载或者读取到代码,发现是可以的

但是从 readfile.php代码上看就是一个简单的封包,然后根据file参数,使用一个readfile函数来获取文件,并没有什么关键信息
但每个网站一般都会有索引文件,尝试去获取index.php,从url可以看到这里经过了file目录,所以需要使用../返回上一级目录

成功获取到,并从index的代码看到这是一个Joomla

在网上找一写他的关键配置文件,尝试去读取 ,如数据库配置文件../configuration.php,

泄露了数据库的账号密码等隐私信息
.
文件下载/读取常见的敏感信息路径
1、Windows系统:
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息2、Linux系统:
/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts
//ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
1.2 文件读取案例(黑盒角度)
靶场注册登录及应用
https://portswigger.net/web-security/all-labs,最好使用gmail邮箱进行注册,其他可能收不到验证邮箱,验证邮箱后,会让你设置用户名,但密码是由portswigger自动生成,复制登录即可(记得关闭代理,不然会登录失败)
实验室:文件路径遍历,简单案例 |网络安全学院 (portswigger.net)
访问实验室即可开启靶场
任意以url的方式打开页面上的图片https://0ae3006a032d097482c3eea700df003b.web-security-academy.net/image?filename=20.jpg发现是由filename参数控制的


开启burp抓包,并将抓取的数据包发送至Repeater处,修改其文件头?filename=../../../etc/passwd
则返回数据包中会显示,linux服务器中的账户信息

二、文件删除
文件删除漏洞就是程序在删文件的时候出了问题。一是缺乏权限验证,谁都能来删文件;二是没输入验证不严格,允许删除任何文件等;
删除是高危操作,即使是授权站也需独立部署才能测试
举个例子:常见cms安装后会有install_lock.txt文件用于检测已安装,如果删除该文件,访问就会跳转安装的页面。
还有index.php通常是网站的默认首页文件或重要的入口文件,当index被删除,服务器在找不到index.php这个默认指定的首页文件时,会尝试展示当前目录下的其他文件列表来作为替代,这是服务器配置的一种默认回退机制,就会显示出一堆文件名
前提:
Apache开启Option +Indexes, +代表开启,-代表禁用
Nginx在location 块中添加autoindex on; 开启文件列表显示功能。
Apache实例:


三、目录遍历与目录穿越
-
攻击意图不同
- 目录遍历:攻击者的主要意图往往是对目标系统的目录结构进行全面的探索和查看。就好像攻击者想要在一个大型图书馆里随意走动,查看各个书架、各个楼层的书籍摆放情况,目的是了解整个图书馆的布局和有哪些藏书,以寻找有价值的信息或潜在的漏洞,比如找到包含敏感数据的目录或文件。
- 目录穿越:攻击者的目的更具针对性和破坏性,是想要直接突破限制到达特定的、通常是受限制或敏感的目录位置。类似于攻击者知道图书馆里有一个存放珍贵古籍的密室,他的目标就是直接穿过各种限制进入这个密室,获取或破坏里面的珍贵古籍,比如访问系统的核心配置文件目录进行篡改。
-
攻击行为特点不同
- 目录遍历:通常依靠多次使用 “../” 等路径操作符,逐步向上或向下移动目录层级,进行大量的尝试性访问。例如,攻击者可能会构造 “../../dir1/../../dir2/../file.txt” 这样的路径,从当前目录逐步回溯和探索其他目录。
- 目录穿越:更多地是精心构造一个能够直接跨越多个目录层级的路径,利用应用程序对路径处理的漏洞,直接定位到目标敏感目录。比如,在一个 Web 应用中,利用文件上传功能的漏洞,构造类似 “/var/www/html/../etc/passwd” 的路径,试图直接穿越到系统的用户密码文件所在目录。
-
利用漏洞的方式不同
- 目录遍历:更多地是利用系统或应用程序对目录路径解析的一般性漏洞,没有严格限制对目录层级的访问,使得攻击者能够随意在目录结构中移动。比如系统对用户输入的路径没有进行充分的合法性检查,攻击者就可以利用这一点进行目录遍历。
- 目录穿越:常常是利用应用程序在特定功能或操作中对路径处理的缺陷,比如在文件上传、下载功能中,对目标路径的验证不严格,导致攻击者可以通过构造特殊的路径,将文件上传到或下载自不应该访问的目录,从而实现目录穿越。
-
造成的危害程度和范围不同
- 目录遍历:可能会导致系统中的大量文件和目录信息被泄露,攻击者可以获取到系统的目录结构、文件列表等信息,为后续的攻击提供信息支持,但一般不会直接对系统造成严重的破坏。
- 目录穿越:一旦成功,往往会直接对特定的敏感文件或目录造成威胁,可能导致敏感数据泄露、文件被篡改或删除等严重后果,对系统的安全性和稳定性造成直接的、严重的破坏。
四、审计分析-文件下载漏洞-XHCMS
看到有下载文件的功能

可以看到3个下载,使用F12打开开发者工具,看下三个请求地址的区别,可以看到line的不同,和根据英文推测应该是区分网盘、电信、联通下载

可以看出从当前页面index的 r参数来接收跳转的页面或api,找到index.php

看到这个include的,回顾上一篇文件包含说到,前后不能指定,否则伪协议失效,比如include('x/'.$file); 或者 include($file.'php') ,这不细说,不是这章的重点
从index代码可以验证我们的想法,通过r加载某个文件,顺着这个思路找到下载文件所加载的files/downloads.php
<?php
require 'inc/conn.php';
$line=addslashes($_GET['line']);
$type=addslashes($_GET['type']);
$fileid=addslashes($_GET['cid']);
if(!is_numeric($fileid)){
echo "错误的下载请求!";
exit;}
$query = "SELECT * FROM download WHERE ( id='$fileid')";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$down= mysql_fetch_array($result);
$fileadd=$down['softadd'];
$fileadd2=$down['softadd2'];
if ($type=='soft' AND $line=='pan'){
if ($fileadd2==""){
echo "<script language=JavaScript>alert('抱歉,程序尚在开发当中,请稍后再试!');history.back();window.close();</script>";
exit;}
//下载计数
$query = "UPDATE download SET xiazai = xiazai+1 WhERE id='$fileid'";
@mysql_query($query) or die('修改错误:'.mysql_error()); header("Location: $fileadd2");
exit;
}if ($type=='soft' AND ($line=="telcom" OR $line=="unicom")){
$filename=$down['title'];
$filename2=$down['version'];
$filename=iconv("UTF-8", "GBK", $filename);
$houzhui=substr($fileadd,strrpos($fileadd,"."));
$sourceFile = $fileadd; //要下载的临时文件名
$outFile = $filename." ".$filename2.$houzhui; //下载保存到客户端的文件名
$file_extension = strtolower(substr(strrchr($sourceFile, "."), 1)); //获取文件扩展名
//echo $sourceFile;
//if (!ereg("[tmp|txt|rar|pdf|doc]", $file_extension))exit ("非法资源下载");
//检测文件是否存在
if (!is_file($sourceFile)) { die("<script language=JavaScript>alert('抱歉,本地下载未发现文件,请选择网盘下载!');history.back();window.close();</script>");
}
$len = filesize($sourceFile); //获取文件大小
$filename = basename($sourceFile); //获取文件名字
$outFile_extension = strtolower(substr(strrchr($outFile, "."), 1)); //获取文件扩展名
//根据扩展名 指出输出浏览器格式
switch ($outFile_extension) { case "exe" : $ctype = "application/octet-stream"; break; case "zip" : $ctype = "application/zip"; break; case "mp3" : $ctype = "audio/mpeg"; break; case "mpg" : $ctype = "video/mpeg"; break; case "avi" : $ctype = "video/x-msvideo"; break; default : $ctype = "application/force-download";
}
//Begin writing headers
header("Cache-Control:");
header("Cache-Control: public"); //设置输出浏览器格式
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=" . $outFile);
header("Accept-Ranges: bytes");
$size = filesize($sourceFile);
//如果有$_SERVER['HTTP_RANGE']参数
if (isset ($_SERVER['HTTP_RANGE'])) { /*Range头域 Range头域可以请求实体的一个或者多个子范围。 例如, 表示头500个字节:bytes=0-499 表示第二个500字节:bytes=500-999 表示最后500个字节:bytes=-500 表示500字节以后的范围:bytes=500- 第一个和最后一个字节:bytes=0-0,-1 同时指定几个范围:bytes=500-600,601-999 但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。 */ // 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912- list ($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); //if yes, download missing part str_replace($range, "-", $range); //这句干什么的呢。。。。 $size2 = $size -1; //文件总字节数 $new_length = $size2 - $range; //获取下次下载的长度 header("HTTP/1.1 206 Partial Content"); header("Content-Length: $new_length"); //输入总长 header("Content-Range: bytes $range$size2/$size"); //Content-Range: bytes 4908618-4988927/4988928 95%的时候
} else { //第一次连接 $size2 = $size -1; header("Content-Range: bytes 0-$size2/$size"); //Content-Range: bytes 0-4988927/4988928 header("Content-Length: " . $size); //输出总长
}
//打开文件
$fp = fopen("$sourceFile", "rb");
//设置指针位置
fseek($fp, $range);
//虚幻输出
while (!feof($fp)) { //设置文件最长执行时间 set_time_limit(0); print (fread($fp, 1024 * 8)); //输出文件 flush(); //输出缓冲 ob_flush();
}
fclose($fp);
//下载计数
$query = "UPDATE download SET xiazai = xiazai+1 WhERE id='$fileid'";
@mysql_query($query) or die('修改错误:'.mysql_error());
exit ();
}
?>
从url我们知道downloads传入参数type,line和cid ,找到对应位置观察,接收三个值并使用addslashes函数对数据过滤

继续往下看,这是一个数据库操作,从download表根据查询id=cid获取数据,$down接收数据库返回的数据,把softadd字段的值赋给$fileadd,把softadd2字段的值赋给$fileadd2,往下看$type=='soft' AND $line=='pan',这里就是网盘下载softadd2为空就弹出提示框并关闭当前窗口。这里直接通过跳转网盘下载,所以直接往下看
继续往下看一看到联通和电信下载,这里设置了一个临时文件名
$sourceFile = $fileadd; //要下载的临时文件名
后续都是以这部分做的一些处理,如获取后缀,文件名等

通过设置 HTTP 响应头告知浏览器如何处理接收到的数据。

Content - Type:指定返回数据的 MIME 类型,比如application/octet - stream一般用于二进制文件下载,audio/mpeg用于 MP3 音频文件等,让浏览器知道数据的类型。Content - Disposition:设置为attachment,表明这是一个要下载的文件,而不是直接在浏览器中打开。filename指定了下载文件保存时的名称。Accept - Ranges:告诉浏览器服务器支持按字节范围请求数据,这是实现断点续传功能的基础。
然后设置断点续传,不一一细说

最后通过fopen打开 ,把数据流返回给客户端,而fopen打开的正是$sourceFile

读完代码,我们知道整体流程下
数据库查询出来-->$down['softadd'];-->$sourceFile = $fileadd; -->$sourceFile(从右到左倒推)
显然download表的 fileadd就应该是个路径,只要我们能控制这个路径,就能任意下载,但是该路径是保存在数据库的
所以我们需要找到,是谁操作了download表写进fileadd字段的,首先全局搜索download表插入操作insert into download/insert download,into是可以省略的,一般这两种写法,找不到就直接搜索download表
可以看到newsoft对download进行了插入操作

但是需要后台操作,尝试能不能直接访问这个后台发布,利用参数跳转查看

很显然是不行的,从黑盒角度基本是就是要获取后台权限才有可能了,不过该系统是存在sql注入的,任意登录漏洞,这里不细说,可以参考:xhcms v1.0漏洞复现_xhcms文件上传漏洞-CSDN博客
-
账号:-1' union select 1,2,'test','0192023a7bbd73250516f069df18b500',5,6,7,8;#
-
密码:admin123
如果黑盒测出任意登录,那就可以继续做这个下载漏洞了

但这里讲的是白盒,所以一般在公司的话可以要一个测试账户的,登录之后, 假设我们已知D://www.txt是一个敏感文件

回到下载页面去下载文件

使用电信或联通下载

五、审计分析-文件读取漏洞-MetInfo-函数搜索
流程:特定函数搜索-寻触发调用-构造Payload测试
文件读取一般在页面中很难看出,所以需要搜索php中文件读取的函数
php文件读取的函数,7种:https://www.cnblogs.com/gyrgyr/p/5774436.html
比如:搜索其中一种
全局搜索readfile,在/app/system/include/module/old_thumb.class.php目录下
(正常情况下需要逐个文件分析,这里做演示所以直接给答案)

打开可以看到追踪$dir变量看一看到old_thumb类doshow方法通过GET获取的dir参数并且str_replace(array('../','./')过滤了../和./,但我们可以用反斜杠,其次还需要路径以 http开头, (substr(str_replace($_M['url']['site'], '', $dir),0,4) == 'http');。这里应该是通过http请求一张图片
public function doshow(){global $_M;$dir = str_replace(array('../','./'), '', $_GET['dir']);echo $dir;echo "<br/>";echo !(substr(str_replace($_M['url']['site'], '', $dir),0,4) == 'http');echo "<br/>";if(substr(str_replace($_M['url']['site'], '', $dir),0,4) == 'http' && strpos($dir, './') === false){header("Content-type: image/jpeg");echo $dir;echo 11111111;ob_start();readfile($dir);ob_flush();flush();die;}
也就是说我们需要知道谁调用了doshow,同样的全局搜索,在include\thumb.php中定义了一个常量

从代码看这里仅仅是定义了一个常量
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
define('M_NAME', 'include');
define('M_MODULE', 'include');
define('M_CLASS', 'old_thumb');
define('M_ACTION', 'doshow');
require_once '../app/system/entrance.php';
# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>
但是这里还引入了require_once '../app/system/entrance.php';在这个文件最后引入require_once PATH_SYS_CLASS.'load.class.php';并加载load::module()

代码逻辑有点复杂,就不细说了,有时间的可以自己去看下,我简单阐述一下:load::module() 方法会根据 M_CLASS 和 M_ACTION 等常量的值,调用 _load_class 方法来加载相应的类并执行对应的方法。
如果 M_ACTION 不为空且不是 'new',并且方法名以 'do' 开头(这里 'doshow' 满足以 'do' 开头),则会实例化类并使用 call_user_func 函数调用该类的 doshow 方法,从而执行具体的业务逻辑。

引用关系:
thumb.php -> entrance.php -> load.class.php下的load::module()-> _load_class() -> call_user_func()调用M_CLASS下的M_ACTION方法所以通过thump.php控制dir值去获取本地文件,因为doshow不允许../和./,但可以使用\,且也需要http开头 构造payload: http\..\..\config\config_db.php(假设知道config_db.php) 首先抓包,然后添加payload: 127.0.0.1/metinfo/include/thumb.php?dir=http\..\..\config\config_db.php

六、审计分析-文件删除-74CMS-函数搜索
文件删除一般在会员中心或者后台进行操作,基本上不会在页面中展示。
① php文件删除函数是unlink,直接全局搜索
在/upload/admin/admin_article.php路径下
看到当$acl='del_img'满足条件时,会接受img参数,并删除img传进来的相关的文件
追踪act发现他也是通过请求头获取的

其次这里调用了两次unlink,由upfiles_dir和thumb_dir拼接而成,追踪查看,而两个变量都用了../data,也就是上一级目录的data,这个文件被admin_acticle.php引用,所以相对路径是基于admin_acticle.php的,所以是upload下的data文件夹下$CFG['x']文件夹下的文件,即upload/data/$CFG['x']/.png,有点绕,自己数几次就好,主要是判断要用多少个../,如果不想数,一个一个加../也是可以的

注意:追踪 upfiles_dir的时候条到的是elseif($act == 'addsave')这个代码段下的,从逻辑上分析,我们直接请求ack=del_img的话elseif($act == 'addsave')是不会被执行的,所以肯定不会是引用的这个的

而追踪是会指向第一次出现的地方,第一次出现就是if条件内,那么可以判断应该不是当前文件的变量,查看引用了什么文件,然后去全局搜索upfiles_dir

最终进去看到两个变量都被定义在这个文件/include/admin_common.inc.php

首先在upload创建一个1.txt,构造url去删除他,从上面可以知道删除的是upload/data/xxx/下的文件,所以回到upload需要../../
最后得到payload:upload/admin/admin_article.php?act=del_img&img=../../1.txt

这个系统是有CSRF处理来源请求的,返回admin_index.php下操作就能绕过...不需要抓包改

相关文章:
WEB攻防-文件下载文件读取文件删除目录遍历目录穿越
目录 一、文件下载漏洞 1.1 文件下载案例(黑盒角度) 1.2 文件读取案例(黑盒角度) 二、文件删除 三、目录遍历与目录穿越 四、审计分析-文件下载漏洞-XHCMS 五、审计分析-文件读取漏洞-MetInfo-函数搜索 六、审计分析-…...
部署open webui 调用ollama启动的deepseek
以下是 部署Open WebUI并调用Ollama的deepseek-70b模型 的详细步骤,重点讲解部署和配置过程: 一、部署 Open WebUI 1. 安装Docker(如已安装可跳过) # 自动安装Docker curl -fsSL https://get.docker.com | sh # 启动Docker服务 …...
理解推理型大语言模型
构建和改进推理模型的方法与策略 本文描述了构建推理模型的四种主要方法,以及我们如何增强大型语言模型(LLM)的推理能力。我希望这能为你提供有价值的见解,并帮助你了解这一领域快速发展的文献和热潮。 在2024年,LLM…...
告别人工检测!casaim自动化三维激光扫描
在工业制造和工程领域,传统的质量检测方法主要依赖人工操作,不仅效率低下,而且容易受到人为因素的影响,导致检测结果的不一致性和重复性差。 传统人工检测的局限性: 传统的人工检测方法,如使用卡尺、千分…...
使用云效解决docker官方镜像拉取不到的问题
目录 前言原文地址测试jenkins构建结果:后续使用说明 前言 最近经常出现docker镜像进行拉取不了,流水线挂掉的问题,看到一个解决方案: 《借助阿里个人版镜像仓库云效实现全免费同步docker官方镜像到国内》 原文地址 https://developer.aliyun.com/artic…...
Linux TCP 编程详解与实例
一、引言 在网络编程的领域中,TCP(Transmission Control Protocol)协议因其可靠的数据传输特性而被广泛应用。在 Linux 环境下,使用 C 或 C 进行 TCP 编程可以实现各种强大的网络应用。本文将深入探讨 Linux TCP 编程的各个方面&…...
认识O(NlogN)的排序
归并排序 归并排序(任何一个递归)如果不懂可以画一个树状结构去帮助自己去理解。 核心排序方法为Merger public class 归并排序 {public static void main(String[] args) {int[] arr1 {3, 1, 2, 2, 5, 6};int[] arr2 Arrays.copyOf(arr1, arr1.len…...
[手机Linux] onepluse6T 系统重新分区
一,刷入TWRP 1. 电脑下载 Fastboot 工具(解压备用)和对应机型 TWRP(.img 后缀文件,将其放入前面解压的文件夹里) 或者直接这里下载:TWRP 2. 将手机关机,长按音量上和下键 开机键 进入 fastbo…...
对ReentrantLock的公平性进行测试
ReentrantLock公平性实现原理 在ReentrantLock类内部定义了一个内部类Sync以及两个实现NonfairSync和FairSync,它们内部定义了锁获取和释放的逻辑,下面我列出了两种同步类的代码,通过观察两个代码的差异就可以看到公平性是如何实现的。 Nonf…...
LabVIEW之TDMS文件
在很多场合,早期的LabVIEW版本不得不借助常规的数据库来做一些数据管理工作,但常规数据库对于中高速数据采集显然是不合适的,因为高速数据采集的数据量非常大,用一般的数据库无法满足存储数据的要求。 直到TDM(Technical Data Ma…...
DeepSeek 实现原理探析
DeepSeek 实现原理探析 引言 DeepSeek 是一种基于深度学习的智能搜索技术,它通过结合自然语言处理(NLP)、信息检索(IR)和机器学习(ML)等多领域的技术,旨在提供更加精准、智能的搜索…...
2021 年 9 月青少年软编等考 C 语言五级真题解析
目录 T1. 问题求解思路分析T2. 抓牛思路分析T3. 交易市场思路分析T4. 泳池思路分析T1. 问题求解 给定一个正整数 N N N,求最小的 M M M 满足比 N N N 大且 M M M 与 N N N 的二进制表示中有相同数目的 1 1 1。 举个例子,假如给定 N N N 为 78 78 78,二进制表示为 …...
洛谷网站: P3029 [USACO11NOV] Cow Lineup S 题解
题目传送门: P3029 [USACO11NOV] Cow Lineup S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言: 这道题的核心问题是在一条直线上分布着不同品种的牛,要找出一个连续区间,使得这个区间内包含所有不同品种的牛,…...
编程领域的IO模型(BIO,NIO,AIO)
目前对于市面上绝大多数的应用来说,不能实现的业务功能太少了。更多的是对底层细节,性能优化的追求。其中IO就是性能优化中很重要的一环。Redis快,mysql缓冲区存在的意义。都跟IO有着密切关系。IO其实我们都在用,输入输出流这块。…...
DeepSeek和ChatGPT的对比
最近DeepSeek大放异彩,两者之间有什么差异呢?根据了解到的信息,简单做了一个对比。 DeepSeek 和 ChatGPT 是两种不同的自然语言处理(NLP)模型架构,尽管它们都基于 Transformer 架构,但在设计目标…...
Pyqt 的QTableWidget组件
QTableWidget 是 PyQt6 中的一个表格控件,用于显示和编辑二维表格数据。它继承自 QTableView,提供了更简单的方式来处理表格数据,适合用于需要展示结构化数据的场景。 1. 常用方法 1.1 构造函数 QTableWidget(parent: QWidget None)&#x…...
4. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务设计原则与最佳实践
相比传统的单体应用,微服务架构通过将大型系统拆分成多个独立的小服务,不仅提升了系统的灵活性和扩展性,也带来了许多设计和运维上的挑战。如何在设计和实现微服务的过程中遵循一系列原则和最佳实践,从而构建一个稳定、高效、易维…...
网络安全威胁框架与入侵分析模型概述
引言 “网络安全攻防的本质是人与人之间的对抗,每一次入侵背后都有一个实体(个人或组织)”。这一经典观点概括了网络攻防的深层本质。无论是APT(高级持续性威胁)攻击、零日漏洞利用,还是简单的钓鱼攻击&am…...
树和二叉树_7
树和二叉树_7 一、leetcode-102二、题解1.引库2.代码 一、leetcode-102 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 样例输入:root [3,9,20,null,nu…...
不同标签页、iframe或者worker之间的广播通信——BroadcastChannel
BroadcastChannel是一个现代浏览器提供的 API,用于在同一浏览器的不同浏览上下文(如不同的标签页、iframe 或者 worker)之间进行消息传递。它允许你创建一个广播频道,通过该频道可以在不同的浏览上下文之间发送和接收消息。 Broa…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
