Web漏洞分析-SQL注入XXE注入(上)

       随着互联网的不断普及和Web应用的广泛应用,网络安全问题愈发引起广泛关注。在网络安全领域中,SQL注入和XXE注入是两个备受关注的话题,也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞,带您探寻背后的原理、攻击方式和防御策略。
       SQL注入是一种臭名昭著的攻击方式,通过在输入框中插入恶意SQL语句,黑客可以绕过身份验证,进而访问、篡改或删除数据库中的数据。我们将探讨SQL注入的不同形式,以及如何通过正确的输入验证和参数化查询等手段来有效预防这类攻击。
       另一方面,XXE注入则利用XML处理器解析XML输入时的弱点,使攻击者能够读取本地文件、发起远程请求等。我们将详细分析XXE注入的工作原理,并介绍如何使用安全的XML解析器配置来降低风险。通过了解这两种漏洞的内在机制,我们希望能够为开发者、安全从业者以及对网络安全感兴趣的人们提供关于Web应用安全的深度认识。在这个信息互联的时代,保护我们的Web应用免受SQL注入和XXE注入等威胁是至关重要的。  

一、数据库基础

1、主流数据库简介

(1)、Microsoft SOL Server

①、SQL Server 是Microsoft 公司推出的关系型数据库管理系统

②、具有使用方便可伸缩性好与相关软件集成程度高等优点

③、从旧版本的个人电脑到运行Microsoft Windows server 的大型多处理器的服务器都可以使用

(2)、MySQL

MySQL是现在非常流行的的关系型数据库管理系统,在WEB应用方面MySOL是最好的RDBMS(Relational Database Management System: 关系数据库管理系统)应用软件之一。

(3)、MySQL数据库连接方法

①、命令行下连接: [root@host]# mysql-u root -p

②、PHP连接: mysqli_connect(host,username,password,dbname,port,socket);

③、第三方软件连接

4)、Oracle

①、Oracle Database,又名Oracle RDBMS,或简称Oracle。

②、甲骨文公司的一款关系数据库管理系统。

③、在数据库领域一直处于领先地位的产品,在大公司的大型网络中运用非常多

5)、PostgreSQL

①、PostgreSQL是一个功能强大的开源对象关系数据库管理系统 (ORDBMS)

②、稳定性极强,用于安全地存储数据

2、识别数据库方法

(1)、识别数据库方法

①、盲跟踪

--Web应用技术

--不同数据库SQL语句差异

②、非盲跟踪

--报错、直接查询

(2)、报错信息:

①、MySQL报错信息:

②、MSSQL报错信息:

③、Oracle报错信息:

(3)、利用字符串连接方式去匹配数据库产品:

(4)、利用特定数据库函数匹配数据库产品

(5)、利用特定数据库函数匹配数据库产品:

6)、数据库版本查询

①、Mssql   select @@version

②、MySQL  select version( ) / select @@version

③、Oracle   select banner from $version

④、Postgresql  select version()

(7)、数据库版本查询

①、Oracle版本查询

②、Mysql版本查询

③、Mssql版本查询

(8)、数据库版本在字符串处理时的区别

9)、根据网页编程语言去判

常见的搭配 :

①、ASP和.NET: Microsoft SQL Server

②、PHP: MySOL、PostgreSQL

③、Java: Oracle、MySOL

3、SQL语法基础

(1)、表、列/字段、值的定义

①、数据库名: data.mdb

②、表: gmadmin、news (14) 、评论 (40).....

③、表gmadmin字段或列: id gmadmin gmpass

④、每个对应的字段都有对应的数据。

(2)、用于与关系型数据库交互的标准 SQL 命令有

CREATE、SELECT、INSERT、UPDATE、 DELETE 和 DROP

(3)、分为三组

①、数据定义(Create、Drop)

②、数据操纵(Select、Insert、Update、 Delete)

③、数据控制(Grant、Revoke)

(4)、SQL基本操作: CUD

①、C=Create 创建

CREATE DATABASE testdb;CREATE TABLE table name (column name column_type);

②、U=Update 更改

UPDATE table name SET field1=new-value1, field2=new-value2 [WHERE Clause]

③、D=Delete 删除

DELETE FROM table name[WHERE Clause]

(5)、SQL高级操作: 排序,分组,限定条数

①、排序 order by

SELECT *FROM test table ORDER BY userid;

②、分组 group by

SELECT name,COUNT(*) FROM test table GROUP BY name!

③、限定条数 limit

SELECT * FROM test table limit 0,10;SELECT * FROM test table limit 1,5:

④、组合使用

SELECT * FROM test table LIMIT 0,5 ORDER BY userid;

(6)、语句用法

①、order by用法: 用来确定字段数

order by:要是后面跟着的数字超出了字段数的时候,则会报错!通过这个可以确定字段数

②、limit用法
select * from table limit m,n 其中m是指记录开始的index,从0开始表示第一条记录 n是指从第m+1

条开始取n条

(1)、两个参数:第一个是偏移量,第二个是数目

select * from employee limit 3, 7; // 返回4-11行select * from employee limit 3,1;// 返回第4行

(2)、一个参数:

select * from employee limit 3;//返回前3行
③、group by 用法

group by语句:根据(by)一定的规则进行分组(Group)。

作用: 通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

注意:group by 是先排序后分组;

group by必须有“聚合函数” sum()、count()、avg()来配合才能使用

select product from orders

select product from orders GROUP BY product

错误查询语句: select product,price from orders group by product正确查询语句: select product,sum(price) from orders GROUP BY product

当查询语句同时出现了where、 group by、having、order by的时候,执行顺序和编写顺序是:

Ⅰ、执行where xx对全表数据做筛选,返回第1个结果集。

Ⅱ、针对第1个结果集使用group by分组,返回第2个结果集

Ⅲ、针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集

Ⅳ、针对第3个结集执行having xx进行筛选,返回第4个结果集

Ⅴ、针对第4个结果集排序

select product,sum(price) from orders GROUP BY product HAVING sum(price)>100 ORDERBY sum(price);

④、联合查询union

因为查询语句构造问题,可直接否认掉之前的查询,执行一个全新的语句来执行需要注意的是查询的列应当和之前对应,

用and union select 1,2,3,4,5,6...;来猜解列数(字段数),只有列数相等了,才能返回True

知道列名后,把列名至于其中任意位置,就能在那个位置暴出列的内容来

⑤、结合其他函数
Ⅰ、结合exists()函数猜解表名and exists (select.....)

exists()函数用于检查子查询是否至少会返回一行数据。实际上不返回任何数据,而是返回True或者False

不存在admin表

存在heihei表

Ⅱ、union 结合系统函数暴数据库信息

在MySOL中,把information schema看作是一个数据库,确切说是信息数据库。其中保存着关于MySOL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。

information schema数据库是MvSOL自带的information_schema.SCHEMATA表中的SCHEMA NAME 查看所有的数据库select* from hehe where id=3 and 1=2 union select 0,0,SCHEMA_NAME frominformation ——schema.SCHEMATA limit 12;

Ⅲ、union 结合系统函数暴数据库信息
information_schema.TABLES 表中的TABLE_NAME和TABLE_SCHEMA查看所有的表名和所在的

数据库:

select TABLE NAME ,TABLE_SCHEMA from information_schema.TABLES where TABLE SCHEMA ="haha"

Ⅳ、结合load file()读取服务器文件内容

函数 LOAD_FILE(file name): 读取文件并将文件内容按照字符串的格式返回

前提条件:

(1)、文件的位置必须在服务器上,你必须为文件制定路径全名,而且你还必须拥有 FILE 特许权。

(2)、文件必须可读取,文件容量必须小于 max allowed_packet 字节

(3)、若文件不存在,或因不满足上述条件而不能被读取, 则函数返回值为 NULL。

load_file()用在MySQL中可以在UNOIN中充当一个字段,读取web服务器的文件

Ⅴ、示例:

服务器上文件:"d:/test.txt",里面内容是:"key:HelloWorld.",用load file读取出来

select * from hehe where id=3 and 1=2 union select 0,load_file("d:/testtxt"),count(*) from mysql.user;

4、挖掘SQL注入常用语句

(1)、使用逻辑进行确认

OR 1=1

OR 1=2

AND 1=1

AND 1=2

5、SQL注入漏洞利用

(1)、识别数据库

要想成功发动SQL注入攻击,首先要确定数据库的类型这样才能使得注入工作具有针对性

(2)、盲跟踪

Web应用技术

不同数据库Sql语句差异

(3)、非盲跟踪

报错、直接查询

4)、关于数据库版本的查询

Mssql   select @@versionMysql   select version[]/ select @@versionOracle   select banner from $versionPostgre  sqlselect version()

(5)、使用UINON语句提取数据

SELECT column-1,column-2, ....,column-N FROM table-1  UNIONSELECT column-1,column-2, ..., column-N FROM table-2

(6)、如果允许重复的值,就要使用 UNION ALL

SELECT column-1,column-2, ..column-N FROM able-1UNION ALLSELECT column-1,column-2, ....column-N FROM table-2

(7)、匹配列

①、主要两种方法:

union select NULL,NULL,NULL..... 直到匹配对应列时返回为真order by 3, order by 4. order by 5......当列数小于或者等于当前列的时候返回正常

②、例如:

http://123.59.116.191/sqli-labs-master/Less-1/?id='union select 1,2,3-http://123.59.116.191/sqli-labs-master/Less-1/?id=1'order by 1 --http://123.59.116.191/sqli-labs-master/Less-1/?id=1'order by 2 --http://123.59.116.191/sgli-labs-master/Less-1/?id=1' order by 3 --

(8)、常见手工注入SQL语句:

查看数据库

union select 1,(select group_concat(schema name) from information_schema.schemata),'3>

查看 security 库数据表

union select 1,(select group_concat(table_name) from information_schema.tables wheretable schema='security'),'3

(9)、使用条件语句

IF condition THEN do something ELSE do something else

二、注入漏洞利用

1、SQL注入

(1)、什么是SQL注入漏洞

攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令进而实现对后台数据库乃至整个应用系统的入侵。

(2)、SQL注入原理

SQL注入攻击的本质,服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全

(3)、注入的本质

对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。

(4)、两个条件

用户能够控制输入

原本程序要执行的SQL语句,拼接了用户输入的恶意数据

(5)、注入过程

6)、SQL注入带来的危害

①、绕过登录验证:使用万能密码登录网站后台等

②、获取敏感数据:获取网站管理员帐号、密码等

③、文件系统操作: 列目录,读取、写入文件等。

④、注册表操作: 读取、写入、删除注册表等

⑤、执行系统命令: 远程执行命令

2、SQL注入示例

1)、直接将前台动态参数拼接入SQL语句中。

攻击者可以构造出恶意的SQL语句进行其他操作

SELECT username, password FROM users WHERE username=’ ”+username +" ‘AND password='" + password +’”;

(2)、通过在用户名处传入参数' or 1=1 # 进行万能密码登陆

SELECT username, password FROM users WHERE username='textvalue'  or=1 #' ANDpassword='textvalue2'

①、输入字符

formusr = ' or 1=1 --formpwd = anything

②、实际的查询代码

SELECT * FROM users WHERE username =''or 1=1 -- AND password = 'anything

(3)、判断一个HTTP请求是否存在SQL注入的方式:

①、经典: and 1=1 | and 2 > 1 | or1 =1 | or 1<1

②、数据库函数: and sleep(4)=1 | and length(user())>3

③、特殊符号: 单引号 (’) 双引号 (”)

3SQL注入分类

(1)、注入类型

①、SQL注入: 攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗数据库服务器执行恶意的SQL命令

②、命令注入: 后端未过滤掉恶意数据,代码当做系统命令执行。

③、代码注入:一般出现在不安全的使用某些函数(例如文件包含、反序列化漏洞)

④、LDAP注入

LDAP (轻量级目录访问协议) ,用于访问网络中的目录服务,常用在ActiveDirectory,企业管理目录。

用户提交的输入不经验证插入LDAP搜索过滤器中,攻击者通过提交专门设计的输入修改过滤器的结构,以检索数据或执行未授权操作。

⑤、XML注入

(1)、XXE漏洞:引用外部实体时,通过构造恶意内容,导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

(2)、XPath注入: 与SQL注入类似,XPath解析器本身对URL、表单中提交的代码内容未作严格限制,导致恶意代码可以直接解析执行

(3)、XQuery注入

⑥、JSON注入: 轻量级的数据交换格式,主要利用特殊字符注入JSON中,造成解析失败

⑦、JSONP注入: 回调函数未作严格的检测和过滤

(2)、数字型注入

①、输入的参数为整数,如ID、年龄、页码等,如果存在注入型漏洞,则为数字型注入

http://www.testweb.com/user.php?id=8

②、存在数字型注入测试方法

(3)、字符型注入

①、输入的参数为字符串

②、与数组型注入的区别在于: 字符型注入一般要使用单引号来闭合

http://www.testweb.com/test.php?user=admin

③、存在字符型注入测试方法

4)、搜索型注入

这类注入主要是指在进行数据搜索时没过滤搜索参数

一般在链接地址中有“keyword=关键字”,有的不显示的链接地址,而是直接通过搜索框表单提交。

此类注入点提交的 SQL 语句,其原形大致为:

select * from 表名 where 字段 like %关键字%

当我们提交注入参数为“keyword='and[查询条件] and'%'=',则向数据库提交的SQL语句为:select * from 表名 where 字段 like '% ' and[查询条件]and '%'='%'

4、造成SQL注入原因

(1)、动态字符串构建引起

①、不正确的处理转义字符 (宽字节注入)

②、不正确的处理类型 (报错泄露信息 )

③、不正确的处理联合查询

④、不正确的处理错误 (报错泄露信息)

⑤、不正确的处理多次提交 (二次注入)

(2)、后台存在的问题:

①、后台无过滤或者编码用户数据

②、数据库可以拼接用户传递的恶意代码

(3)、错误处理不当:

①、详细的内部错误消息显示给用户或攻击者

②、错误信息可以直接给攻击者提供下一步攻击帮助

(4)、不安全的数据库配置

①、默认账户:

SQL Server“sa”作为数据库系统管理员账户

MySOL使用“root”和“anonymous”用户账户

Oracle则在创建数据库时通常默认会创建SYS、SYSTEMS DBSNMP和OUTLN账户

②、权限:

问题:系统和数据库管理员在安装数据库服务器时允许以roots SYSTEM或Administrator特权系统用户账户身份执行操作。

正确方法: 应该始终以普通用户身份运行服务器上的服务,降低用户权限,将用户权限只限于本服务

5、SQL注入过程

(1)、自动化注入工具

①、SQL注入工具:

Sqlmap Havij Sqlid

②、ASP,JSP注入工具:

NBSI 阿D注入软件 明小子注入软件

③、PHP注入工具:

穿山甲注入软件  海阳顶端注入软件

6、安全专家经常使用的SQL注入工具

(1)、BSQL Hacker

由Portcullis Labs开发,BSOL Hacker是一种自动化SOL注入框架,支持SQL盲注,定时盲注,深度盲注和错误识别盲注。

2)、The Mole

Mole是一个开源工具,能够绕过一些使用普通过滤规则的IPS/IDS系统。通过Union和Boolean查询技术,Mole能够通过一个脆弱的URL或网站的一串字符就能侦查和实施注入。Mole的命令行工具支持攻击MySQL、SOL Server、Postgres和Oracle数据库。

(3)、Pangolin

与web安全漏洞扫描器JSky工具出自同一家公司--NOSEC,Pangolin是一个完整的SQL注入测试工具,有一个用户友好的GUI,能够攻击几乎市场上所有的数据库。Pangolin通常被白帽社区用作渗透测试工具

4)、Sqlmap

号称自动化SQL注入和数据库接管工具,Sqlmap是开源工具,支持使用五中SQL注入技术攻击数据库,如果用户拥有DBMS账户、IP地址端口和数据库名称,则可以实施直接

攻击。可通过内置的字典攻击用户名密码哈希值。

(5)、Havij

Havij是在全球黑帽中非常流行的一个工具,由伊朗开发者开发,Havij在波斯语里是胡萝卜的意思(编者按: 暗指男根) 。Havij可攻击MySOL、Oracle、PostgreSQL、MSAccess和Sybase,攻击成功率号称有95%。

步骤1.Havii获取数据库类型与信息

Havij获取数据库cms内的表

步骤2.Havii获取网站管理员账号与密码

步骤3.MD5值破译哈希值

步骤4.登陆后台

步骤5.篡改文章或主页

步骤6.管理数据库

(6)、Safe3 SQL Injector

Safe3 SOL Injector是简单易用的自动化注入工具,可以自动侦测SOL注入漏洞并进行攻击,直至最后接管数据库。Safe3 SQL还能自动识别数据库类型,并选择最佳的SQL注入方法。

7)、SQL Poizon

Safe3 SQL Injector是简单易用的自动化注入工具,可以自动侦测SQL注入漏洞并进行攻击,直至最后接管数据库。Safe3 SQL还能自动识别数据库类型,并选择最佳的SQL注入方法。

(8)、SQL注入工具利用实验(需要的话关注联系)

工具1:利用Sglmap注入cms

工具2:利用Havii注入cms

7SQL手工注入过程

(1)、手工注入过程

①、判断是否存在注入点;

②、判断字段长度 ;

③、判断字段回显位置:

④、判断数据库信息 ;

⑤、查找数据库名;

⑥、查找数据库表;

⑦、查找数据库表中所有字段以及字段值

⑧、猜解账号密码;

⑨、登陆管理员后台

(2)、SQL手工注入实验

实验1:基于phpcms注入 (报错+get请求)

实验2: 基于sqli平台Less-1注入(报错+get请求)

8、寻找SQL注入

(1)、GET方法

①、GET是一种请求服务器的HTTP方法。

②、使用该方法时,信息包含在URL中

③、点击一个链接时,一般会使用该方法

(2)、GET请求方法,格式:

? text =valuel&cat=value2&num=value3 ..

(3)、修改方法:

①、浏览器的导航栏中直接修改即可操纵这些参数

②、HackBar插件

(4)、POST方法

①、POST是一种用于向Web服务器发送信息的HTTP方法

②、数据信息无法URL中看到

③、可以发送字节大的数据

POST /sqli-labs-master/Less-11/ HTTP/1.1Host: 123.59.116.191User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:57.0) Gecko/20100101 Firefox/57.0Content-Type: application/x-www-form-urlencodedContent-Length: 43Connection: closeUpgrade-Insecure-Requests: 1uname=w3g43we&passwd=h64j4wj5&submit=Submit

(5)修改POST包方法

①、浏览器修改扩展(Hackbar)

②、代理服务器 (Burpsuite)

(6)、其它注入点数据

①、Cookie

②、Host

③、User-Agent

(7)、总结

只要后台接收前端输入的数据,并且未对数据进行过滤处理,最后直接进入到数据库中,从而都能构成威胁。

9、确认SQL注入

(1)、确认搜索类型

①、SELECT: 根据搜索条件从数据库中读取数据

②、INSERT: 将新数据插入到数据库中

③、UPDATE: 根据指定的条件更新数据中己有的数据

④、DELETE: 根据指定的条件删除数据库中己有的数据

(2)、确认数据类型

①、数字型:

SELECT* FROM products WHERE idproduct=3SELECT *FROM products WHERE value > 200SELECT *FROM products WHERE active = 1

②、字符型:

SELECT*FROM products WHERE name = Bike'SELECT*FROM products WHERE published date>'01/01/2013SELECT*FROM products WHERE published time>'01/01/2013 06:30:00'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个用c#瞎写的sftp工具

0.下载地址 https://wwus.lanzouj.com/iOZUv1gkgpze 密码:123456 1.能进行单个和批量下载, 没有弄上传 2.速度奇差,可能是某些地方没弄好.有一定的进度显示,但是不太准. 3.很多地方没弄好,有能力的自己弄一下 4.在app.config文件配置sftp

深度学习 第3章 Python程序设计语言(3.2 Python程序流程控制)

无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorch、TensorFlow也都是基于Python。本课程主要是围绕“理论实战”同时进行&#xff0c;所以本章将重点介绍深度学习中Python的必备…

Echarts大屏可视化_03 定制柱状图

柱状图模块引入 1.找到合适的图表 在echarts中寻找与目标样式相近的图表 Examples - Apache ECharts 2. 引入柱状图 使用立即执行函数构建&#xff0c;防止变量全局污染 实例化对象 将官网中提供的option复制到代码中&#xff0c;并且构建图表 // 柱状图模块1 (function () {/…

Python爬虫:通过js逆向分析某翻译网站的原理

Python爬虫&#xff1a;通过js逆向分析某翻译网站的原理 1. 网站实现原理2. 抓取接口3. 参考代码和运行结果 1. 网站实现原理 首先&#xff0c;说一下爬取的网站&#xff1a;百度翻译。网站实现翻译的效果是通过接口实现的&#xff0c;也就是各位听到的ajax技术(只需要更换对应…

Sharding-Jdbc(4):Sharding-Jdbc分库

1 新建数据库 创建ds_0数据库和ds_1数据库&#xff0c;在两个数据库新建表如下&#xff1a; CREATE TABLE t_order (order_id bigint(20) NOT NULL,user_id bigint(20) NOT NULL,PRIMARY KEY (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin; 2 新建maven项目…

QNX时钟调研

SYSPAGE_ENTRY()的使用&#xff0c;SYSPAGE_ENTRY 测试QNX下printf(“poo\n”);的耗时 #include <sys/neutrino.h> #include <inttypes.h> #include <stdio.h> #include <stdlib.h> #include <sys/syspage.h>int main( void ) {uint64_t cps, …

计算机网络的性能

目录 一、计算机网络的性能指标——宽带 二、计算机网络的性能指标——时延 三、计算机网络的性能指标——时延带宽积 四、计算机网络的性能指标——往返时延 五、计算机网络的性能指标——吞吐量 六、计算机网络的能能指标——利用率 计算机网络的定义&#xff1a;计算机网络时…

9. 双向队列

在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如下图所示&#xff0c;双向队列(double-ended queue)提供了更高的灵活性&#xff0c;允许在头部和尾部执行元素的添加或删除操作。 9.1 双向队列常用操作 双向队列的常用操作如下表所示&#xff0c;具体的方法名称…

Docker镜像制作与推送

目录 Docker镜像制作 搭建私服 将本地镜像推送到私有库 Docker镜像制作 以创建一个新ubuntu镜像&#xff0c;并安装vim命令示例 运行一个ubuntu镜像&#xff0c;发现在镜像里面无法使用vim命令&#xff0c;因为该ubuntu镜像只包括了其最基本的内核命令 [rootlocalhost ~]…

qt5.15播放音频示例(4种方法)

文章目录 Qt播放音频方法一 QMediaPlayer方法二 QSound方法三 QSoundEffect方法四 QAudioOutput问题1 播放无声问题2 QAudioOutput播放嗡嗡声的问题参考Qt播放音频 在linux系统中,可以通过aplay进行简单的播放音频,如 aplay /opt/Audio/test.wav在图形界面,也可以封装apla…

【接口测试】Apifox实用技巧干货分享

前言 不知道有多少人和我有着这样相似的经历&#xff1a;从写程序只要不报错就不测试&#x1f60a;&#xff0c;到写了程序若是有bug就debug甚至写单元测试&#xff0c;然后到了真实开发场景&#xff0c;大哥和你说&#xff0c;你负责的功能模块的所有接口写完要测试一遍无误在…

canvas基础:fillStyle 和strokeStyle示例

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 上色…

百度收录批量查询工具,免费SEO优化排名工具

拥有一个在搜索引擎中得到良好收录的网站对于个人和企业都至关重要。而百度&#xff0c;作为中国最大的搜索引擎&#xff0c;其收录情况直接影响着网站的曝光度和流量。 百度搜索引擎是中文用户获取信息的重要途径之一。而在这个竞争激烈的网络环境中&#xff0c;了解自己网站…

分治-归并排序

文章目录 &#x1f31e;315. 计算右侧小于当前元素的个数&#x1f308;1. 题目⛅2. 算法原理&#x1fa90;3. 代码实现 &#x1f315;493. 翻转对&#x1f320;1. 题目⭐2. 算法原理&#x1f31f;3. 代码实现 &#x1f31e;315. 计算右侧小于当前元素的个数 &#x1f308;1. 题…

Fiddler抓包工具之fiddler设置抓HTTPS的请求证书安装

设置抓HTTPS的请求包 基础配置&#xff1a; 路径&#xff1a;启动Fiddler 》Tools》Options》HTTPS 注意&#xff1a;Option更改完配置需重启Fiddler才能生效 选中"Decrpt HTTPS traffic", Fiddler就可以截获HTTPS请求&#xff0c;如果是第一次会弹出证书安装提…

二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树

二叉树的实现 定义结构体 我们首先定义一个结构来存放二叉树的节点 结构体里分别存放左子节点和右子节点以及节点存放的数据 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;…

Kubernetes入门学习(下)

Kubernetes入门学习&#xff08;下&#xff09; 文章目录 Kubernetes入门学习&#xff08;下&#xff09;运行有状态的应用ConfigMap与SecretConfigMapSecret 卷(Volume)StatefulSet(有状态应用集)Headless Service(无头服务)Mysql主从复制Port-forward端口转发Helm参考 运行有…

Python办公自动化【Word设置文字样式、Word设置段落样式、Word生成通知书、Word读取内容】(五)-全面详解(学习总结---从入门到深化)

目录 Word设置文字样式 Word设置段落样式 Word生成通知书 Word读取内容 Word设置文字样式 常用方法与属性 函数名&属性含义docx.shared.Inches() 创建大小(英寸)docx.shared.Pt() 创建大小(像素)docx.shared.RGBColor() 创建颜色docx.text.run.Run.font.bold文字加粗…

压缩docker在主机的虚拟磁盘容量

我们在windows里使用docker时会发现&#xff0c;即使我们已经删除了无用的镜像和容器&#xff0c;主机里挂在docker虚拟磁盘的那个盘&#xff0c;可用空间也没有增加&#xff0c;这是因为虚拟磁盘不会自动缩小&#xff0c;这里我分享一个可用的解决方案。 1.先通过docker回收空…

[多线程]线程安全问题再讨论 - volatile

目录 1.引言 2.volatil关键字 2.1内存可见性 2.2指令重排序 1.引言 大家好,我是老cu,今天我们来继续聊聊线程安全问题 线程安全是我们在编程开发中遇到的非常常见,棘手 的问题.同时也是多线程部分很复杂的问题.为了线程安全我们要做很多努力.也要对线程安全部分的代码进行慎…