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

DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计

目录

  • Insecure CAPTCHA(不安全验证)
    • low
      • 源码审计
    • medium
      • 源码审计
    • high
      • 源码审计
    • impossible
      • 源码审计

Insecure CAPTCHA(不安全验证)

Insecure CAPTCHA(不安全验证)漏洞指的是在实现 CAPTCHA(完全自动化公共图灵测试区分计算机和人类)机制时,未能有效保护用户输入的验证信息,从而使得攻击者能够绕过或破解该验证机制。这类漏洞通常出现在网络应用程序中,目的是防止自动化脚本(如机器人)对网站进行滥用,CAPTCHA全称为Completely Automated Public Turing Test to Tell Computers and Humans Apart,中文名字是全自动区分计算机和人类的图灵测试

low

正常修改会报错

重新修改密码并抓包发送到重放器

step=1修改为step=2,发包

修改成功

源码审计

并没有什么过滤,设置了step=2才能修改,使用**mysqli_real_escape_string**可能SQL注入;使用了不安全的md5加密算法

<?phpif (isset($_POST['Change']) && ($_POST['step'] == '1')) { // Step 1: 用户提交了第一个表单,并且是第一步$hide_form = true; // 标识隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new  = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 通过第三方服务检查CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// CAPTCHA验证未通过if (!$resp) {$html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false; // 如果错误,不隐藏表单return;} else {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 如果匹配,让用户确认更改$html .= "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre><form action=\"#\" method=\"POST\"><input type=\"hidden\" name=\"step\" value=\"2\" /><input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" /><input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" /><input type=\"submit\" name=\"Change\" value=\"Change\" /></form>";} else {// 两次输入的密码不匹配$html     .= "<pre>Both passwords must match.</pre>";$hide_form = false; // 不隐藏表单,提示用户重新输入}}
}
if (isset($_POST['Change']) && ($_POST['step'] == '2')) { // Step 2: 用户提交确认后的表单,进行更改操作$hide_form = true; // 隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new  = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 确认两个密码匹配if ($pass_new == $pass_conf) {// 对特殊字符进行转义,防止SQL注入$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 将密码进行md5加密(注:md5已不再安全,实际应用中应使用更安全的加密方式)$pass_new = md5($pass_new);// 更新数据库中当前用户的密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');// 给用户反馈密码已更改$html .= "<pre>Password Changed.</pre>";} else {// 两次输入的密码不匹配$html .= "<pre>Passwords did not match.</pre>";$hide_form = false; // 提示错误,不隐藏表单}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

medium

同样修改后抓包

这里查看源码可以发现设置了passed_captcha验证

step=1修改为step=2,并且添加passed_captcha=true

修改成功

源码审计

与low级别差不多,多了一个设置passed_captcha=true才能正常修改

?phpif (isset($_POST['Change']) && ($_POST['step'] == '1')) {// 第一步:用户提交了表单且处于步骤1$hide_form = true; // 标识隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 从第三方验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// CAPTCHA验证未通过if (!$resp) {$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false; // 如果错误,不隐藏表单return;} else {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 密码匹配,显示下一步$html .= "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre><form action=\"#\" method=\"POST\"><input type=\"hidden\" name=\"step\" value=\"2\" /><input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" /><input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" /><input type=\"hidden\" name=\"passed_captcha\" value=\"true\" /><input type=\"submit\" name=\"Change\" value=\"Change\" /></form>";} else {// 两次输入的密码不匹配$html .= "<pre>Both passwords must match.</pre>";$hide_form = false; // 不隐藏表单,提示用户重新输入}}
}
if (isset($_POST['Change']) && ($_POST['step'] == '2')) {// 第二步:用户提交确认后的表单$hide_form = true; // 隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 确保用户完成了第一步if (!$_POST['passed_captcha']) {$html .= "<pre><br />You have not passed the CAPTCHA.</pre>";$hide_form = false;return;}// 检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 匹配进行密码更新// 转义特殊字符,防止SQL注入$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 使用md5加密密码(注意:md5不够安全,实际应用中应使用更好的加密方法)$pass_new = md5($pass_new);// 更新数据库中的用户密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');// 反馈用户密码已更改$html .= "<pre>Password Changed.</pre>";} else {// 两次输入的密码不匹配$html .= "<pre>Passwords did not match.</pre>";$hide_form = false;}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

high

定位登录框,发现这么一处注释

 **DEV NOTE**   Response: 'hidd3n_valu3'   &&   User-Agent: 'reCAPTCHA'   **/DEV NOTE** 

结合源码得知需要g-recaptcha-response=hidd3n_valu3 并且 User-Agent: ‘reCAPTCHA’

同样修改后抓包

发送包并修改参数

修改成功

源码审计

设置了请求头:reCAPTCHA ; g-recaptcha-response = hidd3n_valu3,以及token使会话更有安全性,还利用CSRF令牌使的更安全

<?phpif (isset($_POST['Change'])) {// 用户提交了表单,隐藏CAPTCHA表单$hide_form = true;// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// 检查CAPTCHA验证是否通过或符合内置绕过条件if ($resp || ($_POST['g-recaptcha-response'] == 'hidd3n_valu3'&& $_SERVER['HTTP_USER_AGENT'] == 'reCAPTCHA')) {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 转义输入以防止SQL注入攻击$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 使用md5加密密码(注意:不推荐在生产环境中使用)$pass_new = md5($pass_new);// 更新数据库用户密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');// 返回用户的反馈信息$html .= "<pre>Password Changed.</pre>";} else {// 如果密码不匹配$html .= "<pre>Both passwords must match.</pre>";$hide_form = false;}} else {// CAPTCHA输入错误时的响应$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;return;}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}// 生成反CSRF攻击的令牌
generateSessionToken();
?>

impossible

源码审计

结合反CSRF令牌和CAPTCHA,提高安全性;并且使用PDO和参数绑定防止SQL注入。

<?php
if (isset($_POST['Change'])) {// 检查反CSRF令牌,确保请求的合法性checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');// 隐藏CAPTCHA表单$hide_form = true;// 获取用户输入的新密码,并移除转义字符$pass_new = $_POST['password_new'];$pass_new = stripslashes($pass_new);$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");$pass_new = md5($pass_new); // 对新密码进行MD5加密// 获取用户输入的确认密码,并移除转义字符$pass_conf = $_POST['password_conf'];$pass_conf = stripslashes($pass_conf);$pass_conf = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_conf) : "");$pass_conf = md5($pass_conf); // 对确认密码进行MD5加密// 获取用户输入的当前密码,并移除转义字符$pass_curr = $_POST['password_current'];$pass_curr = stripslashes($pass_curr);$pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_curr) : "");$pass_curr = md5($pass_curr); // 对当前密码进行MD5加密// 使用第三方功能验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// 如果CAPTCHA验证失败if (!$resp) {// 反馈信息:CAPTCHA错误$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;} else {// 检查当前密码是否正确$data = $db->prepare('SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;');$data->bindParam(':user', dvwaCurrentUser(), PDO::PARAM_STR);$data->bindParam(':password', $pass_curr, PDO::PARAM_STR);$data->execute();// 检查新密码是否匹配,且当前密码是否正确if (($pass_new == $pass_conf) && ($data->rowCount() == 1)) {// 更新数据库中的用户密码$data = $db->prepare('UPDATE users SET password = (:password) WHERE user = (:user);');$data->bindParam(':password', $pass_new, PDO::PARAM_STR);$data->bindParam(':user', dvwaCurrentUser(), PDO::PARAM_STR);$data->execute();// 用户反馈:成功$html .= "<pre>Password Changed.</pre>";} else {// 用户反馈:失败$html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}}
}// 生成反CSRF攻击的令牌
generateSessionToken();
?>
     $data->execute();// 用户反馈:成功$html .= "<pre>Password Changed.</pre>";} else {// 用户反馈:失败$html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}
}

}

// 生成反CSRF攻击的令牌
generateSessionToken();
?>


相关文章:

DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计

目录 Insecure CAPTCHA(不安全验证)low源码审计 medium源码审计 high源码审计 impossible源码审计 Insecure CAPTCHA(不安全验证) Insecure CAPTCHA&#xff08;不安全验证&#xff09;漏洞指的是在实现 CAPTCHA&#xff08;完全自动化公共图灵测试区分计算机和人类&#xff0…...

JavaScript HTML DOM 实例

JavaScript HTML DOM 实例 JavaScript 的 HTML DOM(文档对象模型)允许您通过脚本来控制 HTML 页面。DOM 是 HTML 文档的编程接口,它将 Web 页面与编程语言连接起来,使得开发者可以改变页面中的内容、结构和样式。在这篇文章中,我们将通过一系列实例来探讨如何使用 JavaSc…...

软件架构和软件体系结构的关系

软件架构&#xff08;Software Architecture&#xff09;和软件体系结构&#xff08;Software System Architecture&#xff09;这两个术语在日常使用中经常被交替使用&#xff0c;但它们在严格意义上有所区别&#xff1a; 1. **软件架构**&#xff1a; - 软件架构主要关注软件…...

C++并发:在线程间共享数据

1 线程间共享数据的问题 1.1 条件竞争 条件竞争&#xff1a;在并发编程中&#xff1a;操作由两个或多个线程负责&#xff0c;它们争先让线程执行各自的操作&#xff0c;而结果取决于它们执行的相对次序&#xff0c;这样的情况就是条件竞争。 诱发恶性条件竞争的典型场景是&am…...

GaussDB逻辑解码技术原理深度解析

GaussDB逻辑解码技术原理深度解析 一、背景介绍 在数字化转型的大潮中&#xff0c;异构数据库之间的数据同步需求日益增长。异构数据库同步指的是将不同类型、不同结构的数据库之间的数据进行同步处理&#xff0c;以确保数据在不同数据库之间的一致性。华为云提供的DRS服务&a…...

JAVA构造方法练习

要求在Student类中&#xff0c;&#xff08;task1&#xff09;添加一个有name和ID两个参数的构造方法&#xff0c;对成员变量name和ID进行初始化&#xff0c;&#xff08;task2&#xff09;实例化一个Student对象&#xff0c;学生姓名&#xff1a;Yaoming&#xff0c;ID&#x…...

Pytorch 三小时极限入门教程

一、引言 在当今的人工智能领域&#xff0c;深度学习占据了举足轻重的地位。而 Pytorch 作为一款广受欢迎的深度学习框架&#xff0c;以其简洁、灵活的特性&#xff0c;吸引了大量开发者投身其中。无论是科研人员探索前沿的神经网络架构&#xff0c;还是工程师将深度学习技术落…...

Rockect基于Dledger的Broker主从同步原理

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; RocketMQ原理简述&#xff08;二&#xff09;-CSDN博客 2.Broker的高可用 如果…...

面向对象分析与设计Python版 面向对象的核心特征

文章目录 一、封装二、继承三、多态四、聚合/组合五、接口/实现六、抽象 一、封装 封装 Encapsulation 封装是隐藏对象实现细节的过程内部状态通常不能被其他对象访问对象的数据只能通过接口去访问封装使得对象可以被看成一个“黑盒子”它保护对象的内部状态不被其他对象破坏…...

CDP集群安全指南-静态数据加密

[一]静态数据加密的架构 CDP 支持两种加密组件&#xff0c;这些组件可以组合成独特的解决方案。在选择密钥管理系统&#xff08;KMS&#xff09;时&#xff0c;您需要决定哪些组件能够满足企业的密钥管理和加密需求。 CDP 加密组件 以下是 Cloudera 用于静态数据加密的组件描…...

RSA密码的安全性分析(简化版本)

RSA的安全性是基于分解大整数的困难性假定&#xff0c;之所以认为是假定是因为至今还未能证明大整数就是NP问题&#xff0c;也许有尚未发现的多项式时间分解算法。随着人类计算能力的不断提高&#xff0c;原来被认为是不可能分解的大数已经被成功分解。对于大整数的威胁除了人类…...

嵌入式linux系统中CMake的基本用法

第一:CMake的基本使用 在上篇文章中,我们聊了聊 Makefile。虽然它是 C/C++ 项目编译的“老司机”,但写起来真的是让人头大。尤其是当项目文件一多,手写依赖就像在搬砖,费时又费力。 那么问题来了,难道我们就没有更优雅的工具了吗?答案是:有! 这时候,CMake 就像一个…...

若依修改超级管理员admin的密码

通过接口方式或者页面 /system/user/resetPwd 需改其他用户的密码 修改其他用户的加密的密码&#xff0c;然后通过数据库将admin更新为这个密码就修改好了...

matlab中高精度计算函数vpa与非厄米矩阵本征值的求解

clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…...

王佩丰24节Excel学习笔记——第二十四讲:宏表函数

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 宏表函数不能直接使用。get.cell(参数一&#xff0c;参数二)&#xff0c;参数一要参考类型表。 获得单元格的公式有很多种方法&#xff0c; 如&#xff1a;宏写法&#xff1a;get.cel…...

Navicat 17 for Mac 数据库管理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕。2. 应用程序/启动台显示Navicat图标&#xff0c;表示安装成功。 二、运行测试运行后提示&#xff1a;“Navicat Premium.pp”已损坏&#x…...

现代光学基础2

yt2 目录 激光器概述红宝石激光器 工作原理主要特点举例说明 固体激光器 分类与特点钛-蓝宝石激光器锁模技术 光纤激光器 优势与应用掺铒光纤放大器&#xff08;EDFA&#xff09;隔离器与法拉第效应 气体激光器 常见类型工作原理举例说明 半导体激光器 现状与优势工作原理应用…...

Git 入门(一)

git 工作流如下&#xff1a; 命令如下&#xff1a; clone&#xff08;克隆&#xff09;: 从远程仓库中克隆代码到本地仓库checkout &#xff08;检出&#xff09;:从本地仓库中检出一个仓库分支然后进行修订add&#xff08;添加&#xff09;: 在提交前先将代码提交到暂存区com…...

mysql自定义安装

1、下载安装包 我是在windows上安装&#xff0c;所以选择“Mysql Installer for Windows” 2、安装mysql 双击“mysql-installer-community-8.0.40.0.msi”&#xff0c;开始启动安装 这里选择安装项&#xff0c;这里只选择了两项。workbench是图形化管理工具&#xff0c;比较吃…...

微软自带日志输出+Serilog

安装两个 NuGet 包&#xff1a;Microsoft.Extensions.Logging&#xff0c;Serilog.AspNetCore 如何配置Program.cs&#xff0c;builder 具体如何配置自行解决&#xff1a; var builder WebApplication.CreateBuilder(args); builder.Logging.ClearProviders(); builder.Loggi…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...