Blog Cover

解析器的代际战争:为什么GCC和Clang都选择了手写解析器

1975年,贝尔实验室的Stephen Johnson做出了一个决定:将C编译器从手写递归下降解析器切换到DeRemer的LALR算法。这是Unix历史上第一次大规模采用自动生成的解析器。然而不到二十年,GCC项目反其道而行之,重新改用手写解析器。Clang紧随其后。直到今天,几乎所有主流编译器——GCC、Clang、V8、Lua——都使用手写递归下降解析器。为什么解析器生成器在工业界遭遇滑铁卢?这场跨越半个世纪的"代际战争"背后,隐藏着怎样的技术权衡? ...

16 min · 7517 words

当密钥逃离JavaScript:Web Crypto API设计背后的安全哲学

2012年12月,第29届混沌通信大会(29C3)在汉堡举行。Harry Halpin在演讲中抛出一个颇具挑衅意味的标题——“Re-igniting the Crypto Wars on the Web”(在Web上重新点燃密码学战争)。这不是耸人听闻。当时的背景是:斯诺登事件尚未爆发,但全球范围内的网络监控已成公开的秘密。Web应用亟需端到端加密能力,而JavaScript却在这方面显得力不从心。 ...

14 min · 6622 words

一个查询如何让数据库负载暴增一万倍:GraphQL DoS攻击的技术本质

2019年,GitHub收到了一个看似普通的GraphQL查询。这个查询只有几十行,结构清晰,语法正确。但GitHub的工程师很快发现,执行这个查询会导致服务器资源消耗呈指数级增长——理论上的最大返回数据量超过200亿条记录。这不是编码错误,而是GraphQL设计哲学中固有的安全困境。 ...

7 min · 3372 words

Unix信号的底层真相:从Ctrl+C到内核中断处理的技术全景

当你按下Ctrl+C时,终端里的程序就停止了。这个每天都在发生的操作背后,是Unix操作系统最古老也最精妙的进程间通信机制——信号(Signal)。 ...

12 min · 5686 words

URL解析的技术本质——从字符串到网络请求的完整实现链路

一个URL能被解析出多少种不同的结果?答案可能会让你感到意外。 2022年,安全研究人员Joshua Reynolds等人发表了一篇题为《Equivocal URLs: Understanding the Fragmented Space of URL Parser Implementations》的学术论文。他们对15个主流URL解析器进行了系统测试,发现了一个令人震惊的事实:针对同一个URL,不同解析器给出的主机名竟然可以完全不同。更严重的是,某些情况下这种差异会被攻击者利用,绕过Google Safe Browsing和VirusTotal等安全检测系统。 ...

15 min · 7083 words

前端错误监控的技术本质:从捕获堆栈到Source Map解析的完整链路

一个周五的下午,生产环境突然报告了2000多次相同的JavaScript错误,但当你打开错误详情时,看到的却是压缩后的代码:at a.xh in main.abc123.js:1:2345。这种场景在前端开发中再熟悉不过——压缩代码抹去了所有有意义的标识符,堆栈追踪变成了一串无意义的字符。而当你费尽周折找到对应的源码文件,手动计算行列号后,发现这个"严重错误"不过是某个边界条件的空值检查。错误监控系统的价值不言而喻,但它的技术实现远比想象中复杂。从错误捕获到堆栈还原,从错误聚合到安全上报,每一个环节都藏着值得深挖的技术细节。 ...

15 min · 7091 words

CSS Houdini:浏览器渲染引擎的「后门」如何让开发者突破CSS的边界

2018年,当CSS Paint API首次在Chrome 65中落地时,很多开发者可能没有意识到,这标志着Web开发进入了一个全新的阶段——浏览器终于向开发者敞开了渲染引擎的「后门」。 ...

9 min · 4348 words