DVWA靶场第三关 CSRF
CSRF的中文叫:”跨站请求攻击“,它是通过仿照某一个特殊的网页(重置密码)来进行诱惑性攻击。
难度(low级)
审计代码:
<?phpif( isset( $_GET[ 'Change' ] ) ) {// Get input$pass_new = $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// Do the passwords match?if( $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)) ? "" : ""));$pass_new = md5( $pass_new );// Update the database$current_user = dvwaCurrentUser();$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";$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>' );// Feedback for the userecho "<pre>Password Changed.</pre>";}else {// Issue with passwords matchingecho "<pre>Passwords did not match.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
G L O B A L S :引用全局作用域中可用的全部变量。 GLOBALS :引用全局作用域中可用的全部变量。 GLOBALS:引用全局作用域中可用的全部变量。GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
从源代码可以看出这里只是对用户输入的两个密码进行判断,看是否相等。不相等就提示密码不匹配。
相等的话,查看有没有设置数据库连接的全局变量和其是否为一个对象。如果是的话,用mysqli_real_escape_string()函数去转义一些字符,如果不是的话输出错误。
是同一个对象的话,再用md5进行加密,再更新数据库。
知道了这些之后,我们第一次尝试两次密码不一致看看。
两次密码不一致则提示,密码不一致不允许修改,并且我们在链接上可以看到修改的明文密码,那我们思考一个问题能不能用这个链接直接改密码呢?
密码链接:
http://172.31.63.146/DVWA/vulnerabilities/csrf/?
漏洞利用:
我们打开另一个页面,在顶部URL中自己输入如下的payload。
password_new=123456&password_conf=789456&Change=Change#
在浏览器中点开链接,提示密码修改成功。
低难度则证明咱们可以利用这个链接任意的修改密码了,实质上这里就存在csrf漏洞我们伪造了修改密码的链接,从而实现了任意密码修改。
难度(Medium)
审计代码
<?phpif( isset( $_GET[ 'Change' ] ) ) {// Checks to see where the request came fromif( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {// Get input$pass_new = $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// Do the passwords match?if( $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)) ? "" : ""));$pass_new = md5( $pass_new );// Update the database$current_user = dvwaCurrentUser();$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";$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>' );// Feedback for the userecho "<pre>Password Changed.</pre>";}else {// Issue with passwords matchingecho "<pre>Passwords did not match.</pre>";}}else {// Didn't come from a trusted sourceecho "<pre>That request didn't look correct.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
Medium类型的代码在Low级别的基础上,加上了对用户请求头的中的Referer字段进行验证。
if( stripos( S E R V E R [ ′ H T T P R E F E R E R ′ ] , _SERVER[ 'HTTP_REFERER' ] , SERVER[′HTTPREFERER′],_SERVER[ ‘SERVER_NAME’ ]) !== false )
即用户的请求头中的Referer字段必须包含了服务器的名字。关于Http Referer字段。
当我们再打开另一个页面,在顶部URL中自己输入如下的时,http://172.31.63.146/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
它会报错,提示你:That request didn’t look correct。
我们使用burpsuite抓包分析一下:
在界面上可以修改成功,Referer字段限制从从哪里访问的来源。
Referer: http://172.31.63.146/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
提示修改成功:
password changed
我们任意浏览器打开链接没有Referer字段则显示修改失败:
That request didn’t look correct。
漏洞利用:
那么我思考一下在这个数据包上面伪造一个Referer头能不能利用成功呢?
把上述数据包发送到Repeater上加入。
Referer: http://172.20.10.2/dvwa/vulnerabilities/csrf/
提示密码修改成功,这表示我们能够通过伪造Referer头来实现跨站请求伪造,达到我们修改密码的目的。
难度(High)
源码解析
<?php$change = false;
$request_type = "html";
$return_message = "Request Failed";if ($_SERVER['REQUEST_METHOD'] == "POST" && array_key_exists ("CONTENT_TYPE", $_SERVER) && $_SERVER['CONTENT_TYPE'] == "application/json") {$data = json_decode(file_get_contents('php://input'), true);$request_type = "json";if (array_key_exists("HTTP_USER_TOKEN", $_SERVER) &&array_key_exists("password_new", $data) &&array_key_exists("password_conf", $data) &&array_key_exists("Change", $data)) {$token = $_SERVER['HTTP_USER_TOKEN'];$pass_new = $data["password_new"];$pass_conf = $data["password_conf"];$change = true;}
} else {if (array_key_exists("user_token", $_REQUEST) &&array_key_exists("password_new", $_REQUEST) &&array_key_exists("password_conf", $_REQUEST) &&array_key_exists("Change", $_REQUEST)) {$token = $_REQUEST["user_token"];$pass_new = $_REQUEST["password_new"];$pass_conf = $_REQUEST["password_conf"];$change = true;}
}if ($change) {// Check Anti-CSRF tokencheckToken( $token, $_SESSION[ 'session_token' ], 'index.php' );// Do the passwords match?if( $pass_new == $pass_conf ) {// They do!$pass_new = mysqli_real_escape_string ($GLOBALS["___mysqli_ston"], $pass_new);$pass_new = md5( $pass_new );// Update the database$current_user = dvwaCurrentUser();$insert = "UPDATE `users` SET password = '" . $pass_new . "' WHERE user = '" . $current_user . "';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert );// Feedback for the user$return_message = "Password Changed.";}else {// Issue with passwords matching$return_message = "Passwords did not match.";}mysqli_close($GLOBALS["___mysqli_ston"]);if ($request_type == "json") {generateSessionToken();
High级别的代码增加了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端请求
因为该请求是get请求,所以token验证会被放在请求URL中,我们随便输入密码验证一下,可以看到,在请求的URL中最末尾加入了token。
http://172.31.63.146/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change&user_token=86c02ef72eb549a0f63d81d9e19784b2#
漏洞利用:
要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie,去修改密码的页面,获取关键的token。
可以利用High级别的XSS漏洞协助获取Anti-CSRF token。
XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRF token即可。
在XSS中使用以下payload获取Token。
 将Token复制到修改密码的数据包中发现,完成修改。 最后尝试登录一次成功
难度(Impossible)
源码分析
<?phpif( isset( $_GET[ 'Change' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// 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)) ? "" : ""));$pass_curr = md5( $pass_curr );// Check that the current password is correct$data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );$current_user = dvwaCurrentUser();$data->bindParam( ':user', $current_user, 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)) ? "" : ""));$pass_new = md5( $pass_new );// Update database with new password$data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );$data->bindParam( ':password', $pass_new, PDO::PARAM_STR );$current_user = dvwaCurrentUser();$data->bindParam( ':user', $current_user, 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 攻击的。
相关文章:
DVWA靶场第三关 CSRF
CSRF的中文叫:”跨站请求攻击“,它是通过仿照某一个特殊的网页(重置密码)来进行诱惑性攻击。 难度(low级) 审计代码: <?phpif( isset( $_GET[ Change ] ) ) {// Get input$pass_new $_GE…...
工作流审批功能的一些概念
1. 引言 在当今数字化时代,企业与组织的运营效率在很大程度上依赖于高效、精准的工作流审批系统。随着业务日益复杂且多样化,审批流程变得愈加细致和灵活。一个完善的工作流审批系统不仅能确保任务在组织内部有序流转、协调各方资源,还能实现…...
深度学习与图像处理(国产深度学习框架——飞桨官方指定教材)
计算机视觉从小白到大师之路 《深度学习与图像处理(PaddlePaddle版)》这一本就够了 1.引言 随着人工智能技术的飞速发展,各行各业对深度学习、图像处理相关领域的人才需求日益迫切。本书旨在通过系统的理论讲解与丰富的实战案例࿰…...
音视频入门知识(二)、图像篇
⭐二、图像篇 视频基本要素:宽、高、帧率、编码方式、码率、分辨率 其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV(原始数据&am…...
计算机网络——期末复习(3)4-6章考试重点
第四章 根据IPv4第1个十进制数值判断,127以下为A类,128~191为B类,192~223为C类不能分配给主机或路由器接口的:A类网络号0和127,主机号全为0或全为1私有地址(Private IP Address)是指一类专门保…...
openfeign自动将Boolean默认为false
最近发现项目服务间,通过openfeign调用API时,为null的Boolean类型,接收端反系列化后变为false了,经查发现是通用组件中做了处理,特记录下。 主要是设置了这个 SerializerFeature.WriteNullBooleanAsFalse Bean Cond…...
如何实现底部导航栏
文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了TextField Widget,本章回中将介绍BottomNavigationBar Widget。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中将介绍一个新的Widget:BottomNavigationBar,它就是我们经常在App中看到了底部…...
【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。
【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。 文章目录 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。1. 错…...
org.apache.zookeeper.server.quorum.QuorumPeerMain
QuorumPeerMain源代码 package org.apache.zookeeper.server.quorum;import java.io.IOException; import javax.management.JMException; import javax.security.sasl.SaslException; import org.apache.yetus.audience.InterfaceAudience; import org.apache.zookeeper.audi…...
如何在yolov8中使用ATSS策略
在yolov8中使用的标签匹配策略是TAL,本篇文章解析一下ATSS代码相关实现以及如何把ATSS放到yolov8中使用 看过本专栏中的另外两篇文章的同学应该对v8解析box那一套很熟悉了,ATSS的第一步就是去得到一系列的anchor-box(如果是anchor-based检测方法)或者anchor-point(基…...
常见的邮件协议SMTP和POP3
常见的邮件协议包括SMTP和POP3,SMTP用来发送邮件,POP3用来接收邮件信息。 SMTP SMTP 是一种用于发送电子邮件的协议。它的主要作用是将**电子邮件**从邮件客户端(如 Outlook、Thunderbird)或邮件服务器发送到接收服务器。 SMTP …...
线性代数行列式
目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得:分…...
cin/cout性能问题讨论和优化⽅法
样例解析: 在上面的两个案例中,我们发现虽然代码的逻辑是相同的,唯一的不同点在于scanf和cout的使用区别,一份超时一份ac,这是为什么呢?是否有可行的优化方法呢? 背景知识: 在 C 中…...
轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片
轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片 数据集分割 训练组90% 706图片 有效集6% 46图片 测试集4% 33图片 预处理…...
ARM64 Windows 10 IoT工控主板运行x86程序效率测试
ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序,而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400,可预装正版Windows 10 IoT企业版操作系统,x86程序可无需修改而直接在ESM84…...
Git核心概念
版本控制 什么是版本控制 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 除了项目源代码,你可以对任何类型的文件进行版本控制。 为什么要版本控制 有了它你就可以将某个文件回溯到之前的状态,甚至将整…...
Spring Boot spring.factories文件详细说明
优质博文:IT-BLOG-CN 前言:经常看到 spring.factories 文件,却没有对它进行深入的了解和分析,今天我们就一起揭开面纱看看它的内在。 spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boo…...
QWidget应用封装为qt插件,供其他qt应用调用
在之前的文章中,有介绍通过QProcess的方式启动QWidget应用,然后将其窗口嵌入到其他的qt应用中,作为子窗口使用.这篇文章主要介绍qt插件的方式将QWidget应用的窗口封装为插件,然后作为其他Qt应用中的子窗口使用. 插件优点: 与主程序为同一个进程,免去了进程间繁琐的通信方式,…...
Nginx的性能分析与调优简介
Nginx的性能分析与调优简介 一、Nginx的用途二、Nginx负载均衡策略介绍与调优三、其他调优方式简介四、Nginx的性能监控 一、Nginx的用途 Nginx是一种高性能的HTTP和反向代理服务器,最初作为HTTP服务器开发,主要用于服务静态内容如HTML文件、图像、视…...
学习threejs,导入CTM格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ColladaLoader DAE模…...
Lua元表
哈喽,好久没有做记录了,最近刚好有时间打算整理一些基础常用内容,先做一期关于Lua相关的内容热热身。如果内容有误,欢迎大家指出我会积极做出响应。 在Lua中,元表(metatable) 和 元方法…...
pyqt和pycharm环境搭建
安装 python安装: https://www.python.org/downloads/release/python-3913/ python3.9.13 64位(记得勾选Path环境变量) pycharm安装: https://www.jetbrains.com/pycharm/download/?sectionwindows community免费版 换源: pip config se…...
overleaf中的includegraphics设置图片缩放,居中显示
overleaf中的includegraphics设置图片缩放,居中显示 \includegraphics[width=0.5\textwidth]{example.jpg} \centering 在使用 \includegraphics 命令插入图片时,可以通过设置其参数来缩小图片的显示尺寸,以下是几种常见的方法: 设置宽度或高度 按比例缩小宽度:可以使用…...
USB免驱IC读写器QT小程序开发
USB免驱全协议IC卡读写器QT小程序开发,读取15693卡。 QT小程序UI开发界面: QT程序代码mainWindow.cpp代码如下: MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWind…...
Wend看源码-Java-集合学习(List)
摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构:List、Set和Queue。本文将详细阐述这些数据类型的各自实现,并按照线程安全性进行分类,分别介绍非线程安全与线程安全的实现方…...
只谈C++11新特性 - 删除函数
删除函数 背景 在 C11 之前,C 的类默认会生成拷贝构造函数和赋值运算符。这在某些情况下会引发问题,尤其是在我们希望明确禁止某些操作时。假设我们有一个类,它不希望被拷贝,但未明确声明拷贝构造函数和赋值运算符,这…...
uniapp 文本转语音
uniapp 文本转语音 基于 Minimax API 的 UniApp 文本转语音工具,支持文本分段、队列播放、暂停恢复等功能。目前只内置了 Minimax文本转语音Minimax 的语音生成技术以其自然、情感丰富和实时性强而著称 API_KEY、GroupId 获取方法 https://platform.minimaxi.com…...
1.RPC基本原理
文章目录 RPC1.定义2.概念3.优缺点4.RPC结构5.RPC消息协议5.1 消息边界5.2 内容5.3 压缩 6.RPC的实现6.1 divide_protocol.py6.2 server.py6.3 client.py RPC 1.定义 远程过程调用(remote procedure call) 2.概念 广义:所有通过网络进行通讯,的调用统称为RPC调用 狭义:不采…...
如何从 0 到 1 ,打造全新一代分布式数据架构
导读:本文从 DIKW(数据、信息、知识、智慧) 模型视角出发,探讨数字世界中数据的重要性问题。接着站在业务视角,讨论了在不断满足业务诉求(特别是 AI 需求)的过程中,数据系统是如何一…...
PyPika:Python SQL 查询构建器
什么是 PyPika? Pypika 是一个 Python 库,用于构建 SQL 查询。它提供了一种简洁、直观的方式来生成 SQL 语句,而无需手动编写复杂的 SQL 代码。Pypika 的设计哲学是尽可能地接近 SQL 的自然语法,同时利用 Python 的强大功能来简化…...
剑指Offer|LCR 014. 字符串的排列
LCR 014. 字符串的排列 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。 换句话说,第一个字符串的排列之一是第二个字符串的 子串 。 示例 1: 输入: s1 "ab" s2 "eidbaooo" 输出: True 解…...
通过百度api处理交通数据
通过百度api处理交通数据 1、读取excel获取道路数据 //道路名称Data EqualsAndHashCode public class RoadName {ExcelProperty("Name")private String name; }/*** 获取excel中的道路名称*/private static List<String> getRoadName() {// 定义文件路径&…...
使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器实现可迭代式数据集
2023 年 11 月,Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元(数据集和数据加载器)的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…...
c++编译过程初识
编译过程 预处理:主要是执行一些预处理指令,主要是#开头的代码,如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码,具体包括查找头文件、进行宏替换、根据条件编译等操作。 g -E example.cpp -…...
Java旅程(五)Spring 框架与微服务架构 了解 JVM 内部原理和调优
在现代企业级应用中,Spring 框架和微服务架构已经成为主流技术,而 Java 虚拟机(JVM)的理解和调优对于保证应用的高性能和稳定性也至关重要。本篇博客将深入讲解 Spring 框架与微服务架构,并进一步探讨 JVM 内部原理和调…...
SWAT-MODFLOW地表水-地下水耦合模型建模;QSWATMOD实现SWAT-MODFLOW联合
SWAT-MODFLOW地表水-地下水耦合建模的应用重要性: 1.全面性:耦合模型能够同时考虑地表水和地下水的相互作用,提供了一个更全面的水文循环模拟框架。2.准确性:通过耦合地表水和地下水模型,可以提高水文模拟的准确性&…...
Azure Function 解决跨域问题
这边前端call本地部署的azure function出现了跨域问题,搜索一下解决方案 直接修改local.setting.json,在其中添加CORS配置为通配符”*”,就行了 local.settings.json {"IsEncrypted": false,"Values": {"PYTHON_E…...
金融租赁系统的创新发展与市场竞争力提升探讨
内容概要 随着经济的快速发展,金融租赁系统逐渐成为金融市场中不可或缺的一环。它不仅提供了灵活的资金解决方案,还促进了企业的资本结构优化与资源配置效率。因此,了解该系统的市场背景与发展现状至关重要。 在现今环境下,新兴…...
Rust: offset祼指针操作
offset是偏移元素个数,不是字节数! fn main(){let student_a Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};let student_b Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};let …...
【C#】WPF设置Separator为垂直方向
1. 方法1 <Separator BorderBrush"Gray"><Separator.LayoutTransform><RotateTransform Angle"90" /></Separator.LayoutTransform> </Separator>2. 方法2 <Separator Style"{StaticResource {x:Static ToolBar.S…...
常见的限流算法
常见的限流算法 限流的定义固定窗口算法滑动窗口算法漏桶算法(推荐)令牌桶算法(推荐)限流粒度本地限流(单机限流)分布式限流(多机限流)分布式限流的实现 限流的定义 限流,也称流量控制。是指系统…...
图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档
1、第一种情况-无数据库表,但有数据模型 1.1 使用PowerDesigner已完成数据建模 您已经使用PowerDesigner完成数据库建模,如下图: 1.2 Report配置和导出 1、点击:Report->Reports,如下图: 2、点击&…...
7-7 旅行售货员
目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 详细代码: 题目描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路…...
QT写的动态正弦曲线图显示并打印
创建一个显示正弦曲线的 QChartView,并通过定时器不断更新图表数据,模拟动态数据。此外,还包含了一个在特定时间自动将图表导出为 PDF 文件的功能。 代码分析和注释 #include <QApplication> #include <QMainWindow> #include &…...
AI开发:决策树模型概述与实现:从训练到评估和可视化 - Python
通过前面的一些练习,我们已经学习了支持向量机、 回归、 鸢尾花模型 、卷积、 知识图谱、 生成式对抗网络、 K近邻、 等AI算法的基本概念,熟悉了一些常用的AI库,并且使用PYTHON大法进行了一些实战练习。接下来,我们向更深一层的概…...
MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?
MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的?性能分析 为什么 MySQL 表不能太大网上大部分人的说法:问题的关键: B树层数对查询性能的影响到底有多大? 是什么导致的 MySQL 查询缓慢?如何解决: MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的? 一个全表扫描的查询…...
Vue中接入萤石等直播视频(更新中ing)
一、萤石: 1. 萤石云开发文档: https://open.ys7.com/help/31 2、安装: npm install ezuikit-js --save 3、在文件中引用:import EZUIKit from ezuikit-js 4、具体代码: 获取accessToken:https://open.…...
25 go语言(golang) - 内存分配机制原理
Go 语言的内存分配机制是一个复杂且高效的系统,旨在为程序提供快速和安全的内存管理。理解 Go 的内存分配有助于编写更高效的代码,并优化程序性能。 一、内存区域 栈(Stack) 栈用于函数调用时的临时变量分配。栈上的内存在函数返…...
【Linux命令】ps -a 和 ps -ef 的区别
ps -a 和 ps -ef 是 ps(process status)命令的不同选项,它们用于显示不同的进程信息。以下是这两个选项的主要区别: ps -a -a 选项表示显示所有拥有终端的进程,但不包括守护进程(daemon processes&#x…...
几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks
几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html...