对SQL注入进行的一些总结

news2024/10/6 8:29:33

简介

在这里插入图片描述

SQL注入作为一种攻击方式最早可以追溯到20世纪90年代中期,当时Web应用程序开始流行并广泛使用数据库作为其后端数据存储。最早的SQL注入攻击是通过简单地在Web表单输入框中输入SQL代码来实现的,攻击者可以通过修改输入参数来篡改数据库查询的行为,从而窃取数据或者破坏数据库的完整性。

自那时以来,SQL注入已经成为一种常见的网络攻击方式,尤其是对于那些没有充分考虑安全性的Web应用程序而言。许多著名的数据泄露事件和网络攻击都与SQL注入有关。因此,保护Web应用程序免受SQL注入攻击已经成为网络安全的一个重要领域。随着安全意识的不断提高,开发人员和安全专家已经采取了许多措施来预防和检测SQL注入攻击,如输入验证、参数化查询、安全编码实践等。

简单来说,sql注入就是将用户的参数带入到了数据库查询中

漏洞代码:

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

这串代码直接将用户输入的参数赋予到id变量里,然后带入数据库里查询

sql注入的攻击方法:

union联合查询注入 ,报错注入 ,时间盲注,布尔盲注 ,堆叠查询注入 ,宽字节注入

union联合查询注入

SQL注入中的联合查询注入(Union-Based Injection)是一种常见的攻击方式,利用SQL语句中的UNION操作符来实现。联合查询通常用于将两个或多个查询结果合并为单个结果集。攻击者可以通过在一个SQL语句中插入恶意代码,从而将另一个查询结果集合并到原始结果集中,从而获得未经授权的访问和操作权限。

在联合查询注入中,攻击者会利用UNION操作符来合并两个查询结果,通常会插入一些恶意代码,例如’OR 1=1’或者’–',这些代码会干扰原始查询的逻辑,并将攻击者的查询结果集合并到原始结果集中。攻击者可以通过这种方式窃取数据、执行未经授权的操作、绕过身份验证等

假设有一个简单的用户登录页面,其中用户名和密码通过POST请求发送到服务器,服务器接收到请求后将其拼接成SQL查询语句,查询语句如下:

SELECT * FROM users WHERE username='[用户名]' AND password='[密码]'

攻击者可以利用联合查询注入来绕过身份验证,以下是一个可能的攻击示例:

假设攻击者输入的用户名是 ’ or 1=1 union select 1,2,3–,这个输入会将原始查询语句修改为:

SELECT * FROM users WHERE username='' or 1=1 union select 1,2,3--' AND password='[密码]'

这个修改后的查询语句会执行两个查询,第一个查询会返回所有用户,因为 1=1 是恒成立的条件。第二个查询是一个带有三个列的伪查询,其中每个列都是常量 1、2、3,攻击者可以通过这个查询来获取有关数据表结构和内容的信息。因此,攻击者可以通过这种方式获得未经授权的访问和操作权限。

报错注入

报错注入(Error-Based Injection)是SQL注入攻击中的一种常见方式。攻击者利用错误消息来了解SQL查询中的错误,从而推断出数据表的结构和内容,进而获取敏感信息。

报错注入攻击通常通过向SQL查询中注入恶意代码来实现,例如,在查询语句的末尾添加 AND 1=2 UNION SELECT 1/0,这将导致查询语句执行错误并返回一个错误消息。攻击者可以从错误消息中了解SQL查询中发生了什么,并利用这些信息来推断数据表的结构和内容。

例如,如果错误消息显示列 user_password 不存在,那么攻击者可以推断出该数据表包含列 user_password,并利用这个信息来发起其他SQL注入攻击,从而获取敏感数据

假设有一个包含用户数据的数据表,包括用户名、电子邮件和密码,其中密码是经过哈希处理的。现在,我们要实现一个简单的用户登录功能,用户可以通过输入用户名和密码来登录系统。查询语句如下:

SELECT * FROM users WHERE username = '[用户名]' AND password = '[密码]'

攻击者可以通过报错注入攻击来绕过密码验证,以下是一个可能的攻击示例:

假设攻击者输入的用户名是 ’ or 1=1 union select 1,2,3 from users–,这个输入会将原始查询语句修改为:

SELECT * FROM users WHERE username = '' or 1=1 union select 1,2,3 from users--' AND password = '[密码]'

这个修改后的查询语句将执行两个查询。第一个查询是原始查询,它将返回所有用户。第二个查询是一个带有三个列的伪查询,其中每个列都是常量 1、2、3,并且从原始数据表中查询数据。但是,由于第二个查询中的列与数据表的实际列不匹配,所以将会返回一个错误消息,例如:

Unknown column 'password' in 'where clause'

攻击者可以从这个错误消息中了解到数据表中不包含 password 列,从而推断出该数据表包含三列,分别是 username、email 和 password。攻击者可以继续利用这些信息来发起其他SQL注入攻击,例如:

假设攻击者想要获取所有用户的电子邮件地址,攻击者可以使用以下查询语句:

' or 1=1 union select null,email,null from users--

这个查询语句将返回一个伪查询,其中只有电子邮件列是真实的,而其他两列都是空值。

时间盲注

时间盲注(Time-Based Blind Injection)是一种SQL注入攻击方法,攻击者通过发送恶意的SQL查询语句来检测数据表中的信息,而不需要从返回的结果中获取明确的信息。

攻击者利用时间函数来检查查询的结果是否满足某个条件,如果满足,就会延长查询时间或者在响应中增加一个时间延迟。例如,攻击者可以发送以下查询:

SELECT * FROM users WHERE id = 1 AND (SELECT 1 FROM users WHERE username = 'admin' AND ASCII(SUBSTRING(password,1,1)) = 97)

该查询语句中的 ASCII() 函数会将密码中第一个字符转换为其ASCII码,并将其与字符"a"的ASCII码进行比较。如果密码的第一个字符是"a",那么查询将返回TRUE,否则返回FALSE。

攻击者可以根据查询返回的响应时间来推断查询结果是否为TRUE。如果查询结果为TRUE,则响应时间通常会更长,因为查询需要执行更多的操作。通过不断地调整查询条件,攻击者可以逐步推断出密码中的每个字符,最终获得完整的密码

假设我们有一个简单的用户登录系统,其登录页面包含两个输入框:用户名和密码。当用户提交登录请求时,应用程序将执行以下SQL查询语句:

SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password';

攻击者可以利用时间盲注来试图猜测正确的用户名和密码,从而绕过身份验证并获得对应用程序的访问权限。

攻击者可以向用户名输入框中输入一个有效的用户名(如 “admin”),然后在密码输入框中输入以下内容:

' AND IF(SUBSTR((SELECT password FROM users WHERE username='admin'),1,1)='a',SLEEP(5),0) AND '

该SQL查询语句中的 IF() 函数将检查密码中的第一个字符是否等于字符"a"。如果是,查询将会执行一个5秒钟的时间延迟。如果不是,则查询不会执行延迟。

如果应用程序容易受到时间盲注攻击,那么攻击者可以通过观察登录请求的响应时间来确定密码中的第一个字符是否等于字符"a"。如果响应时间超过5秒钟,则说明第一个字符是"a",否则就不是。

接下来,攻击者可以逐一检查密码中的每个字符,将上述语句中的“1”更改为“2”,并将“SUBSTR()”函数的第二个参数增加1。如果查询的响应时间大于5秒,则说明密码中的第二个字符是正确的,否则就不是。

通过这种方式,攻击者可以不断地迭代查询条件,直到成功地猜测出正确的用户名和密码,并获得对应用程序的访问权限

布尔盲注

布尔盲注是一种 SQL 注入攻击技术,它利用了应用程序在响应中不提供明确错误消息的情况下执行 SQL 查询的行为。攻击者可以使用布尔盲注来推断关于数据库中数据的信息,包括表、列、行和值。

布尔盲注的攻击思路是利用布尔逻辑表达式,通过不断构造逻辑表达式,来逐步推断出所需要的信息。比如,我们可以使用以下 SQL 语句来判断某个条件是否为真:

SELECT * FROM users WHERE username = 'admin' AND password LIKE '%a%';

如果该语句返回结果,则说明密码中包含字符 “a”,否则就不包含。

使用这种方法,攻击者可以通过构造一系列逻辑表达式来推断关于数据库的信息,例如:

SELECT * FROM users WHERE username = 'admin' AND password LIKE 'a%';
SELECT * FROM users WHERE username = 'admin' AND password LIKE 'aa%';
SELECT * FROM users WHERE username = 'admin' AND password LIKE 'ab%';

如果第一个语句返回结果,而第二个语句没有返回结果,则可以推断出密码的第二个字符是 “a”,否则就是 “b”。

通过这种方式,攻击者可以使用布尔盲注攻击来推断出数据库中的敏感信息,如用户名和密码。

假设一个网站有一个搜索功能,可以根据输入的关键词在数据库中搜索匹配的文章。搜索功能的代码如下:

<?php
$keyword = $_GET['keyword'];
$sql = "SELECT * FROM articles WHERE title LIKE '%$keyword%'";
$result = mysql_query($sql);
?>

上面的代码有一个明显的 SQL 注入漏洞,攻击者可以在 keyword 参数中注入恶意的 SQL 代码。使用布尔盲注攻击可以让攻击者逐步推断出数据库中的信息,如下所示:

首先,我们可以构造以下请求:

http://example.com/search.php?keyword=a' AND 1=1--

这将导致 SQL 语句变为以下形式:

SELECT * FROM articles WHERE title LIKE '%a' AND 1=1--%'

这个语句将返回所有标题中包含字符 “a” 的文章,同时忽略后面的注释。

接下来,我们可以构造以下请求:

http://example.com/search.php?keyword=a' AND substring((SELECT password FROM users WHERE username='admin'),1,1)='a'--

这将导致 SQL 语句变为以下形式:

SELECT * FROM articles WHERE title LIKE '%a' AND substring((SELECT password FROM users WHERE username='admin'),1,1)='a'--%'

如果这个语句返回结果,则说明管理员的密码以 “a” 开头,否则就不是。

使用类似的方式,攻击者可以逐步推断出管理员的密码。例如,使用以下请求可以检查密码的第二个字符:

http://example.com/search.php?keyword=a' AND substring((SELECT password FROM users WHERE username='admin'),2,1)='b'--

如果这个语句返回结果,则说明管理员的密码的第二个字符是 “b”,否则就不是。

通过这种方式,攻击者可以逐步推断出管理员的密码,并最终登录到网站上执行恶意操作。

堆叠查询注入

SQL注入的堆叠查询注入(Stacked Query Injection)是一种SQL注入技术,攻击者可以在一次数据库查询中执行多个查询语句,以达到执行任意SQL语句的目的。

堆叠查询注入通常是在执行多条SQL语句的Web应用程序中发现的,例如使用多个SQL查询更新或插入多个值的程序,或使用存储过程或触发器的程序。

攻击者通过在Web应用程序的输入字段中插入特殊字符和SQL代码来实现堆叠查询注入攻击。攻击者通常使用分号“;”或双破折号“–”来分隔多个查询语句

假设有一个网站提供了一个搜索功能,用户可以输入一个关键词来搜索相关内容。该网站使用了如下的 SQL 查询来实现搜索:

SELECT * FROM products WHERE name LIKE '%keyword%';

其中 keyword 是用户输入的搜索关键词。

攻击者可以通过在关键词中注入恶意的 SQL 代码来实现注入攻击。例如,攻击者可以将关键词输入改为:

'; SELECT * FROM users;--

这将导致 SQL 语句变为以下形式:

SELECT * FROM products WHERE name LIKE ''; SELECT * FROM users;-- %';

注意到这个查询语句包含两个独立的 SQL 查询,以分号 ; 分隔。由于在这种情况下,查询中包含两个分号,因此查询将无法正常执行,会抛出一个 SQL 错误。攻击者可以通过使用堆叠查询技术来绕过这个限制。

例如,攻击者可以将关键词输入改为:

'; SELECT * FROM users WHERE id=1; INSERT INTO products(name) VALUES ('hacked');--

这将导致 SQL 语句变为以下形式:

SELECT * FROM products WHERE name LIKE ''; SELECT * FROM users WHERE id=1; INSERT INTO products(name) VALUES ('hacked');-- %';

在这个查询语句中,攻击者在第一个查询中插入了一个空字符串 ‘’,然后在第二个查询中获取 users 表中 id=1 的记录,并在第三个查询中插入一条新的产品记录。这些查询会被顺序执行,而且它们都是有效的 SQL 查询,因此可以成功执行。

通过这种方式,攻击者可以在不知道任何表结构的情况下执行任意的 SQL 代码,包括获取、修改、删除敏感数据等操作

宽字节注入

SQL注入的宽字节注入(Wide-Character Encoding)是一种利用Web应用程序中使用不安全字符编码方式的SQL注入技术。它是一种比较常见的SQL注入方式,也是一种相对难以检测和防御的攻击。

宽字节注入利用了一些Web应用程序在处理输入时所使用的编码方式,通常是将输入转换为Unicode编码或其他字符编码方式。攻击者可以在输入中插入特殊字符和SQL代码,以达到执行任意SQL语句的目的。

在宽字节注入中,攻击者使用一些特殊字符(如%df%27)替换原始输入中的某些字符,从而使SQL语句变得不规则或不完整。这样可以绕过应用程序中的一些安全检测机制,使应用程序执行攻击者构造的恶意SQL语句

假设一个使用 MySQL 数据库的网站,其中有一个搜索页面,允许用户搜索特定的产品。网站的 URL 可能看起来像这样:

https://example.com/search.php?keyword=product_name

在这里,product_name 是用户输入的产品名称。搜索页面将用户输入的 product_name 值传递给后端的 MySQL 查询。查询可能类似于以下内容:

SELECT * FROM products WHERE name = 'product_name'

在这里,product_name 是用户输入的值,该值将用于 SQL 查询中的 name 列。

攻击者可能会利用 MySQL 的宽字符编码,将 product_name 中的 ’ 转换为 %df%27。如果网站没有正确地处理这种编码,攻击者就可以利用宽字节注入进行 SQL 注入攻击。例如,攻击者可能会输入以下内容:在这里,product_name 是用户输入的值,该值将用于 SQL 查询中的 name 列。

攻击者可能会利用 MySQL 的宽字符编码,将 product_name 中的 ’ 转换为 %df%27。如果网站没有正确地处理这种编码,攻击者就可以利用宽字节注入进行 SQL 注入攻击。例如,攻击者可能会输入以下内容:

product_name=%df%27%20OR%20%271%27%3D%271

在这里,攻击者使用 %df%27 编码的单引号 ’ 和 %20 编码的空格字符 。攻击者还使用 OR 运算符和恒等式 1=1 来注入一个永远为真的条件。如果网站没有正确地处理宽字符编码,那么 product_name 的值将被解释为以下内容:

SELECT * FROM products WHERE name = '%df%27 OR '1'='1'

在这里,第二个查询将始终返回所有产品行,因为 1=1 恒为真。攻击者成功地执行了 SQL 注入攻击,从而可以访问敏感信息或控制整个数据库

绕过WAF的一些手段

WAF(Web Application Firewall)是一种用于保护 Web 应用程序免受恶意攻击的安全设备。当 WAF 配置正确并正确地执行时,它可以有效地防止许多类型的攻击,包括 SQL 注入。但是,攻击者可能会使用一些技术来绕过 WAF 的保护。以下是一些可能用于绕过 WAF 的 SQL 注入技术:

1.通过混淆和编码来绕过 WAF 检测
攻击者可以对 SQL 查询中的关键词和语法进行混淆和编码,以避免被 WAF 检测到。例如,攻击者可能会使用 URL 编码、十六进制编码、Unicode 编码、Base64 编码等技术对 SQL 查询进行编码,使 WAF 无法识别其中的恶意内容。

2.使用换行符绕过 WAF 检测
攻击者可能会使用换行符来绕过 WAF 的检测。这是因为 WAF 通常只检查单个 HTTP 请求,而 SQL 查询通常跨越多个行。因此,攻击者可以使用换行符来将 SQL 查询拆分成多个行,以避免被 WAF 检测到。

3.使用 HTTP 动词绕过 WAF 检测
WAF 通常只检查 HTTP GET 和 POST 请求中的参数,而不会检查其他 HTTP 动词,例如 PUT、DELETE、OPTIONS 等。攻击者可能会使用这些未被检查的 HTTP 动词来提交恶意 SQL 查询,以避免被 WAF 检测到。

4.使用双重编码绕过 WAF 检测
攻击者可能会使用双重编码来绕过 WAF 的检测。例如,攻击者可能会将 SQL 查询使用 URL 编码进行编码,然后再对结果再进行一次 Base64 编码,以使 WAF 无法识别其中的恶意内容。

5.拆分字符串
将注入语句拆分为多个小的字符串,逐一传递给服务器执行,以此规避 WAF 的检测

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

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

相关文章

Pytorch 容器 - 2. Module的属性访问 modules(), children(), parameters(), buffers()等

目录 1. modules() 和 named_modules() 2. children() 和 named_children() 3. parameters() 和 named_parameters() 4. buffers() 和 named_buffers() Module类内置了很多函数&#xff0c;其中本文主要介绍常用的属性访问函数&#xff0c;包括&#xff1a; modules(), nam…

Spring事务源码-EnableTransactionManagement实现解析

Transactional注解 Transactional是spring中声明式事务管理的注解配置方式。Transactional注解可以帮助我们标注事务开启、提交、者回滚、事务传播、事务隔离、超时时间等操作。 而EnableTransactionManagement是开启Spring 事务的入口。 EnableTransactionManagement 标注启…

什么是数字人?数字人可以应用在哪些行业?

数字人指的是由计算机技术、人工智能技术和大数据技术等多种技术手段构建的一种虚拟的人类形态。数字人通常具备丰富的信息处理能力、模拟能力和学习能力&#xff0c;可以根据人们的需求进行智能化定制服务。 数字人 在很多行业领域&#xff0c;数字人都被广泛应用&#xff0…

【并发编程】ConcurrentHashMap源码分析(一)

ConcurrentHashMap源码分析CHM的使用CHM的存储结构和实现CHM源码put源码分析initTable 初始化tabletreeifyBin()和tryPresize()transfer 扩容和数据迁移高低位的迁移ConcurrentHashMap是一个高性能的&#xff0c;线程安全的HashMapHashTable线程安全&#xff0c;直接在get,put方…

spring security 的AuthenticationSuccessHandler 没有调用 ,无法生效

今天想不明白&#xff0c;我控制层写了一个登录的接口。结果验证成功了&#xff0c;我发现AuthenticationSuccessHandler 没有调用 &#xff0c;而且也不生效啊&#xff0c;最后研究终于发现是因为我们需要配置登录的url 这个url 我们访问&#xff0c;中间的什么控制器什么的框…

Win10怎么取消开机密码?这样做就可以!

集美们&#xff0c;我每次开电脑都要输入密码&#xff0c;感觉太麻烦了&#xff0c;想把开机密码取消掉&#xff0c;应该怎么做呀&#xff1f;感谢回答&#xff01;】 在Windows 10操作系统中&#xff0c;用户可以设置开机密码来保护计算机的安全性。然而&#xff0c;有时候用…

【CSS】使用绝对定位 / 浮动解决外边距塌陷问题 ( 为父容器 / 子元素设置内边距 / 边框 | 为子元素设置浮动 | 为子元素设置绝对定位 )

文章目录一、外边距塌陷描述1、没有塌陷的情况2、外边距塌陷情况二、传统方法解决外边距塌陷 - 为父容器 / 子元素设置内边距 / 边框三、使用浮动解决外边距塌陷 - 为子元素设置浮动四、使用绝对定位解决外边距塌陷 - 为子元素设置绝对定位一、外边距塌陷描述 在 标准流的父盒子…

AE开发20210601之绘制集合要素、绘制点、空间查询、属性查询、图形查询、选择集内容、符号化

AE开发之绘制集合要素绘制点步骤queryFilterQueryDefcursor查现有的SpatialRel可以有的空间关系有哪一些。Map类&#xff0c;对应的是FeatureSelection属性&#xff0c;SelectionCount属性&#xff0c;空间查询属性查询图形查询选择集内容符号化multiparrcolorRampLineSymbol下…

a标签 链接 target=”_blank” 为什么要增加 rel=”noopener noreferrer”

在<a></a>中使用target"_blank" 那么会得到以下错误提示&#xff1a; Using target"_blank" without rel"noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener [react/jsx-no-target-blank…

Golang流媒体实战之七:hls拉流服务源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Golang流媒体实战》系列的第七篇&#xff0c;继续学习一个重要且通用的知识点&#xff1a;hls拉流在《体验开源项目lal》一文中&#xff0…

两种方法实现杨辉三角(java实现)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

AI 作图绘画的软件和网址

软件分享 分享软件一&#xff1a;NovelAI NovelAI是一个用于ai写文章的工具&#xff0c;大家可以给它文章标题框架&#xff0c;让它生成文章。后来这款工具进行功能拓展&#xff0c;完成了ai绘画功能&#xff0c;它支持我们上传草图生成图片&#xff0c;也支持我们通过画面描…

计算机网络思维导图,快快收藏学习啦!

第一章&#xff08;概述&#xff09; P0 - 计算机网络<思维导图> 第二章&#xff08;物理层&#xff09; P1 - 计算机网络<思维导图> 便签中的内容&#xff1a; ①香农公式&#xff1a;CW*Log2(1S/N) (bit/s) C:极限传输速率 W:信道带宽(单位Hz) S:信道内所传…

graylog实现日志监控

graylog graylog是一个轻量级的日志管理工具,依托elasticsearch作为日志存储中间件,MongoDB作为元数据信息存储中间件.自带WEB-UI界面,LDAP整合各种日志类型.提供了日志收集、日志查询、监控告警等相关功能。提供了graylog sidecar通过sidecar模式可以很方便的收集目标主机、容…

UEFI Protocol

一、概述 二、Protocol的定义 1、Protocol是服务器端和客户端之间的一种约定&#xff0c;在软件编程上称为接口&#xff0c;服务器端和客户端通过这个约定信息的互通。 2、服务器端和客户端在UEFI中都是可执行的二进制文件。 3、为了实现这些二进制文件之间的互通&#xff0c;…

nginx反向代理_负载均衡的配置

说明 两台虚拟机&#xff1a; 88节点是自己的虚拟机 66节点是小组成员的虚拟机&#xff0c;我们暂且叫同学机 tomcat端口&#xff0c;分别为8081和8082 总结就是&#xff1a; 自己虚拟机上面安装nginx和tomcat8082 同学机上安装tomcat8081 一、开始安装nginx&#xff08;只安装…

香港布局Web3.0 既是金融试探,也是未来战略

香港Web3.0协会成立的消息已在业内刷屏&#xff0c;作为跨业界的非盈利机构&#xff0c;该协会致力于促进Web3.0生态环境的建设&#xff0c;港府特首李家超和北京中央驻港联络办公室部分领导均出席了成立典礼。 李家超在致辞中表示&#xff0c;Web3.0的发展正值黄金起点&#x…

Vue随记

1、Vue模板语法 Vue模板语法有两大类&#xff1a; 1.1、插值语法 功能&#xff1a;用于解析标签体内容。 写法&#xff1a;{{xxxx}}&#xff0c;xxxx是js表达式&#xff0c;且可以直接读取到data中的所有属性。 1.2、指令语法 功能&#xff1a;用于解析标签&#xff08;包…

《鸟哥的Linux私房菜-基础篇》学习笔记

主要用来记录学习&#xff0c;如果能帮助到你那最好了。 数据流重导向 概念 cat /etc/crontab /etc/vbirdsay 标准输出&#xff1a;将cat的文件输出到屏幕上 标准错误输出&#xff1a;无法找到文件报错 *系统会将标准输出和标注错误输出都输出到屏幕上&#xff0c;看着比较乱…

Vue双向数据绑定原理

一. Vue双向数据绑定原理 Vue.js的双向绑定是通过响应式原理实现的。响应式原理就是当数据发生改变时&#xff0c;自动更新相关的视图和数据。下面是Vue.js双向绑定的详细解释和介绍&#xff1a; Vue.js通过 Object.defineProperty() 将数据对象的属性值绑定到对应的DOM元素上…