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

SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件

文章目录

  • 1.前置环境搭建
  • 2.测试SNI生效条件(时间)
  • 3. 证书对SNI的影响
    • 3.1 双方使用同一个证书:
    • 3.2 双方使用不同的证书与私钥
  • 4. 端口号区分测试
    • 4.1 端口号区分,证书区分:
    • 4.2 端口号区分,证书不区分:
  • 5.总结SNI运行机制
  • 6. SNI机制绕过host头探究
    • 6.1 端口相同的SSL虚拟主机
    • 6.2 端口不同的SSL虚拟主机
    • 6.3 小结

在先前的文章中,我们通过一些列分析,在一个LNMP架构下的站群系统中挖掘出了基于host字段进行注入的SQL注入漏洞。在解决HOST绕过问题时,我们给出了三种解决方案。冒号分割、双写host字段、利用SNI机制。

经过测试,冒号分割是可行的,双写host字段被高版本的nginx返回了400,无法使用。最后一个则是SNI机制。

SNI(Server Name Indication)定义在RFC 4366,是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。

我们知道证书机制是为了加密通信流量,防止第三方窃听而存在的。而同一台主机配置多个网站时,会用到虚拟主机技术,每一个网站对应的证书也是不一样的。那么在用户与服务器第一次建立连接时,将使用哪一个证书进行通信呢?最初就是用的默认证书,而之后为了适应这样的需求,RFC推出了SNI机制,在TLS协议初期,即客户端发送自己的client hello报文时,就将host字段加入进去,以供服务器区分目的网站。选到对应的证书。

随后,证书就为客户端和服务器加密了通信内容,也就是说。后续的通信一旦发现是用某一个证书解密的。不需要再做判断,可以直接将数据报文交给对应的网站即可。也就是在建立了稳定的https通信之后,服务器中间件将不需要对host头进行解析,直接通过证书实现定向解析。

那么,我们会产生一系列思考。

第一:SNI机制会一直触发吗? 单https虚拟主机 —>多https虚拟主机

第二:控制证书为变量,测试证书对于流量解析的影响?—>证明是用证书私钥做流量区分的

第三:控制端口号为变量,测试端口号对于流量解析的影响?

1.前置环境搭建

既然如此我们就需要准备两套完整的nginx解析https虚拟主机进行测试。以及个服务器证书与私钥。

#1.双证书准备
#1.创建证书目录
[root@blackstone nginx]# mkdir certificate
[root@blackstone nginx]# cd certificate/#2.生成私钥 - 要求你输入这个key文件的密码。给nginx使用。每次reload nginx配置时候都要验证这个PAM密码。
openssl genrsa -des3 -out ssl.key 4096
openssl genrsa -des3 -out sslb.key 4096
#3.生成CA证书文件 -- 此处为了区分证书,我们只好开两份CA证书相当于两个机构的认证
openssl req -new -key ssl.key -out aaa.csr
openssl req -new -key sslb.key -out bbb.csr#4.利用CA证书签名生成服务器身份证书 - 证书签发有效期365天
openssl x509 -req -days 365 -in aaa.csr -signkey ssl.key -out aaa.crt
openssl x509 -req -days 365 -in bbb.csr -signkey sslb.key -out bbb.crt
#5.检查生成情况 - 此时包含我们自己的私钥,自己的证书.crt文件,以及csrCA证书
[root@blackstone certificate]# ll
total 32
-rw-r--r-- 1 root root 1895 Feb 10 23:34 aaa.crt
-rw-r--r-- 1 root root 1724 Feb 10 23:32 aaa.csr
-rw-r--r-- 1 root root 1907 Feb 11 00:52 bbb.crt
-rw-r--r-- 1 root root 1728 Feb 11 00:51 bbb.csr
-rw-r--r-- 1 root root 3311 Feb 11 00:50 sslb.key
-rw-r--r-- 1 root root 3311 Jan 11 21:24 ssl.key

网页部署

[root@blackstone www]# mkdir -p /var/www/aaa
[root@blackstone www]# mkdir -p /var/www/bbb
[root@blackstone www]# echo 'this is aaa.com' > /var/www/aaa/index.html
[root@blackstone www]# echo 'this is bbb.com' > /var/www/bbb/index.html

记得修改本机的host文件:C:\Windows\System32\drivers\etc

192.168.2.169 www.bbb.com 
192.168.2.169 www.aaa.com

2.测试SNI生效条件(时间)

1.单个https虚拟主机

 server {listen       443 ssl;server_name  www.aaa.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/aaa;index  index.html index.htm;}}

重启nginx,使用浏览器访问,进行抓包分析。

#后面的所有重启都建议直接把nginx关闭,彻底重启
[root@blackstone www]# /usr/local/nginx/sbin/nginx -s quit
Enter PEM pass phrase:
[root@blackstone www]# /usr/local/nginx/sbin/nginx
Enter PEM pass phrase:

可以看到,确实在client hello报文内部,有这个主机名被发送给服务器了。
在这里插入图片描述
故,发送主机名是高版本浏览器的自发行为,不需要任何激发条件。浏览器会主动发送server name 以支持SNI机制。即SNI机制无需配置,只要服务器支持,就可以使用。

3. 证书对SNI的影响

3.1 双方使用同一个证书:

    server {listen       443 ssl;server_name  www.aaa.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/aaa;index  index.html index.htm;}}server {listen       443 ssl;server_name  www.bbb.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/bbb;index  index.html index.htm;}}

测试访问情况:

在这里插入图片描述
在这里插入图片描述
可以实现分流。

3.2 双方使用不同的证书与私钥

这时,我们尝试进行证书与私钥的区分配置:

server {listen       443 ssl;server_name  www.aaa.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/aaa;index  index.html index.htm;}}server {listen       443 ssl;server_name  www.bbb.com;ssl_certificate      /usr/local/nginx/certificate/bbb.crt;ssl_certificate_key  /usr/local/nginx/certificate/sslb.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/bbb;index  index.html index.htm;}}

再次测试访问效果:

[root@blackstone certificate]# /usr/local/nginx/sbin/nginx -s reload
Enter PEM pass phrase:
Enter PEM pass phrase:

在这里插入图片描述
在这里插入图片描述
各自可以收到各自的证书,建立各自的通信。

4. 端口号区分测试

4.1 端口号区分,证书区分:

server {listen       8443 ssl;server_name  www.bbb.com;ssl_certificate      /usr/local/nginx/certificate/bbb.crt;ssl_certificate_key  /usr/local/nginx/certificate/sslb.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/bbb;index  index.html index.htm;}}server {listen       8444 ssl;server_name  www.aaa.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/aaa;index  index.html index.htm;}

测试效果:

[root@blackstone certificate]# vim ../conf/nginx.conf
[root@blackstone certificate]# /usr/local/nginx/sbin/nginx -s reload
Enter PEM pass phrase:
Enter PEM pass phrase:

在这里插入图片描述

在这里插入图片描述
可以看到,证书已经分别发送给了两个虚拟主机客户端。实现流量区分

4.2 端口号区分,证书不区分:

server {listen       8443 ssl;server_name  www.bbb.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/bbb;index  index.html index.htm;}}server {listen       8444 ssl;server_name  www.aaa.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/aaa;index  index.html index.htm;}

中途效果不明显大家可以重启nginx服务,因为服务一直开着可能会有缓存文件。

[root@blackstone nginx]# /usr/local/nginx/sbin/nginx -s quit
Enter PEM pass phrase:
Enter PEM pass phrase:
[root@blackstone nginx]# /usr/local/nginx/sbin/nginx
Enter PEM pass phrase:
Enter PEM pass phrase:

再次测试查看效果:

在这里插入图片描述
在这里插入图片描述
服务端两次传递同一个证书,实现通信。实现完整的虚拟主机分流访问。

5.总结SNI运行机制

通过以上种种测试,我们发现,无论使相同端口号,证书不同。达到证书区分传递的效果。还是证书不同,端口号也不同实现测试环境下的虚拟主机配置。SNI始终都可以准确的找到目标主机,即使是在我们的证书相同的情况下。

其实这一点也不费解,我们回顾一下之前学过的TSL通信过程:

第一次握手:客户端发送协议版本号,随机数,支持套件
第二次握手:服务端发送随机数,版本号,确认支持套件。同时发送服务端证书表明自己的身份(相当于发了个身份证过去)。
第三次握手:客户端收到证书,进行身份验证,验证完毕后利用从证书内部取出的公钥加密传输一串新的随机数pre_master给服务端。此时,客户端,服务端都共享了三个随机数,客户端随机数、服务端随机数、pre_master。于是根据三个随机数双方可以计算出共同的加密对称密钥进行通信。生成完会话密钥后,客户端发一个「Change Cipher Spec」,告诉服务端开始使用加密方式发送消息。再发一个「Encrypted Handshake Message(Finishd)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信是否可用和之前握手信息是否有被中途篡改过。
第四次握手:服务器也是同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。
最后就是用会话密钥进行双方的通信

也就是说,客户端服务器通信过程中的密钥是新协商出来的。具有唯一标识性的这样一个密钥。那么通过SNI机制在第一次客户端发送client hello包时就发送的server name 确定到底访问的哪一个虚拟主机。后面的通信,自然可以通过解密密钥寻找到对应的虚拟主机。以此完成完整的SNI机制。

实现了可以为不同的虚拟主机配置这个不同的服务器证书。

6. SNI机制绕过host头探究

这样一个绕过出现的环境就很明显了,必须是配置了SSL的nginx服务器。

之前有同学提出过疑问,认为仅仅配置一个443端口的虚拟SSL主机。难以区分到底是由于我们的请求被转移到了默认的443端口处理虚拟主机上,还是说我们成功绕过了这样一个检测机制呢?接着3.2的环境,我们对其进行进一步的测试:

6.1 端口相同的SSL虚拟主机

#注意那个server在上面,在配置文件里就默认的是默认虚拟主机server {listen       443 ssl;server_name  www.bbb.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/bbb;index  index.html index.htm;}}server {listen       443 ssl;server_name  www.aaa.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/aaa;index  index.html index.htm;}}

在这里插入图片描述
相同端口号,不同的证书条件下,修改了host文件后跳转到了默认的bbb.com虚拟主机上。绕过失效

6.2 端口不同的SSL虚拟主机

 server {listen       443 ssl;server_name  www.bbb.com;ssl_certificate      /usr/local/nginx/certificate/bbb.crt;ssl_certificate_key  /usr/local/nginx/certificate/sslb.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/bbb;index  index.html index.htm;}}server {listen       8443 ssl;server_name  www.aaa.com;ssl_certificate      /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key  /usr/local/nginx/certificate/ssl.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root   /var/www/aaa;index  index.html index.htm;}}

访问效果:
在这里插入图片描述
在这里插入图片描述
再次进行测试:
在这里插入图片描述
这次没有在跳默认了,说明可行。

6.3 小结

SNI绕过host生效的条件其实就是单一端口下仅仅绑定一台SSL虚拟主机。因为我们在6.1中看到,端口相同时同一服务器绑定多台SSL主机时,所有的请求会交给默认页面。如果漏洞点在默认页面就好说,如果不在。就无法使用SNI进行绕过了。

但同时,如果服务器是单一的配置了一个443端口的ssl虚拟主机,那么将可以进行SNI机制的HOST头绕过。

相关文章:

SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件

文章目录1.前置环境搭建2.测试SNI生效条件(时间)3. 证书对SNI的影响3.1 双方使用同一个证书:3.2 双方使用不同的证书与私钥4. 端口号区分测试4.1 端口号区分,证书区分:4.2 端口号区分,证书不区分:5.总结SNI运行机制6. SNI机制绕过…...

傻白探索Chiplet,Modular Routing Design for Chiplet-based Systems(十一)

阅读了Modular Routing Design for Chiplet-based Systems这篇论文,是关于多chiplet通信的,个人感觉核心贡献在于实现了 deadlock-freedom in multi-chiplet system,而不仅仅是考虑单个intra-chiplet的局部NoC可以通信,具体的一些…...

C语言静态库、动态库的封装和注意事项

1、动态库、静态库介绍 参考博客:《静态库和动态库介绍以及Makefile》; 2、代码目录结构和编译脚本 参考博客:《实际工作开发中C语言工程的目录结构分析》; 3、编写库的流程 (1)明确需求:需求是否合理、需求的使用场景、需求可能遇…...

MyBatis-Plus分页插件和MyBatisX插件

MyBatis-Plus分页插件和MyBatisX插件六、插件1、分页插件a>添加配置类b>测试八、代码生成器1、引入依赖2、快速生成十、MyBatisX插件1、新建spring boot工程a>引入依赖b>配置application.ymlc>连接MySQL数据库d>MybatisX逆向生成2、MyBatisX快速生成CRUD申明…...

年前无情被裁,面试大厂的这几个月…

2月份了,金三银四也即将来临,在这个招聘季,大厂也开始招人,但还是有很多人吐槽说投了很多简历,却迟迟没有回复… 另一面企业招人真的变得容易了吗?有企业HR吐槽,简历确实比以前多了好几倍&…...

基于Java的分片上传功能

起因:最近在工作中接到了一个大文件上传下载的需求,要求将文件上传到share盘中,下载的时候根据前端传的不同条件对单个或多个文件进行打包并设置目录下载。 一开始我想着就还是用老办法直接file.transferTo(newFile)就算是大文件&#xff0c…...

KDS安装步骤

KDS kinetis design studio 软件 第一步官网(https://www.nxp.com/ 注册账号下载set成功下载软件。 随着AI,大数据这些技术的快速发展,与此有关的知识也普及开来。如何在众多网站中寻找最有价值的信息,如何在最短的时间内获得最新的技…...

JavaSE-线程池(1)- 线程池概念

JavaSE-线程池(1)- 线程池概念 前提 使用多线程可以并发处理任务,提高程序执行效率。但同时创建和销毁线程会消耗操作系统资源,虽然java 使用线程的方式有多种,但是在实际使用过程中并不建议使用 new Thread 的方式手…...

开源代码的寿命为何只有1年?

说实话,如果古希腊的西西弗斯是一个在2016年编写开源代码的开发者,那他会有宾至如归的感觉。著名的西西弗斯处罚,是神话流传下来的,他被迫推一块巨大的石头上山,当登顶之后,只能眼睁睁看着它滚下去&#xf…...

完善登录功能--过滤器的使用

系列文章目录 Spring Boot读取配置文件内容的三种方式 Spring Boot自动配置–如何切换内置Web服务器 SpringBoot项目部署 上述为该系列部分文章,想了解更多可看我博客主页哦! 文章目录系列文章目录前言一、创建自定义过滤器LoginCheckFilter二、在启动类…...

CSS基础:属性和关系选择器

字体属性 color 文本颜色 div{ color:red;} div{ color:#ff0000;} div{ color:rgb(255,0,0);} div{ color:rgba(255,0,0,.5);}font-size 文本大小 h1 {font-size:40px;} h2 {font-size:30px;} p {font-size:14px;}注意:chrome浏览器接受最小字体是12px font-we…...

设计模式:原型模式解决对象创建成本大问题

一、问题场景 现在有一只猫tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom猫属性完全相同的10只猫。 二、传统解决方案 public class Cat {private String name;private int age;private String color;…...

驱动开发(二)

一、驱动流程 驱动需要以下几个步骤才能完成对硬件的访问和操作&#xff1a; 模块加载函数 module_init注册主次设备号 <应用程序通过设备号找到设备>驱动设备文件 <应用程序访问驱动的方式> 1、手动创建 &#xff08;mknod&#xff09;2、程序自动创建file_oper…...

《狂飙》大结局,这22句经典台词值得细品

最近爆火的热播剧《狂飙》大家都看了吗&#xff1f; 剧情紧凑、演技炸裂、豆瓣评分9.0&#xff0c;可以说是开年评分最高的一部国产剧。 ​ 虽然大结局了。 里面有很多经典台词&#xff0c;值得每个人细细品味。 01 这世界不缺梦想 有本事你就去实现它 02 你这么善良 怎么跟坏…...

【计算机网络期末复习】第二章 物理层

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为想复习学校计算机网络课程的同学提供重点大纲&#xff0c;帮助大家渡过期末考~ &#x1f4da;专栏地址&#xff1a; ❤️如果有收获的话&#xff0c;欢迎点…...

多核异构核间通信-mailbox/RPMsg 介绍及实验

1. 多核异构核间通信 由于MP157是一款多核异构的芯片&#xff0c;其中既包含的高性能的A7核及实时性强的M4内核&#xff0c;那么这两种处理器在工作时&#xff0c;怎么互相协调配合呢&#xff1f; 这就涉及到了核间通信的概念了。 IPCC (inter-processor communication contr…...

【Rust日报】2023-02-11 从头开始构建云数据库 RisingWave - 为什么我们从 C++ 转向 Rust...

GTK4发布v0.60gtk4-rs代码库包含GTK4的Rust crates。还有个庞大的GObject库生态系统&#xff0c;其中许多库基于gtk-rs中包含的Rust绑定工具。 特别是&#xff1a;gtk-rs-core&#xff0c;一些核心库的绑定&#xff0c;例如 glib、gio、pango、graphenegstreamer-rs&#xff0c…...

Linux驱动开发(一)

linux驱动学习记录 一、背景 在开始学习我的linux驱动之旅之前&#xff0c;先提一下题外话&#xff0c;我是一个c语言应用层开发工作人员&#xff0c;在工作当中往往会和硬件直接进行数据的交互&#xff0c;往往遇到数据不通的情况&#xff0c;常常难以定位&#xff0c;而恰巧…...

Spring MVC 之返回数据(静态页面、非静态页面、JSON对象、请求转发与请求重定向)

文章目录1. 默认情况下返回静态页面2. 返回一个非静态页面的数据2.1 ResponseBody 返回页面内容2.2 RestController ResponseBody Controller3. 实现登录功能&#xff0c;返回 JSON 对象3.1 前端使⽤ ajax&#xff0c;后端返回 json 给前端3.2 前端发送 JSON 的标准格式4. 请…...

leetcode-每日一题-2335(简单,贪心)

自己打表看一下过程就可以发现&#xff0c;其实就是每次选两个大的进行--之后秒数加1即可现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从 0 开始、长度为 3 的整数数组 amount &am…...

Verilog语法之数学函数

Verilog-2005支持一些简单的数学函数&#xff0c;其参数的数据类型只能是integer和real型。 Integer型数学函数 $clog2是一个以2为底的对数函数&#xff0c;其结果向上取整&#xff0c;返回值典型的格式&#xff1a; integer result; result $clog2(n); 最典型的应用就是通过…...

【手撕面试题】JavaScript(高频知识点一)

目录 面试官&#xff1a;请你简述 var、let、const 三者之间的区别&#xff1f; 面试官&#xff1a;请你谈谈对深拷贝与浅拷贝的理解 面试官&#xff1a;输入URL的那一瞬间浏览器做了什么&#xff1f; 面试官&#xff1a;说一说cookie sessionStorage localStorage 区别&am…...

如何用PHP实现消息推送

什么是消息推送 通过服务器自动推送消息到客户端(浏览器&#xff0c;APP&#xff0c;微信)的应用技术。 2. 为什么要使用消息推送技术 通常情况下都是用户发送请求浏览器显示用户需要的信息。推送技术通过自动传送信息给用户&#xff0c;来减少用于网络上搜索的时间。它根据…...

电子学会2020年6月青少年软件编程(图形化)等级考试试卷(四级)答案解析

青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;四级A卷&#xff09; 分数&#xff1a;100.00 题数&#xff1a;30 一、单选题&#xff08;共15题&#xff0c;每题2分&#xff0c;共30分&#xff09; 1. 执行下图程序后&#xff0c;“花名…...

DaVinci:调色版本

调色版本 Grade Version记录着片段的全部调色信息。将一种调色风格或效果&#xff0c;保存为一个调色版本&#xff0c;从而可在多个调色版本之间查看、比较、挑选或者渲染输出。调色版本类型本地版本Local Versions在没有创建新的调色版本之前&#xff0c;片段的调色信息默认记…...

【C++初阶】十二、STL---反向迭代器的实现

目录 一、反向迭代器 二、反向迭代器的实现 一、反向迭代器 之前的模拟实现vector、list 的时候&#xff0c;这些都是实现了正向迭代器&#xff0c;反向迭代器都没有实现&#xff0c;这里就要实现反向迭代器 反向迭代器也是适配器&#xff08;配接器&#xff09;的一种&#…...

day 43|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…...

[SSD固态硬盘技术 0] SSD的结构和原理导论

版权声明&#xff1a; 本文禁止转载机械硬盘的存储系统由于内部结构,其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展&#xff0c;性能瓶颈得到缓解。1. 什么是SSD固态硬盘&#xff08;Solid State Drives&#xf…...

Vue (3)

文章目录1. 数据代理1.1 回顾1.2 开始2. 事件处理2.1 v-on:click 点击事件2.2 事件修饰符2.3 键盘事件3. 计算属性3.1 插值语法实现3.2 methods实现3.3 计算属性实现4. 监视属性4.1 深度监视4.2 监视属性的简写形式4.3 watch 与 computed 对比1. 数据代理 在学习 数据代理 时 先…...

SQL语句,常用的DDL表操作语句

-- ddl sql 语句 -- 创建表 create table user_t( id int primary key auto_increment, -- 自增主键 name varchar(50) ); -- 查看表结构 desc user_t; desc user_test; -- 重命名表 alter table user_t rename to user_test; -- 查询数据库表 show tables; -- 添…...

wordpress文章推荐/中山360推广

可以使用下面语句对所要观察的寄存器约束&#xff0c;避免被其优化掉。 方法1&#xff1a; reg[15:0] data; /*synthesis noprune*/ 方法2&#xff1a; &#xff08;*noprune*&#xff09;reg[15:0] data; 比如原数据在A列&#xff0c;想从A1开始每隔31行提取新数据&a…...

网站设计经典案例/数据分析方法

目录 一、线程&#xff08;应用层&#xff09;的理解 二、编译的时候需要手动链接线程库POSIX 三、创建一个线程 1、API pthread_create&#xff08;创建线程&#xff09; 2、创建一个线程&#xff0c;输出主函数和线程的id 四、知识点 一、线程&#xff08;应用层&…...

wordpress 虚拟币/400个成品短视频

阿里云高级解决方案架构师 杨旭世界最大混合云的总架构师&#xff0c;4年前&#xff0c;开始作为双11阿里云技术负责人&#xff0c;负责搭建全球最大的混合云结构&#xff0c;把 “双11”的电商业务和技术场景在阿里云上实现&#xff0c;并保障这个混合云在双11当天能够满足全球…...

中国十大室内设计公司/seo优化网站推广全域营销获客公司

前言 对于一张有向图&#xff0c;我们一般有邻接表和邻接矩阵这两种存储方式。对于无向图&#xff0c;可以把无向边看作两条方向相反的方向&#xff0c;从而采取与有向图一样的存储方式。因此&#xff0c;在讨论最短路问题时&#xff0c;我们都以有向图为例。 邻接矩阵 设有…...

做网站怎么申请百度推广/公司网址有哪些

第90讲&#xff1a;基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验akka在业界使用非常广泛spark背后就是由akka驱动的要写消息驱动的编程模型都首推akka下面将用30讲讲解akka本讲主要讲两部分内容&#xff1a;1.akka的重大意义2.akka与scala的actorSpark源码中使用ak…...

可以转app的网站怎么做的/seo入门培训学多久

一、问题 无法重新加载 /usr/local/MATLAB/R2018a/bin/glnxa64/libmwxcp_dwarf.so Can’t reload /usr/local/MATLAB/R2018a/bin/glnxa64/libmwxcp_dwarf.so 一、环境 系统&#xff1a;Linux系统Deepin 20beta Matlab&#xff1a; R2018a 二、解决办法 这可能是matlab Lin…...