PHP代码审计实战:六类致命反模式与漏洞挖掘指南
前阵子给一套老系统做例行排查翻到一个导出模块的时候我看到了那行再熟悉不过的代码一段从GET参数拿来的字符串被直接拼进了一条SQL查询然后mysqli_query一把梭。看到它的瞬间我的脑子里冒出了两句话——代码如诗漏洞如刀。这行代码写得很顺眼变量命名也规范注释甚至还是中文的但正是这种“看起来没毛病”的写法是最典型的PHP致命反模式。它会在某个不起眼的参数位埋下一条通向整个数据库的通道。这篇文章想聊的就是这类反模式它们长什么样、为什么会产生、危害到底有多大、以及作为审计者该怎么在成千上万行代码里把它们精准捞出来。不管你是刚接触代码审计的新手还是维护老项目到想骂人的开发者我都建议你花十分钟看完。1. 先看懂审计的对象反模式为什么比Bug更危险先纠正一个概念。很多人听到“漏洞”两个字第一反应是某个函数写错了或者说某个逻辑在特殊输入下崩溃了。这种理解没错但太浅。真正的安全问题是反模式——一种长期沉淀下来的、看起来合理但系统性不安全的写法习惯。Bug是一次性的意外修一处就完了反模式是结构性的趋势它会顺着开发者的思维惯性不断繁殖。1.1 反模式是什么为什么它比Bug更阴险我习惯把反模式分成三个层次来看。第一层是风格层比如函数之间职责不清、全局变量满天飞、错误处理全靠die。这种层次的问题不直接产生漏洞但会让后续开发者在上面不断叠加补丁补丁叠到一定厚度漏洞就会从缝隙里长出来。我在审计中见过不止一次某个公共函数原本只做两件事后来硬生生被塞进去六七个参数而新参数往往就没做过校验。第二层是数据流层比如用户输入没有经过任何净化就直接进入敏感操作。数据流像一条没有闸门的河流暴雨一来就漫堤。这一层是最容易被工具发现、也最容易被修复的但现实中偏偏大量存在。原因是很多开发者写的代码“能跑”单测也不覆盖恶意输入于是这条危险的管道就一直通着。第三层是思维层这是最可怕的。有些开发者从入行就习惯了拼接SQL他觉得这就是PHP的标准写法有些人认为只要加一个md5加密就很安全还有些人觉得服务器是内网的、IP是私有的、用的人少没有谁会来攻击。于是安全变成了“以后再说”的事。这三层之中第三层最难修。你可以在一个文件里改掉拼接SQL但你没法在一个文件里改掉开发者根深蒂固的思维惯性。审计的意义也恰恰在于把这种惯性暴露出来用可复现的证据倒逼团队改变习惯。1.2 审计的三种视角语法、数据流、业务逻辑做审计这么多年我把整个动作拆成三条线。语法线最简单交给工具就好。凡是嵌套括号、未定义变量、函数调用参数不匹配这类低级问题没有一个称职的解释器能逃过检查。这条线解决的问题是“代码能不能跑”。数据流线就要花心思了。核心思路是所谓的“污点追踪”从一个外部输入源出发比如$_GET、$_POST、$_COOKIE、文件上传、HTTP头沿着变量赋值和函数调用一路往下走看它最终落进了哪些敏感操作比如SQL查询、文件读写、命令执行、反序列化。这条线解决的是“代码会被谁影响”。业务逻辑线最难需要人的推理。比如一个越权接口它没有使用任何危险函数所有参数校验也做了但在两个接口的组合里先改完自己的信息再改别人的信息A接口修改了B接口复用的某条缓存导致判断条件被绕过。这类问题几乎不可能被静态工具发现只能靠审计者对人性的理解。我的经验是三条线里至少要把数据流线练成肌肉记忆。审任何一个文件脑子里要自动形成一张图输入从哪个门进来中间过了哪些关卡最后砸在哪个敏感操作上。没有这个习惯审计就只能靠碰运气。1.3 PHP老项目为什么特别容易长出反模式不是PHP本身有什么原罪而是历史积累太厚。早期PHP流行的时候一个项目从0到上线可能只需要一个周末。开发速度太快安全性根本来不及考虑“能跑就行”成了贴在这门语言身上的标签。加上PHP的弱类型特性变量可以随时从未定义状态变成字符串、数组甚至对象这让很多隐蔽的绕过手法有了生存空间。还有一个细节容易被忽略PHP项目迭代过程中会沉淀大量“一次性代码”。谁离职前临时改了一个接口谁赶工期加了一个参数代码里到处都是这种缝缝补补的痕迹。我做审计时最常看到的场景是某个老旧的公共函数被十几个模块调用其中九个调用是安全的但只要有第十个调用把用户输入原样传了进来整个函数就成了漏洞点。这种叠加效应正是老项目里反模式越积越多的根本原因。所以面对老项目时我不会上来就喷代码烂。更多时候我会感叹能在一堆历史债务里维持业务正常运行本身就不容易。审计者的职责不是指责而是帮团队把埋在最深处的雷拆掉。2. 致命反模式清单六类最该警惕的代码习惯下面列出的六类反模式是我在这么多年的审计工作中见到最多、危害最大的。它们不是某个框架、某种写法独有的而是几乎贯穿所有PHP项目的通病。每一条我都会配上示例代码并解释漏洞的原理和修复思路。这六类不是穷尽但如果你能把它们记牢已经能防住绝大多数常见攻击。2.1 拼接型SQL最经典的注入温床看下面这段代码。它简洁、直观、读起来完全没有障碍——如果只看表面你甚至会认为这是个不错的写法。$username $_POST[username]; $password $_POST[password]; $sql SELECT * FROM admin WHERE username {$username} AND password {$password}; $result mysqli_query($conn, $sql);问题出在哪出在$username和$password是外部输入却被当成了SQL语句的一部分。当攻击者输入admin --时闭合掉前面的引号后面所有内容被注释掉SQL变成SELECT * FROM admin WHERE username admin -- AND password xxx等于直接告诉他别人不检查密码也能进后台。更离谱的输入是 OR 11#会把查询条件彻底废掉整张表的数据都暴露出来。这类漏洞的危害取决于数据库里的数据小到用户手机号大到后台管理员的全部权限全看攻击者想拿什么。修复方法只有一个正解参数化查询。用PDO预处理的写法把变量作为参数绑定而不是拼进SQL语句$stmt $pdo-prepare(SELECT * FROM admin WHERE username :u AND password :p); $stmt-execute([:u $username, :p $password]);原理很简单参数化之后数据库引擎会把查询结构和参数值严格分开输入再奇形怪状也永远只是“一个值”不可能改变查询逻辑。我审计时的红线就是任何SQL语句里出现变量拼接不管它在什么上下文里、加了什么过滤一律按当前环境下的高危漏洞处理。2.2 命令执行与动态调用RCE的直通车命令执行类反模式有两种常见形态。这里的RCE指的是远程代码执行意思是攻击者能在目标机器上运行他自己选择的代码危害等级是所有漏洞类型里最高的。第一种是直接把外部输入拼进系统命令$ip $_GET[ip]; $result shell_exec(ping -c 1 . $ip);攻击者传127.0.0.1; cat /etc/passwd分号后面的部分就会被当作新命令执行。这类代码我经常在日志分析、在线测试、运维辅助这类小工具里碰到危害极大。因为一旦命令注入成立攻击者拿到的就是整个服务器的控制权。第二种是动态调用函数$action $_GET[action]; call_user_func($action);输入phpinfo就能直接执行信息收集输入system(ls)就能执行系统命令。更隐蔽的是通过数组参数调用对象的任意方法$method $_GET[method]; $obj-$method();推荐做法是白名单调用。把所有允许的action写成一个数组只放行白名单里的值$allowed [profile, settings, logout]; if (in_array($action, $allowed, true)) { // 正常业务逻辑 } else { // 拒绝请求 }严格模式的三参in_array很重要否则攻击者传一个0、true这类弱类型值照样能钻空子。2.3 文件操作不设防路径穿越与任意上传文件类反模式里我印象最深的是这种动态包含$page $_GET[page]; include(./templates/ . $page . .php);攻击者传../../etc/passwd%00之类的值就能够穿越目录读取敏感文件。虽然现在新版PHP已经不允许路径中的空字节但路径穿越本身依然可行。更隐蔽的是把$page设为一张合法页面以外的内容配合文件上传功能直接包含攻击者自己上传的恶意脚本。文件上传的反模式同样泛滥if (in_array($ext, [php, php5, phtml])) { die(禁止上传); }这是一个典型的黑名单思路。问题在于黑名单永远写不全php3、php4、pht都是PHP会解析的扩展名上传后文件落在web目录下再用短文件名、双写后缀、大小写绕过再不行就绕一圈先把.htaccess传上去改规则。我见过太多以为“过滤了php就安全”的代码被花式打穿。正确姿势是白名单只允许你明确知道的图片扩展名并且重命名文件让文件名只保留随机字符串加白名单扩展名同时把存储位置移到web根目录之外通过独立接口输出文件。三管齐下这条路才基本封死。2.4 反序列化滥用对象注入的隐蔽入口反序列化漏洞在PHP里曾经被玩出过花。它的根因很简单unserialize函数在恢复对象时会调用对象中某些方法的魔术方法比如__wakeup、__destruct、__toString。如果这些方法内部执行了危险操作——比如文件删除、命令执行、SQL查询——经过精心构造的序列化数据就能让这些方法在特定条件下被触发。典型的危险场景是这种$data $_COOKIE[user]; $user unserialize($data);Cookie是用户可完全控制的。一旦攻击者发现目标项目里存在一个带有危险魔术方法的类他就可以构造一个序列化对象把user这个Cookie替换成攻击数据让对象在被还原的瞬间执行指定操作。修复的办法不是把所有魔术方法删掉而是从根源上避免反序列化不可信数据。能不用unserialize就不用改成JSON传输结构是最直接的替代方案。如果确实要反序列化至少要把数据来源限定在服务端签名过的密文里并且对允许的类做白名单限制。这个反模式特别隐蔽因为它的触发点往往离入口很远很多时候你以为在格式化数据实际上已经被攻击者牵着走了。2.5 弱比较与请求数据滥用逻辑绕过的元凶PHP的弱类型比较是我在教学中特别强调的一点也是新手最容易踩的坑if ($_POST[is_admin] true) { // 进入管理员逻辑 }攻击者只要传is_admin1就绕过了这个判断。更经典的案例是strcmpif (strcmp($_POST[password], $real_password) 0) { // 登录成功 }PHP 5.x时代strcmp在比较数组和字符串时会产生“不可预料”的行为传一个数组参数就能让比较结果变成非零具体行为在不同版本上还不一样。这类问题在PHP 8之后虽然收敛了不少但大量历史遗留项目还在跑老版本这些坑依然真实存在。再比如过度信任请求参数$role $_GET[role] ?? $_SESSION[role];有的项目把用户角色直接放在请求参数里等于把权限开关递到了攻击者手里。这类逻辑绕过比技术漏洞更难发现因为代码本身的写法没有任何“错误”但业务上的信任边界全乱了。审计时遇到这类“请求参数参与权限判断”的写法我会直接标成越权风险点。2.6 黑名单过滤与宽松正则越过滤越危险最后这一类是被我单独拎出来说的因为它的迷惑性非常强。看这段$input $_POST[content]; $blocked [select, insert, update, delete, union]; foreach ($blocked as $b) { if (stripos($input, $b) ! false) { die(非法字符); } }表面上看它在拦截SQL关键字实际上等于告诉攻击者你们必须绕过这些词才能成功。于是大小写变种、注释分割、URL编码、二次编码、同义词变换所有绕过手法轮番上阵。最讽刺的是这类过滤代码本身还会成为新的攻击面——比如攻击者发现过滤器把select替换成了空字符他就传seselectlect过滤后变成select过滤器反而帮攻击者完成了脱壳。正确的方向永远是白名单校验加参数化而不是黑名单加转义。允许的东西写明确不允许的东西根本不用说因为不在白名单里的全部拒绝。这个原则在SQL、命令执行、文件上传、模板渲染里全部适用。3. 实操拆解搭一个审计工作台亲手挖出三处漏洞理论聊多了容易飘这一节我带你走一遍完整实操。我会用一台本地沙箱、一套命令行工具链审计一个我自己搭的模拟项目——某后台用户管理模块。这个模块故意写得很像真实开发中的样子里面埋了三处反模式对应前面说的三类漏洞。整个过程不需要商业级工具全部用免费、常见的东西就能完成。3.1 环境准备一个隔离的PHP审计沙箱审计和写业务是两个物种建议一定用隔离环境别拿生产库做练习。我在本机的虚拟环境里做四件事装一套PHP环境、启用调试扩展、装一个抓包代理、再配一个能做全局搜索的编辑器。PHP环境的版本尽量贴近目标的线上版本因为弱类型比较、反序列化行为在不同版本差异很大5.x和8.x的坑完全不是一回事。调试扩展是审计的神器它可以在断点处停住逐行看变量的值尤其适合分析复杂的数据流当一个输入参数穿过三个函数之后到底变成了什么把握不住这个你很难判断漏洞真实可不可利用。抓包代理则用来改写请求、反复测试输入模拟攻击者视角。全局搜索工具负责第一轮扫描我用的是系统自带的命令行搜索加正则后面再上一轮静态扫描器。整体思路是“从粗到细、逐层收缩”而不是指望某一个工具解决所有问题。3.2 第一轮筛选用模式匹配快速圈定危险函数先放一组我常用的检索命令用来把危险函数全部揪出来grep -rn -E (system|shell_exec|exec|passthru|popen|proc_open) --include*.php . grep -rn -E (mysqli_query|mysql_query|query) --include*.php . grep -rn -E (unserialize|include|require|file_get_contents|readfile) --include*.php . grep -rn -E (\$_GET|\$_POST|\$_COOKIE|\$_REQUEST) --include*.php .第一轮扫描肯定会带来大量命中因为现代框架里到处都是include和query别被吓到。关键是做交集同时出现在“危险函数”和“外部输入”两个集合里的代码行才是优先重点。我一般会在输出里直接交叉人工过滤一遍注释、框架自身调用和明显的死代码剩下的就进入第二轮。需要提醒的是正则搜索永远只能帮你缩小范围。真正判断一个点是否可以利用还是要回到数据流和业务逻辑。工具负责抛线索经验负责定案。3.3 逐行分析一个“三毒俱全”的示例模块下面是这个模拟项目X的用户管理模块代码我故意写成真实项目中随处可见的样子?php session_start(); $db new mysqli(127.0.0.1, root, , demo); $action $_GET[action] ?? profile; $id $_GET[id] ?? ; function getUserById($db, $id) { $sql SELECT * FROM users WHERE id . $id; $result $db-query($sql); return $result-fetch_assoc(); } function renderTemplate($file) { include(./templates/ . $file . .php); } if (($_COOKIE[role] ?? ) admin) { echo 当前用户拥有管理员权限; } $user getUserById($db, $id); renderTemplate(profile);逐个拆。第一处毒点getUserById里的拼接SQL。$id直接来自$_GET没有任何净化就进入查询。构造id1 union select 1,user(),3数据库会老老实实地把所有信息交出来。修复方案就是把query换成预处理语句配合参数绑定。第二处毒点renderTemplate里的动态包含。$_GET[action]如果被传进来会被拼进模板路径。虽然代码里固定了./templates/前缀和.php后缀但攻击者完全可以通过目录穿越读系统文件或者配合上传功能包含恶意脚本。修复方案是白名单映射只放行预设的模板名其余全部拒绝。第三处毒点$_COOKIE[role] admin的权限判断。Cookie完全由客户端控制攻击者把Cookie改成roleadmin就直接获得管理员权限。这里应该用服务端Session保存角色而不是信任Cookie里的任何字段。整个模块只有20多行却藏了三种致命反模式。这就是为什么我说“代码如诗、漏洞如刀”——诗的韵律藏在表面刀的锋利藏在暗处。审计时最怕的就是这种看起来人畜无害的小模块因为它不上心、不设防反而最容易被当突破口。3.4 输出审计报告从发现漏洞到给出修复方案一轮审计完必须产出一份能让开发团队直接照做的报告。我习惯用五要素格式漏洞编号、风险等级、影响范围、复现步骤、修复方案。编号位置风险等级影响范围复现步骤修复方案X-01getUserById高全库数据泄露、后台被接管请求/user?actionprofileid1 union select...改用PDO预处理绑定参数X-02renderTemplate高任意文件读取、远程代码执行请求/user?action../../config/private模板白名单映射禁止拼接路径X-03Cookie角色判断中越权访问管理员功能修改Cookieroleadmin改用Session保存角色并在服务端二次校验报告里的“复现步骤”必须精确最好附上完整的请求示例。还有一个经验每条漏洞都要给出至少一种修复方案而不是只丢一句“请修复”。这决定了报告是被放进归档文件夹还是被执行。我见过太多安全报告写得像体检单——只告诉你有什么病不给治疗方案那除了增加焦虑没有任何意义。4. 踩坑实录审计中常见问题与排查技巧做审计久了你会发现大部分时间不是在“找漏洞”而是在跟各种干扰因素缠斗。这一节把我踩过的坑和总结出的技巧直接写出来有些是工具层面有些是思维层面全是可以直接套用的经验。4.1 过滤函数为何屡屡形同虚设很多开发者会问我明明加了过滤为什么还是被打穿了答案通常是“过滤的思路错了”。最常见的姿势是只转义单引号然后传入双引号包裹的SQL串。比如$name str_replace(, , $_GET[name]); $sql SELECT * FROM users WHERE name \$name\;单引号被处理了但攻击者根本不需要单引号。在双引号字符串里\和$才是关键。构造\放在双引号前就可以闭合字符串、逃逸出SQL上下文。这类问题在代码审计中非常高频因为它表面上确实做了过滤代码评审时还常常被当成“正确示例”。第二个常见姿势是数组参数绕过。函数在接收标量时做了过滤但攻击者把参数改成数组过滤函数直接返回空值或者报错跳过下游代码再拿到数组强行拼接成SQL照样注入。所以审计时要专门盯那些参数类型是string、但业务上能接受数组的场景。第三个是编码问题。攻击者用URL编码、二次编码、宽字符编码组合把危险字符藏过一层过滤到数据库端再还原成原始形态。这个点需要审计者对编码链路有整体理解没有捷径。我自己的办法是凡是过滤点和下游消费点存在编码切换——比如UTF-8到GBK、URL解码到SQL解析——就一定要警惕这里往往是过滤失效的重灾区。4.2 误报与漏报工具是拐杖经验才是腿静态扫描工具最大的痛点是误报率高。注释里的示例代码、明显死代码、第三方依赖源码都会被当成“可疑流量”汇报出来。我见过有人拿到一份扫描报告上千条告警里只有两三条是真的如果不懂得过滤团队很快会对安全报告产生疲劳真正的问题就会被淹没。误报的反面是漏报。最严重的漏报场景是数据流跨越了多个文件输入在A文件接收传给B文件的函数再在C文件里进入SQL。单文件扫描工具根本追不出这条链路。我处理这类问题时会在追不到的地方手动画调用关系顺着函数名和参数在项目里全局检索直到把整条数据流走通。经验上我总结了一条筛选铁律优先处理“外部输入能够直接到达敏感操作、中间没有任何正面的白名单校验”的路径其次再看有过滤但可绕过的情况。按这个优先级排序能把有限的精力花在真正要命的地方而不是陷在工具报告里出不来。4.3 速查表从异常现象反向定位反模式审计过程中经常会遇到一种情况你不确定某个现象对应什么漏洞。我整理了一张速查表帮助你从“症状”反推“病灶”异常现象可能的病根优先排查位置URL里传参数后页面报SQL语法错误拼接型SQL注入所有调用mysqli_query、query且参数来自外部输入的位置上传图片变成可执行脚本黑名单过滤、存储位置不当上传接口的扩展名校验逻辑与web目录权限修改请求参数后能看到其他用户数据越权、未校验文件路径读取数据库或文件的接口检查是否按权限过滤用户Cookie被篡改后权限上升信任客户端存储所有从$_COOKIE读取角色、权限的判断点页面正常但日志里出现异常命令命令注入、动态调用所有调用shell_exec、exec、call_user_func且接收外部参数的位置接口收到序列化数据后触发异常反序列化漏洞所有调用unserialize的位置重点检查其数据来源这张表不可能覆盖所有情况但能帮你从“症状”快速定位到“可疑代码块”避免在无关代码上浪费太多时间。我一般把它做成备忘录贴在工位旁边审到卡壳的时候瞄一眼经常能打开思路。最后说点个人体会。我做了这么多年审计最深的感受是代码审计的目标不是把开发团队骂一顿也不是展示自己有多厉害而是帮助团队意识到安全不是写在某个安全函数里而是写在每一个变量的来源和去向里。“代码如诗漏洞如刀”这句话对我来说是一句职业警醒——写代码的时候多问一句“这个变量从哪来”比事后刷一百次漏洞报告都管用。补充一个小技巧如果项目用了版本控制记得翻一翻提交历史。很多反模式是某次紧急修复时临时引入的提交信息里往往写着“快速修复bug”“临时方案”。优先审计这些变更经常能发现意想不到的收获。我自己就曾经在一段写着“临时修复线上问题”的提交记录里找出过两个高危漏洞。所以别放过历史提交它们才是反模式最集中的藏身地。

相关新闻

从零开始写第一篇博客:选题、结构、可读性与发布心态全攻略

从零开始写第一篇博客:选题、结构、可读性与发布心态全攻略

说起第一篇博客,我到现在还记得当时的窘迫。打开编辑器,盯着空白页发呆,光标一闪一闪的,像在嘲笑我。脑子里明明有七八个想写的话题,可真要落笔,又觉得哪个都不够分量,哪个都怕写砸了。那篇&quo…

2026/10/18 6:46:54 阅读更多 →
Java 项目实战: 交友项目:登录链路回顾与今日任务地图

Java 项目实战: 交友项目:登录链路回顾与今日任务地图

概述 之前搭好了工程骨架并跑通了"验证码登录"这条完整链路;今天要做的是在这条链路之上把用户资料补齐——文件存储、人脸识别、资料保存与头像上传,外加两项横切优化(统一 token 处理、统一异常处理)。本文以回顾之前…

2026/10/18 6:46:54 阅读更多 →
Swift iOS语音识别实战:Speech框架实时转文字与文件转写指南

Swift iOS语音识别实战:Speech框架实时转文字与文件转写指南

语音识别在 iOS 上做起来,其实没有想象中那么玄乎。用 Swift 接系统自带的 Speech 框架,一个实时转文字的 Demo 快的话半天就能跑通。我最早接触这个需求,是给某内部工具加一个“语音口述记录”的入口。当时也纠结过要不要接第三方语音服务&a…

2026/10/18 6:46:54 阅读更多 →

最新新闻

AI Agent Harness 多终端同步管控:把 Codex auth.json 改到 TaoToken 的实操大纲

AI Agent Harness 多终端同步管控:把 Codex auth.json 改到 TaoToken 的实操大纲

/* 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 22:45:50 阅读更多 →
C 语言与 Python 语言分别代表了系统级编程与高级通用编程两种截然不同的设计哲学

C 语言与 Python 语言分别代表了系统级编程与高级通用编程两种截然不同的设计哲学

C 语言与 Python 语言分别代表了系统级编程与高级通用编程两种截然不同的设计哲学。C 语言诞生于 1970 年代的贝尔实验室,以接近硬件、执行高效、可移植性强著称,长期是操作系统、嵌入式系统、驱动程序和高性能计算领域的首选语言。 Python 则是一种解释…

2026/10/18 22:45:50 阅读更多 →
PHP 仍然驱动着全球约 77% 的网站,在 CMS 和传统 Web 开发领域保有巨大存量

PHP 仍然驱动着全球约 77% 的网站,在 CMS 和传统 Web 开发领域保有巨大存量

在 2026 年的编程语言格局中,Python 与 PHP 代表了两种截然不同的技术路线。根据 TIOBE 2026 年 10 月排行榜,Python 以 19.23% 的占比位居第一,而 PHP 以 1.26% 排在第十二位。然而,PHP 仍然驱动着全球约 77% 的网站,…

2026/10/18 22:45:50 阅读更多 →
工业相机SDK适配实战:一套架构兼容Basler、海康、堡盟

工业相机SDK适配实战:一套架构兼容Basler、海康、堡盟

很多搞机器视觉的朋友都经历过这种场景:项目做到一半,甲方说“现场临时变更,相机换成海康的”,或者“第二套设备要用堡盟的,因为供货周期短”。乍一听只是换个硬件,实际上等于把图像采集这块代码推倒重来。…

2026/10/18 22:45:50 阅读更多 →
Spring Boot + MyBatis-Plus 实战:从 CRUD 到分页、乐观锁与代码生成器

Spring Boot + MyBatis-Plus 实战:从 CRUD 到分页、乐观锁与代码生成器

简介:一份面向Java后端开发者的Spring Boot与MyBatis-Plus整合实践资源。资源围绕企业级应用快速开发场景,展示如何利用Spring Boot的自动配置与起步依赖,以及MyBatis-Plus的CRUD接口、代码生成、分页与逻辑删除等特性,帮助读者摆…

2026/10/18 22:45:50 阅读更多 →
AI重塑编程行业:从LLM代码生成到可视化数据,附可复用代码案例与TaoToken统一API接入实践

AI重塑编程行业:从LLM代码生成到可视化数据,附可复用代码案例与TaoToken统一API接入实践

/* 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 22:44:48 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →