DVWA靶场保姆级通关教程--06不安全验证机制
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
-
目录
文章目录
前言
原理详解
1. 前后端验证逻辑不一致
2. 验证码值保存在客户端
3. 验证码可预测或重复
4. 验证码验证与逻辑解耦
一、处理关卡报错
二、low级别源码分析
三、medium级别源码分析
三、high级别源码分析
安全点说明:
四、impossible级别源码分析
总结:Impossible级别的安全设计
前言
提示:这里可以添加本文要记录的大概内容:
Insecure CAPTCHA 模块的含义是:CAPTCHA 的验证机制存在安全漏洞,可以被攻击者轻松绕过,从而进行自动化攻击(例如暴力破解登录密码)。
原理详解
在 DVWA 的这个模块中,存在以下常见的实现漏洞:
1. 前后端验证逻辑不一致
-
前端页面展示了验证码图片(如一个 5 位数字),用户输入后提交表单。
-
但后端未正确校验或校验方式过于简单,甚至根本未检查验证码输入是否正确。
-
攻击者可以直接跳过验证码输入字段,构造 POST 请求攻击。
2. 验证码值保存在客户端
-
有的实现会把验证码值直接保存在 cookie、hidden field 或 session 中,攻击者可以通过抓包或调试 JS 获取验证码答案。
-
甚至可以通过查看源码或 response 来获取验证码值。
3. 验证码可预测或重复
-
如果验证码使用的是伪随机函数(如
rand()
)生成,而种子固定,攻击者可预测其值。 -
或者验证码值在每次访问时不更新(比如 10 分钟内都是同一个),那么攻击者只需识别一次,就可反复使用。
4. 验证码验证与逻辑解耦
-
某些实现中,验证码验证逻辑在前端处理,而没有在服务端做真正校验,攻击者可直接跳过验证逻辑。
提示:以下是本篇文章正文内容,下面案例可供参考
一、处理关卡报错
$_DVWA[ 'recaptcha_public_key' ] = '';
$_DVWA[ 'recaptcha_private_key' ] = '';
改为:
$_DVWA[ 'recaptcha_public_key' ] = '6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg';
$_DVWA[ 'recaptcha_private_key' ] = '6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ';
重启或者退出dvwa重新登录,修改成功
二、low级别源码分析
<?php// 如果提交了表单,并且 step 是 1(第一步:验证码验证)
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {$hide_form = true; // 隐藏第一步的 CAPTCHA 表单// 获取用户输入的新密码和确认密码$pass_new = $_POST[ 'password_new' ]; // 新密码$pass_conf = $_POST[ 'password_conf' ]; // 确认密码// 验证 CAPTCHA,使用第三方(Google reCAPTCHA)$resp = recaptcha_check_answer($_DVWA[ 'recaptcha_private_key'], // 使用私钥$_POST['g-recaptcha-response'] // 用户填写的 CAPTCHA 响应);// 如果 CAPTCHA 验证失败if( !$resp ) {$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>"; // 提示 CAPTCHA 错误$hide_form = false; // 显示 CAPTCHA 表单return; // 停止执行后续逻辑}else {// CAPTCHA 验证通过,检查两个密码是否一致if( $pass_new == $pass_conf ) {// 如果一致,显示第二步确认提交表单echo "<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; // 显示 CAPTCHA 表单}}
}// 如果提交了表单,并且 step 是 2(第二步:真正修改密码)
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ '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 ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_new = md5( $pass_new ); // 对密码进行 md5 哈希// 构造 SQL 更新语句,更新当前用户的密码$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>' );echo "<pre>Password Changed.</pre>"; // 提示密码修改成功}else {echo "<pre>Passwords did not match.</pre>"; // 提示密码不一致$hide_form = false; // 显示表单}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); // 关闭数据库连接
}?>
核心安全问题(即 “Insecure CAPTCHA” 原理)
<input type="hidden" name="step" value="2" />
攻击者可以跳过第一个 CAPTCHA 表单,直接构造第二步请求(step=2)提交新密码,因为 第二步中没有再次验证 CAPTCHA 是否通过,也没有其他身份校验机制。
所以这里输入密码,用bp抓包,将step的值从1直接改为2,即跳过安全验证,直接改密
抓包结果如下:
在返回的数据包中发现修改成功
三、medium级别源码分析
<?phpif( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) { // 如果提交了表单并且当前步骤为第1步// Hide the CAPTCHA form$hide_form = true; // 隐藏 CAPTCHA 表单// Get input$pass_new = $_POST[ 'password_new' ]; // 获取新密码$pass_conf = $_POST[ 'password_conf' ]; // 获取确认密码// Check CAPTCHA from 3rd party$resp = recaptcha_check_answer( // 调用 Google reCAPTCHA 接口进行验证$_DVWA[ 'recaptcha_private_key' ], // 使用 DVWA 中设置的私钥$_POST['g-recaptcha-response'] // 获取表单中用户填写的 CAPTCHA 响应);// Did the CAPTCHA fail?if( !$resp ) { // 如果 CAPTCHA 验证失败// What happens when the CAPTCHA was entered incorrectly$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>"; // 显示错误信息$hide_form = false; // 显示表单return; // 停止执行}else {// CAPTCHA was correct. Do both new passwords match?if( $pass_new == $pass_conf ) { // 如果两个密码一致// Show next stage for the userecho "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre> // CAPTCHA 验证成功提示<form action=\"#\" method=\"POST\"> // 第二步的确认修改表单<input type=\"hidden\" name=\"step\" value=\"2\" /> // 标记为第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\" /> // 隐藏域标记 CAPTCHA 已通过<input type=\"submit\" name=\"Change\" value=\"Change\" /> // 提交按钮</form>";}else {// Both new passwords do not match.$html .= "<pre>Both passwords must match.</pre>"; // 显示密码不一致的错误信息$hide_form = false; // 显示表单}}
}if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) { // 如果当前为第2步// Hide the CAPTCHA form$hide_form = true; // 隐藏 CAPTCHA 表单// Get input$pass_new = $_POST[ 'password_new' ]; // 获取新密码$pass_conf = $_POST[ 'password_conf' ]; // 获取确认密码// Check to see if they did stage 1if( !$_POST[ 'passed_captcha' ] ) { // 如果未通过 CAPTCHA 验证(没有设置 passed_captcha 字段)$html .= "<pre><br />You have not passed the CAPTCHA.</pre>"; // 提示用户未通过 CAPTCHA$hide_form = false; // 显示表单return; // 停止执行}// Check to see if both password matchif( $pass_new == $pass_conf ) { // 如果两个密码一致// They do!$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // 对密码进行转义防止 SQL 注入$pass_new = md5( $pass_new ); // 将密码使用 md5 加密// Update database$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; // 构造 SQL 更新语句$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>' ); // 执行 SQL 并在出错时输出错误信息// Feedback for the end userecho "<pre>Password Changed.</pre>"; // 提示密码修改成功}else {// Issue with the passwords matchingecho "<pre>Passwords did not match.</pre>"; // 提示密码不一致$hide_form = false; // 显示表单}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); // 关闭数据库连接
}?>
medium 级别与 low 级别的区别是:
-
增加了对 CAPTCHA 验证通过的状态存储:通过隐藏字段
passed_captcha
传递。 -
在第二步执行修改前,检查
passed_captcha
是否存在,以避免跳过 CAPTCHA 验证。
不过这仍然可以被伪造表单绕过(如构造 POST 请求带 passed_captcha=true
)
这里的话还是可以通过抓包添加这个字段来提交,显示修改成功,这里的修改也是在repeater模块中修改,然后点击send
三、high级别源码分析
查看源码,服务器的验证逻辑是当$resp
是true
,并且参数recaptcha_response_field
等于hidd3n_valu3
(或者http包头的User-Agent
参数等于reCAPTCHA)
时,就认为验证码输入正确,反之错误。
<?php// 如果用户提交了 "Change" 表单
if( isset( $_POST[ 'Change' ] ) ) {// 隐藏 CAPTCHA 表单$hide_form = true;// 获取用户输入的新密码和确认密码$pass_new = $_POST[ 'password_new' ]; // 新密码$pass_conf = $_POST[ 'password_conf' ]; // 确认密码// 调用 reCAPTCHA 第三方函数验证用户输入$resp = recaptcha_check_answer($_DVWA[ 'recaptcha_private_key' ], // 使用私钥$_POST['g-recaptcha-response'] // 用户输入的验证码响应);// 如果验证码验证成功,或使用了一个特定的隐藏值(后门验证码)并且UA是'reCAPTCHA'(模拟机器人)if ($resp || ($_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3' // 这是个后门值,意味着攻击者可以绕过验证码&& $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA' // 并且 User-Agent 被伪装成 reCAPTCHA)){// 如果两个密码相同if ($pass_new == $pass_conf) {// 使用 mysqli_real_escape_string 防止 SQL 注入(前提是数据库连接存在)$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$pass_new = md5( $pass_new ); // 使用 MD5 对密码进行哈希(不安全)// 构造 SQL 更新语句,修改当前登录用户的密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;";// 执行 SQL 语句,如果失败则输出错误$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>' );// 提示用户密码修改成功echo "<pre>Password Changed.</pre>";} else {// 如果两个密码不一致,提示错误$html .= "<pre>Both passwords must match.</pre>";$hide_form = false;}} else {// 如果验证码验证失败,提示错误$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);
}// 生成 Anti-CSRF token,防止 CSRF 攻击
generateSessionToken();?>
安全点说明:
-
✅ 高等级增加了限制:必须通过 reCAPTCHA 验证或匹配特定值且 User-Agent 正确(用于防御简单的自动脚本)。
-
❌ 后门逻辑存在:验证码绕过后门
'hidd3n_valu3'
+'reCAPTCHA'
的组合,可以被攻击者利用。 -
❌ 仍使用 MD5 加密密码:MD5 不安全,容易被破解,建议使用 bcrypt 或 Argon2。
-
❌ 数据库使用了过时接口:代码基于
mysqli_*
和老旧错误处理方式,存在维护问题。
- 由于
$resp
参数我们无法控制,所以重心放在参数recaptcha_response_field、User-Agent
上。 - 修改参数,点击
Send
:显示修改成功。
以上绕过方式确实是看了 DVWA 的源码才找到的“后门绕过条件”,这在真实世界中属于**“白盒渗透”,而大多数实际攻击是“黑盒测试”**,不能看到源码,就要靠逻辑推理 + 测试来逐步发现漏洞。在真实的 Web 安全测试中,验证码绕过是一项难度较高的工作,需要你善于分析流程、测试请求逻辑、借助自动化工具,不能依赖看源码“取巧”,而是要推演漏洞逻辑 + 试错测试。
四、impossible级别源码分析
<?php// 如果点击了“Change”按钮(提交了修改密码的表单)
if (isset($_POST['Change'])) {// 1️⃣ 校验 CSRF Token,防止跨站请求伪造checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');// 表示验证码验证通过后不再显示表单(控制显示)$hide_form = true;// 2️⃣ 获取用户输入的新密码,并进行处理(去转义 + SQL安全 + 哈希)$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) : trigger_error(...)); // SQL转义,防止注入$pass_new = md5($pass_new); // 对新密码进行 MD5 加密// 3️⃣ 同样处理确认密码字段$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) : trigger_error(...));$pass_conf = md5($pass_conf);// 4️⃣ 当前密码校验处理(确保用户是本人)$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) : trigger_error(...));$pass_curr = md5($pass_curr);// 5️⃣ 验证 Google reCAPTCHA,确保用户是真人操作$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'], // 使用 DVWA 配置中的私钥$_POST['g-recaptcha-response'] // 获取用户提交的验证码响应 token);// 6️⃣ 判断验证码是否验证通过if (!$resp) {echo "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false; // 显示表单重新输入} else {// 7️⃣ 验证当前密码是否正确(从数据库中查找该用户+密码是否存在)$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();// 8️⃣ 如果新密码一致,且当前密码正确,就更新数据库密码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();echo "<pre>Password Changed.</pre>"; // 成功提示} else {echo "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}}
}// 9️⃣ 页面底部重新生成 Anti-CSRF token,用于下次提交
generateSessionToken();?>
总结:Impossible级别的安全设计
安全点 | 说明 |
---|---|
✅ CSRF 防护 | 使用 user_token 和 session 进行校验 |
✅ SQL 注入防护 | 使用 PDO 预处理语句,避免 SQL 注入 |
✅ XSS 防护 | 未涉及 DOM 输出,但数据未直接回显,隐患小 |
✅ CAPTCHA 验证 | 使用 Google reCAPTCHA,服务端校验是否通过 |
✅ 身份验证 | 验证当前密码是否正确,防止他人盗改密码 |
✅ 表单逻辑清晰 | 分支判断详细,失败时不暴露具体原因(只有简单提示) |
相关文章:
DVWA靶场保姆级通关教程--06不安全验证机制
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 原理详解 1. 前后端验证逻辑不一致 2. 验证码值保存在客户端 3. 验证码可预测或重复 4. 验证码验证与逻辑解耦 一、处理关卡报错 二、low级别源…...
【日撸 Java 三百行】Day 7(Java的数组与矩阵元素相加)
目录 Day 7:Java 的数组与矩阵元素相加 一、基本知识 二、矩阵的建立与基本计算 三、代码及测试 拓展:Arrays类详解 小结 Day 7:Java 的数组与矩阵元素相加 Task: 矩阵的赋值.二重循环. 一、基本知识 在学习 Java 中的数组与矩…...
【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 递归、搜索和回溯递归搜索VS 深度优先遍历 VS 深度优先搜索 VS 宽度优先遍历 VS 宽度优先搜索 VS 暴搜回溯与剪枝 1 面试题 08.06. 汉诺塔问题1.1 分析…...
2025最新精选5款3DMAX建筑可视化插件
在3DMAX建筑可视化领域,各类工具如同繁星般璀璨,它们为设计师们搭建起通往理想作品的桥梁。今天,就让我们一同走进几款极具特色的工具——RetailStore插件、2Dto3D插件、DrawFloorPlan插件、MaxToCAD插件以及EXR透视贴图技术,探寻…...
麒麟系统使用-个性化设置
文章目录 前言一、个性化设置-背景二、个性化设置-主题三、个性化设置-锁屏四、个性化设置-屏保五、个性化设置-字体总结 前言 与windows系统相比,麒麟系统中的个性化设置大体相似,在细节上稍有不同。本文将讲述麒麟系统中的个性化设置中的各个模块。 一…...
flask开启https服务支持
目录 一、背景 二、开启https支持 三、自签名 1、安装openssl 2、验证安装 3、自签名 四、编写代码 五、访问https接口 一、背景 最近在做自动化业务,需要兼容现在主流的框架开发的前端页面,于是到github找到了几个项目,clone下来项目并…...
CNN处理图片
In [5]: 123456789101112131415161718192021222324252627282930313233import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as np# 平滑均值滤波#KaTeX parse error: Expected EOF, got _ at position 14: \text {filter_̲{arg}np.}.full (sha…...
【Bootstrap V4系列】学习入门教程之 组件-表单(Forms)
Bootstrap V4系列 学习入门教程之 组件-表单(Forms) 表单(Forms)一、Overview二、Form controls 表单控件2.1 Sizing 尺寸2.2 Readonly 只读2.3 Readonly plain text 只读纯文本 三、Checkboxes and radios 复选框和单选框3.1 Def…...
图像来源:基于协同推理的双视角超声造影分类隐式数据增强方法|文献速递-深度学习医疗AI最新文献
Title 题目 Image by co-reasoning: A collaborative reasoning-based implicit data augmentation method for dual-view CEUS classification 图像来源:基于协同推理的双视角超声造影分类隐式数据增强方法 01 文献速递介绍 结合了B型超声(BUS&…...
MySQL性能分析工具:SHOW PROCESSLIST
概述 以下是一份详细的 MySQL SHOW PROCESSLIST 使用教程,帮助您监控和分析数据库当前活动,快速定位性能问题资料已经分类整理好,喜欢的朋友自取:https://pan.quark.cn/s/f52968c518d3 1. 命令基本作用 SHOW PROCESSLIST 显示当…...
Linux网络编程day8本地套接字
本地套接字 利用cs模型实现本地套接字完成进程间通信 对比网络编程TCP C/S模型,注意以下几点 1、int socket(int domain, int type, int protocol); domain-->AF_INET改为AF_UNIX , type都可写SOCK_STREAM/SOCK_DGRAM2、地址结构 sockaddr_in -->sockadd…...
使用 React Native实现鸿蒙开发的详细方案
一、环境准备 1. 基础环境要求 操作系统:Windows 10/11 或 macOS (建议版本最新)Node.js: v16.x 或更高版本npm: v8.x 或更高版本Java JDK: 11 或更高版本DevEco Studio: 3.1 或更高版本 (鸿蒙官方IDE)2. 安装 DevEco Studio 从华为开发者官网下载安装时选择以下组件: Harmo…...
WebRTC流媒体传输协议RTP点到点传输协议介绍,WebRTC为什么使用RTP协议传输音视频流?
通过上一章《WebRTC工作原理详细介绍、WebRTC信令交互过程和WebRTC流媒体传输协议介绍》,我们知道WEBRTC在完成 SDP 协商和 ICE 候选交换信令后,双方就可以建立 RTP 流,开始传输音视频数据,这时,RTP 数据包就通过在 IC…...
【Unity笔记】PathCreator使用教程:用PathCreator实现自定义轨迹动画与路径控制
在Unity开发过程中,角色移动、摄像机动画、轨道系统、AI巡逻等功能中,路径控制是常见又复杂的需求之一。如何优雅、高效地创建路径并控制对象沿路径运动,是游戏开发、动画制作乃至工业仿真中的关键问题。 在这篇文章中,我将介绍一…...
生产安全管理系统标杆
生产安全不容小视,防患于未然是企业安全生产的基石。好的安全预防系统能让隐患产生最初就被扼杀在摇篮里。国内一些好的生产安全防范系统也有很多,今天我们主要介绍一下众联心安这款产品。 安全生产管理,目标制度管理,风险隐患管理,应急安全管理,设备设…...
temu采购自养号全流程解析:从账号搭建到安全下单的技术闭环
temu 自养号采购下单技术是一个精细的过程,需要从多个方面进行考虑和操作,其核心在于通过技术手段模拟真实用户行为,构建独立、安全的账号环境以确保账号的安全性、真实性和采购下单的成功率。以下是对该技术的详细解析 1. 账号准备 手机号…...
MySQl 数据库操作
目录 一、MySQL 数据库介绍 二、MySQl 库操作 1. 系统数据库 2. 数据库操作 (1)创建数据库 (2)数据库命名规则 (3)选择数据库 (4)查看数据库 (5)删除…...
OpenHarmony launcher开发——删除dock栏
开发环境 OpenHarmony 5.0.0 代码修改 效果...
zst-2001 历年真题 设计模式
设计模式 - 第1题 a 设计模式 - 第2题 一个产品可以产生多个就是抽象,一个就是工厂 比如这样 第二题a是意图 bc: d 设计模式 - 第3题 b 设计模式 - 第4题 类图里全是builder,疯狂暗示 设计模式 - 第5题 aa 设计模式 - 第6题 只有工厂方法是创…...
Vue3 + Element Plus 动态表单实现
完整代码 <template><div class"dynamic-form-container"><el-formref"dynamicFormRef":model"formData":rules"formRules"label-width"auto"label-position"top"v-loading"loading"&g…...
QML AnimatedImage组件详解
目录 引言相关阅读基础知识:AnimatedImage核心属性与方法工程结构与示例展示工程结构示例1:可控制播放/暂停的AnimatedImage示例2:带进度条的AnimatedImage主界面整合(SwipeView滑动展示) 总结下载链接 引言 在UI开发…...
Ascend的aclgraph(2)_npu_backend中还有些什么秘密?
1 _npu_backend 文章还是从代码开始 import torch_npu, torchair config torchair.CompilerConfig() # 设置图下沉执行模式 config.mode "reduce-overhead" npu_backend torchair.get_npu_backend(compiler_configconfig) opt_model torch.compile(model, back…...
免布线视频桩:智慧城市停车降本增效的破局利器
在智慧城市建设的进程中,传统停车管理面临成本高、效率低、施工复杂等难题。而视频桩作为创新解决方案,以“免布线、智能化”为核心,正逐步改变这一局面。视频桩通过融合物联网与AI技术,实现自动化监测与数据实时管理,…...
Vulfocus靶场-文件上传-2
monstra 文件上传 (CVE-2020-13384) Monstra 是一个现代化的轻量级内容管理系统。它易于安装、升级和使用。 Monstra CMS 3.0.4版本中存在着一处安全漏洞,该漏洞源于程序没有正确验证文件扩展名。攻击者可以上传特殊后缀的文件执行任意PHP代…...
nvidia-smi 和 nvcc -V 作用分别是什么?
命令1:nvidia-smi 可以查看当前显卡的驱动版本,以及该驱动支持的CUDA版本。 命令2:nvcc -V 可以看到实际安装的CUDA工具包版本为 12.8 更详细的介绍,可以参考如下链接...
力扣刷题(第二十一天)
灵感来源 - 保持更新,努力学习 - python脚本学习 二叉树的最大深度 解题思路 这道题要求计算二叉树的最大深度,即从根节点到最远叶子节点的最长路径上的节点数。可以使用递归或迭代方法解决: 递归法(推荐)&#…...
AIOps 工具介绍
AIOps(智能运维)是通过人工智能技术优化IT运维流程的实践,其核心在于利用机器学习、大数据分析等技术实现运维自动化与智能化。以下从定义、核心价值、技术架构及工具等方面展开说明: 一、AIOps的定义与核心价值 AIOps࿰…...
4.3【LLaMA-Factory实战】教育大模型:个性化学习路径生成系统全解析
【LLaMA-Factory实战】教育大模型:个性化学习路径生成系统全解析 一、引言 在教育领域,传统"一刀切"的教学模式难以满足学生的个性化需求。本文基于LLaMA-Factory框架,详细介绍如何构建一个个性化学习路径生成系统,包…...
如何构建容器镜像并将其推送到极狐GitLab容器镜像库?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 构建容器镜像并将其推送到容器镜像库 (BASIC ALL) 在构建和推送容器镜像之前,您必须通过容器镜像库的身份验证。 …...
雷赛伺服L7-EC
1电子齿轮比: 电机圈脉冲1万 (pa11的值 x 4倍频) 2电机刚性: pa003 或者 0x2003 // 立即生效的 3LED显示: PA5.28 1 电机速度 4精度: PA14 //默认30,超过3圈er18…...
爬虫学习————开始
🌿自动化的思想 任何领域的发展原因————“不断追求生产方式的改革,即使得付出与耗费精力越来愈少,而收获最大化”。由此,创造出方法和设备来提升效率。 如新闻的5W原则直接让思考过程规范化、流程化。或者前端框架/后端轮子的…...
Shell 脚本编程详细指南:第五章 - 函数与参数传递
Shell 脚本编程详细指南:第五章 - 函数与参数传递 引言:函数在脚本工程化中的核心价值 函数是Shell脚本实现模块化编程的基石。本章将深入解析函数编程的各个方面,从基础定义到高级应用,助您构建可维护、可重用的脚本架构。我们…...
使用 docker 安装 nacos3.x
一、安装 nacos 1.拉取镜像 使用如下指令拉取镜像 docker pull nacos/nacos-server 拉取完成后,可以使用以下命令查看是否拉取到对应的镜像,默认拉取最新镜像 docker images 2.新建挂载文件目录 mkdir -p /home/ubuntu/nacos/conf/mkdir -p /home/…...
Docker的基础操作
docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱…...
权限控制模型全解析:RBAC、ACL、ABAC 与现代混合方案
权限控制模型全解析:RBAC、ACL、ABAC 与现代混合方案 在企业信息系统、SaaS 应用、安全平台中,权限控制模型是确保用户访问安全和功能隔离的基础架构设计之一。本文将系统性梳理常见的权限控制模型,包括 RBAC、ACL、ABAC、DAC、MAC、ReBAC 等…...
内存安全革命:工具、AI 与政策驱动的 C 语言转型之路
引言 在 CVE-2025-21298 等高危漏洞频发的背景下,内存安全已成为全球软件产业的核心议题。根据 CISA 最新数据,2024 年全球 72% 的网络攻击源于内存安全漏洞,而 C/C 代码贡献了其中 89% 的风险。这一严峻现实催生了技术革新的三重浪潮&#…...
电厂数据库未来趋势:时序数据库 + AI 驱动的自优化系统
在电力行业加速数字化与智能化转型的进程中,电厂数据库作为数据管理与应用的核心枢纽,正经历着深刻变革。时序数据库与 AI 技术的融合,正催生一种全新的自优化系统,为电厂设备全生命周期管理带来前所未有的效能提升与创新机遇。这…...
stm32 debug卡在0x1FFFxxxx
自己画的一个四轴飞机电路板,之前还能debug,改了一下mos管两端的电阻,还能正常下载,蓝牙接收也正常,但是debug出问题了,刚下载就自动运行,然后程序就在0x1FFFxxxx附近循环运行,这一块…...
什么是AI写作
一、AI写作简介 AI 写作正在成为未来 10 年最炙手可热的超级技能。已经有越来越多的人通过 AI 写作,在自媒体、公文写作、商业策划等领域实现了提效,甚至产生了变现收益。 掌握 AI 写作技能,不仅能提高个人生产力,还可能在未来的 …...
港大今年开源了哪些SLAM算法?
过去的5个月,香港大学 MaRS 实验室陆续开源了四套面向无人机的在线 SLAM 框架:**FAST-LIVO2 、Point-LIO(grid-map 分支) 、Voxel-SLAM 、Swarm-LIO2 **。这四套框架覆盖了单机三传感器融合、高带宽高速机动、长时间多级地图优化以…...
PostgreSQL 表空间占用分析与执行计划详解
PostgreSQL 表空间占用分析与执行计划详解 引言 在数据库管理和优化中,了解表占用的空间大小以及查询的执行计划是至关重要的。本文将详细介绍如何在 PostgreSQL 中查看普通表和分区表的空间占用情况,以及如何分析和解读执行计划。 一、查看表空间占用 …...
robotframe启动ride.py
我的双击ride.py会自动用pycharm打开,变成代码文件 解决方法:定位到ride.py所在文件夹(在anaconda的scripts里面),文件夹上方输入cmd 再输入该命令即可...
通过Linux系统服务管理IoTDB集群的高效方法
IoTDB是一款专为工业物联网领域设计的高性能时间序列数据库。在生产环境中,确保IoTDB集群的稳定运行至关重要。本文将介绍如何利用Linux系统服务来管理IoTDB集群,以实现高效的启动、监控和自动重启。 一、基本配置与环境需求 为了解决传统IoTDB启动方式…...
机器学习-数据集划分和特征工程
一.数据集划分 API函数: sklearn.model_selection.train_test_split(*arrays,**options) 参数: - arrays:多个数组,可以是列表,numpy数组,也可以是dataframe数据框等 - options:&…...
LDO与DCDC总结
目录 1. 工作原理 2. 性能对比 3. 选型关键因素 4. 典型应用 总结 1. 工作原理 LDO LDO通过线性调节方式实现降压,输入电压需略高于输出电压(压差通常为0.2-2V),利用内部PMOS管或PNP三极管调整压差以稳定输出电压。其结构简单…...
5 种距离算法总结!!
大家好!我是 我不是小upper~ 今天,咱们聚焦一个在机器学习领域极为关键、在实际项目中也高频使用的主题 ——距离算法。在机器学习的世界里,距离算法就像是一把 “度量尺”,专门用来衡量数据点之间的相似性或差异性。…...
【leetcode100】最长重复子数组
1、题目描述 给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1: 输入:nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出:3 解释:长度最长的公共子数组是 [3,2,1] 。示例 2&…...
独立自主的网络浏览器——Ladybird
独立自主的网络浏览器——Ladybird 随着互联网技术的飞速发展,浏览器作为人们探索网络世界的窗口,其技术创新和安全措施至关重要。然而,市场上绝大多数浏览器都是基于现有的成熟引擎进行开发,如何创新突破,成为一个独…...
强化学习三大基本方法-DP、MC、TD
强化学习进阶 本文主要讲解 动态规划法(Dynamic Programming DP)蒙特卡洛法(Monte Carlo MC)时序差分法(Temporal Difference TD) 1. 动态规划法 1.1 动态规划概念 动态规划核心思想: 其核心…...
【数据结构】1. 时间/空间复杂度
- 第 95 篇 - Date: 2025 - 05 - 09 Author: 郑龙浩/仟墨 【数据结构 】 文章目录 数据结构 - 1 -了解数据结构与算法1 什么是数据结构2 什么是算法3 数据结构的重要性? 一 时间复杂度_空间复杂度1 时间复杂度① 表示方法② 推导大 O 的规则:③ **代码示例 ** 2 空…...