Go os.Root 预防路径遍历最佳实践
最近在撰写的 Go 后端使用到大量的本地文件访问,其中最需要被防范的问题之一就是「路径遍历」。而在 Go 1.24 新增了 `os.Root` API 简洁优雅地避免安全问题。可以考虑所有 `os.Open` 的使用场景是否安全,并替换为 `os.Root` 确保「操作不应访问该目录之外的文件」。
最近在撰写的 Go 后端使用到大量的本地文件访问,其中最需要被防范的问题之一就是「路径遍历」。而在 Go 1.24 新增了 `os.Root` API 简洁优雅地避免安全问题。可以考虑所有 `os.Open` 的使用场景是否安全,并替换为 `os.Root` 确保「操作不应访问该目录之外的文件」。
还记得小时候的电脑都是 32-bits 的系统,大约在 win7 的时代已经逐步的替换成 64-bits 系统了,但我还是不了解具体来说有什么差异,只记得有段时间有两种软体规格可以选择,或是某些软体需要用「兼容模式」来执行。
当处理多个加解密应用时我纳闷:「多一份金钥需要管理,意味着多一个需要防守的东西」、「如何避免用户使用一串非常简单的金钥让破解变得非常容易」。而正好有个专门的算法:金钥衍生函式 Key Derivation Function 正是为此类问题而生。
在学习 Go 时会了解到 `struct` 其实就是一串自订的资料结构,而其中栏位的「顺序」将直接影响到在内存中所占用的实际大小甚至程式的速度。了解内存对齐的概念除了「节省空间」外也能为打造「更佳的缓存局部性(Cache locality)」。
近期在开发 Go 专案时发现到提交代码流程总是有些摩擦,像是开发时习惯用 Tab 到 GitLab 上宽度就会变得很奇怪,或是一些简单的对齐问题都在无形消耗专注力。所以透过把一些原生的 Go 静态检查工具搬到 CI 上执行,确保统一的开发体验。
最近有较多的时间思考开发上的最佳实践,考虑到目前开发的一个后端项目基本就是拿 go 原生的 log 到处打印储存片面状态而已。在阅读一些文件与最佳实践后,我想着手改善现有的 logging 体验透过导入 Go 1.21 引入的原生 slog 库。
Redis 是十分常见的 In-Memory 资料库,工作上时不时会碰到它但很少仔细从头了解它,所以透过撰写重现一些案例达成更深刻的理解。缓存就是把常存取的资料放在能够快速获取的地方,缺点是记忆体不像硬碟适合长久保存资料,但不管是提高速度、降低延迟、降低负担或减轻成本⋯⋯缓存都是很棒的选择。
相较于 C 读取未定义数值的变数会造成安全漏洞或崩溃,或是动态语言如 JavaScript 没有数值型别初始化的问题,Go 的设计上就自动赋予了确定意义的数值避免出错与创建即可使用。具体来说在例如使用 json 反射的标签中 `omitempty` 也正是运用了 Zero Value 的概念来判断。
虽然在 AI 出现之前很难想像,但 2026 年工作上我已经很少「手写程式」而是透过 AI 更有效率的辅助开发,我相信在 AI 百家争鸣的时代不用特别执着用哪个模型或工具,挑个最新顺手的免费方案就够了,未来模型只会更便宜更有效率。
前端测试主要重点在与浏览器打交道(Jsdom、Headless Browser)且通常只与单一后端进行沟通,而后端测试则是面临截然不同的难题:分散服务与状态。这篇文章介绍实战上我如何透过 Testcontainers 创建 Docker 测试环境来达成完整的后端整合测试流程。
AES(Advanced Encryption Standard)是最广泛使用的对称加密,HTTPS/TLS、Wi-Fi(WPA2/3)、全硬盘加密(BitLocker、FileVault)……通过理解 AES 如何运作有助于了解现代安全加密如何实践。
不同网站的密码需要管理,不仅容易忘记,也存在被窃取或重复使用的风险。如果只需要扫描指纹或使用面部识别,就能立即完成注册与登录——这正是 FIDO(Fast IDentity Online)所推动的“无密码身份验证”愿景。
最近在写 Go 测试时发现官方与社群中有一种大力推崇的惯例:TableDrivenTest,我一直以为测试应该要保持简单愚蠢,但这种做法让我想到程式人的三大美德之一:「懒惰」。可能是因为这种模式通常只是测试框架包装下的方便手段,而 Go 社群文化下人人对于追求简单程式有一种莫名的执着。
纪录近期从 JavaScript 迁移到 Go 的过程中实践 Set 资料结构的方式。先前代码使用 JavaScript Set 来实现不重复资料定义,但在 Go 语言当中并没有实践 Set 资料结构,但我们可以透过改造 map 来实践。
纪录使用到其中一项 Go 1.16 的 embed 功能,可以把任何档案在编译时就包进去,进而不用烦恼路径与环境问题。如果资料需要在 runtime 被修改,那就不适合使用 embed,但如果它是「版本的一部分」,那 embed 是更安全的选择。