这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Go 语言高级编程》2.1 os.Root 与受限文件系统
用 filepath.Join 拼接用户输入是经典的目录穿越漏洞。Go 1.24 引入 os.Root 把「只能访问某个目录树」做成内核级保证。本节实测相对路径、绝对路径、符号链接三种逃逸全部被挡在 root 之外,并给出 OpenRoot 的 1.24 版本证据与 1.25 方法集扩充(11→23 个方法)的对照。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
用 filepath.Join 拼接用户输入是经典的目录穿越漏洞。Go 1.24 引入 os.Root 把「只能访问某个目录树」做成内核级保证。本节实测相对路径、绝对路径、符号链接三种逃逸全部被挡在 root 之外,并给出 OpenRoot 的 1.24 版本证据与 1.25 方法集扩充(11→23 个方法)的对照。
从 minagent 全卷交付建立离线 ResearchCopilot 骨架,提供完整基础配置、桥接代码和 Python/Node 冒烟测试,明确打包、lint 与远程 CI 的待验证前提。
本节给 ResearchCopilot 画出四层边界:卷一的 minagent 引擎层、FastAPI 服务层、异步 worker 层、Postgres 加 Redis 的存储层。我们用一张 ASCII 图和一张职责表说清每层管什么、不该管什么,用可跑的检查脚本钉死依赖方向,并完整走一遍一个提问从进来到出结果、跨四层的时序。
本节为 ResearchCopilot 立下 3 个可验收的核心用例:单跳事实问答、多跳研究并输出带引用报告、后台周期 digest。每个用例都给出量化验收标准与落地章节映射,并明确列出不做通用聊天、不做 MCP Server 实现、不做多租户计费这三条边界,把项目范围钉死在可交付的一小块上。
TaskHub 依赖几十个模块,其中任何一个的已知漏洞都可能成为攻击面。本节实测 govulncheck v1.8.0 的三种扫描层级(module/package/symbol),用真实输出说明「模块有漏洞」与「你的代码真的调用了漏洞函数」的区别,并演示它如何顺带产出 SBOM 与 SARIF,接进 CI。
依赖不会永远停在原版本:要升级、要临时指向 fork、要让公司内网的私有仓库能被解析。本节实测 go get -u 与 -u=patch 的差异、replace 指向本地目录的效果,以及 GOPRIVATE/GONOPROXY/GONOSUMDB 三件套如何把私有模块从公共代理里摘出来,附 TaskHub 的升级纪律。
TaskHub 的四个模块各自声明依赖版本,冲突迟早会发生。本节用 x/text 与 x/net 两个真实模块实测最小版本选择的裁决过程:直接要求 v0.14.0 却因间接依赖被抬到 v0.19.0,再演示 go get 强制降级报错、go mod graph 定位引入者、exclude 干预的完整排查链路。
本节讲解服务进程如何正确地「活着」与「死去」:从 SIGTERM 信号处理、连接排空与资源释放的关闭流程,到 liveness、readiness、startup 三类健康检查的语义差异与实现方式。你将学会为数据库、缓存等依赖编写带超时的探活,并把探针与容器、编排系统配置对齐,避免发布期间丢请求或误判重启。
本节讲解 HTTP 服务的横切关注点如何组织:从洋葱模型与 Fastify hooks 的执行顺序,到用 AsyncLocalStorage 建立请求级上下文并贯穿日志与追踪,再到把认证结果类型安全地挂到请求对象上。你将掌握认证、校验、限流、错误收口四类中间件的写法与顺序约束,并学会避免重复执行与上下文丢失两类高频故障。
本节从 Node 原生 http 模块的类型缺口讲起,对比 Fastify 与 Hono 两套框架的路由声明、请求校验与类型推导方式。你将学会用 JSON Schema 与 Zod 让请求参数自动获得类型,用插件与分组路由组织大型服务的路由树,并理解 Web 标准 Request/Response 在边缘运行时上的取舍。读完后你能按部署形态选出合适框架,写出端到端类型安全的接口层。
本节用图书借阅服务的借阅流程,把单元、切片、集成、端到端四层测试的成本与收益逐项拆开,给出各层配比与 CI 分阶段执行命令,并对齐 Spring Boot 4.x 的测试注解口径(@MockitoBean、RestTestClient、@AutoConfigureMockMvc),最后讲清测试并行与上下文缓存的取舍。
图书服务要加一个管理页面,HTML、CSS、JS 与封面图该放哪、用什么 URL 访问?本节讲清 Spring Boot 四个默认静态资源目录及优先级、默认 /** 映射规则,区分 static-locations 与 static-path-pattern,并演示自定义映射、缓存控制与内容哈希指纹,最后说清静态资源与接口路径冲突时谁优先。
给测试体系补上三块短板:用 hypothesis 的性质测试突破手写用例的输入盲区并靠反例缩小定位真实缺陷,用 pytest-benchmark 把性能退化成一道可对比的门禁,用 pytest-cov 的覆盖率与 --cov-fail-under 卡住底线。
单元测试之外的第二层防线:先划清单元与集成的边界,再用 SQLite + fixture 在本机搭出可跑的等价数据层,讲透外层事务加 SAVEPOINT 的用例隔离,最后给出 testcontainers 真实容器环境的配置并明确标注未实测。
把 pytest 从「能跑」推到「可维护」:conftest.py 向上合并与就近覆盖、fixture 作用域与依赖注入、工厂型 fixture 避免共享可变状态,再把约定写进 pyproject.toml,最后用一个本地 conftest 插件和实测插件清单收尾。
本节把 TaskAPI 的 add、list、toggle 抽成真正的函数:先讲函数签名与多返回值为何是 Go 的错误传递方式,再讲命名返回值、可变参数与闭包;随后重点拆解 defer 的 LIFO 顺序和「参数立即求值」这一最容易踩的坑,最后用三个函数重写命令派发器并实测运行。
本节用 TaskAPI 的 list 命令把 Go 的控制流走一遍:if 的初始化语句、for 的三种写法、range 遍历切片与 map 的差异、带标签的 break/continue,以及默认不穿透的 switch 的四种形态;最后把 os.Args 接到一个 switch 派发器上,让 add/list/toggle 真正能跑起来。
本节为 TaskAPI 定义第一个数据结构:先用 var 与 := 的四种写法引出 Go 的零值哲学,再对照列出 bool、string、各类整数、float、byte 与 rune 的取值与默认值,讲清「没有隐式转换」意味着什么;随后用 const 与 iota 给任务状态建模,最后落定 Task 三个字段的类型选择。
本节写下全书的测试基石 FakeModel:一个按脚本列表吐响应的假模型,脚本元素可以是文本、ToolCall 列表或 ModelResponse,它记录每次调用入参、脚本耗尽即抛 RuntimeError。随后用一个极简循环跑通「add 到 mul 再文本收敛」,打印完整轨迹并断言两次运行逐字节一致。
定义内部消息、工具调用与模型响应,提供可直接保存的完整文件,验证纯文本和文本/工具混合消息的序列化往返,并说明静态类型与供应商格式的边界。