阅读视图

发现新文章,点击刷新页面。
🔲 ☆

xlua学习笔记

文件加载

使用LuaEnv中的DoString方法来执行Lua脚本。
因为创建一个LuaEnv相当于创建了一个lua虚拟机,所以一个游戏最好只有一个LuaEnv。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 执行lua代码
env.DoString("print(\"Hello World\")");

// 通过文件执行lua代码
TextAsset ta = Resources.Load<TextAsset>("Lua/helloworld.lua");
env.DoString(ta.text);

// 通过默认Loader执行lua代码
env.DoString("require 'Lua/helloworld'");

// 通过自定义Loader执行lua代码
// require实际上是调一个个的Loader去加载,有一个成功就不再往下尝试,全失败则报文件找不到。
private byte[] LuaLoader(ref string filePath)
{
string path = "Lua/" + filePath + ".lua";
print(path);
TextAsset ta = Resources.Load<TextAsset>(path);
return System.Text.Encoding.UTF8.GetBytes(ta.text);
}

env.AddLoader(LuaLoader);
env.DoString("require 'helloworld'");

官方建议的加载Lua脚本方式是:整个程序就一个DoString(“require ‘main’”),然后在main.lua加载其它脚本(类似lua脚本的命令行执行:lua main.lua)。

C#访问Lua普通全局变量

先加载lua脚本,再通过LuaEnv.Global.Get获取变量。

1
2
3
4
5
6
TextAsset ta = Resources.Load<TextAsset>("Lua/variable.lua");
env.DoString(ta.text);

int g_int = env.Global.Get<int>("g_int");
string g_str = env.Global.Get<string>("g_str");
bool g_bool = env.Global.Get<bool>("g_bool");

C#访问Lua table的四种方法

需要注意的是,在构建C#中对应的结构时,接口一定要是public修饰,否则会报错。类最好也是,但是经测试,没有报错。

映射到普通class或struct

table的属性可以多于或者少于class的属性,也就是不一定都需要做映射。这个过程是值拷贝,如果class比较复杂代价会比较大。而且修改class的字段值不会同步到table,反过来也不会。

1
2
3
4
5
6
7
public class Person
{
public string name;
public int age;
}

Person p = env.Global.Get<Person>("g_tbl");

映射到接口

一定要加[CSharpCallLua]和public,否则会报错。

1
2
3
4
5
6
7
g_int = 1
g_str = "Hello World Variable"
g_bool = false
g_tbl = {name = "Juhnny", age = 12}
g_tbl.say = function(this, str)
print(str)
end

1
2
3
4
5
6
7
8
9
10
[CSharpCallLua]
public interface IPerson
{
string name { get; set; }
int age { get; set; }
public void say(string str);
}

IPerson p = env.Global.Get<IPerson>("g_tbl");
p.say("Yahoo");

映射到Dictionary和List

这种方法较方法2更为轻量级,但是要求table下key和value类型一致。

1
2
g_dic = {apple = "iPhone", flower = "Huawei"}
g_list = {1, 3, 5, 7, 9}

1
2
3
4
5
6
7
8
9
10
11
Dictionary<string, string> dic = env.Global.Get<Dictionary<string, string>>("g_dic");
foreach (var child in dic)
{
print(string.Format("Key is {0}, Value is {1}", child.Key, child.Value));
}

List<int> list = env.Global.Get<List<int>>("g_list");
foreach (var v in list)
{
print(v);
}

映射到LuaTable

这种方法比较慢,而且没有类型检查,不推荐使用。

1
2
3
4
5
6
7
8
LuaTable tab = env.Global.Get<LuaTable>("g_tbl");
string name = tab.Get<string>("name");
int age = tab.Get<int>("age");
print(string.Format("Name is {0}, age is {1}", name, age));
foreach (string key in tab.GetKeys())
{
print(tab.Get<object>(key));
}

C#访问Lua全局函数

使用delegate映射

这种是建议的方式,性能好很多,而且类型安全,但是要生成代码。支持带返回值,多返回值,甚至返回值都可以是delegate。

1
2
3
4
5
6
7
8
g_func1 = function()
print("FF")
end

g_func2 = function(num)
print(num)
return num, "Yoshida", "SE"
end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[CSharpCallLua]
public delegate int Func2(int num, out string name, out string company);
// 声明委托时,一定要加public和[CSharpCallLua]

// 无返回
Action func1 = env.Global.Get<Action>("g_func1");
func1();
func1 = null;

// 单返回值
Func2 func2 = env.Global.Get<Func2>("g_func2");
int num = func2(14);
func2 = null

// 多返回值
Func2 func2 = env.Global.Get<Func2>("g_func2");
string name;
string company;
int num = func2(14, out name, out company);
func2 = null

在过去的一些版本中,需要在不使用后,将接收到的函数销毁,否则会在LuaEnv.Dispose的时候报错。

使用LuaFunction

与上一种方法优缺点相反,不推荐使用。

1
2
LuaFunction func = env.Global.Get<LuaFunction>("g_func2");
object[] res = func.Call(14);

Lua调用C

1
2
3
4
5
6
7
8
9
10
11
// 读静态属性
CS.UnityEngine.Time.deltaTime

// 写静态属性
CS.UnityEngine.Time.timeScale = 0.5

// 调用静态方法
CS.UnityEngine.GameObject.Find('helloworld')

// 读写成员属性类似,但是访问成员方法要使用:
testobj:DMFunc()

其它注意事项

方法的参数处理
Lua调用侧的参数处理规则:C#的普通参数算一个输入形参,ref修饰的算一个输入形参,out不算,然后从左往右对应lua 调用侧的实参列表。

Lua调用侧的返回值处理规则:C#函数的返回值(如果有的话)算一个返回值,out算一个返回值,ref算一个返回值,然后从左往右对应lua的多返回值。

可变参数的处理

1
2
3
4
5
// 对于C#的如下方法:
void VariableParamsFunc(int a, params string[] strs)

// 可以在lua里头这样调用:
testobj:VariableParamsFunc(5, 'hello', 'john')

枚举

1
2
3
4
5
6
7
8
9
10
// 枚举值就像枚举类型下的静态属性一样。

testobj:EnumTestFunc(CS.Tutorial.TestEnum.E1)

上面的EnumTestFunc函数参数是Tutorial.TestEnum类型的。

枚举类支持__CastFrom方法,可以实现从一个整数或者字符串到枚举值的转换,例如:

CS.Tutorial.TestEnum.__CastFrom(1)
CS.Tutorial.TestEnum.__CastFrom('E1')

委托

1
2
3
4
5
6
7
8
-- 使用+-号来实现委托
-- 比如testobj里头有个事件定义是这样:public event Action TestEvent;

-- 增加事件回调
testobj:TestEvent('+', lua_event_callback)

--移除事件回调
testobj:TestEvent('-', lua_event_callback)
🔲 ☆

别再无脑 go get @latest 了!你的服务器可能下一秒就被黑客接管

本文永久链接 – https://tonybai.com/2026/03/19/proposal-support-dependency-cooldown-in-go-tooling

大家好,我是Tony Bai。

试想一个极其真实的“黑色星期五”场景:

下班前一小时,你为了修复一个无关紧要的小 Bug,或者只是心血来潮想把项目里的依赖库清理一下,于是你顺手在终端里敲下了极其熟练的几个字符:

go get -u

或者 

go get github.com/xxx/yyy@latest

看着屏幕上飞速滚动的下载进度条,一排排依赖被成功升级到带有 v1.x.x 的最新版本,你的心里涌起了一阵莫名的舒适与安全感。毕竟,在绝大多数程序员的潜意识里:“最新版 = 修复了所有已知漏洞 = 性能更强 = 最安全”。

但如果我今天告诉你,你敲下的那个 @latest,其实是黑客精心为你准备的“夺命接引符”呢?

这绝不是危言耸听。就在不久前,Go 官方 GitHub 仓库中出现了一个引发核心开发团队激烈讨论的提案:Issue #76485(在 Go 工具链中支持依赖冷却期)。

这个提案的提出,暴露出我们在面对一种名为“供应链投毒”的高级攻击时,防御体系有多么脆弱。

今天,我们就来硬核扒开这个提案背后的深层技术逻辑,看看 Go 官方打算如何拯救我们的依赖树。

你以为的最新版,其实是黑客的“盲区红利”

近几年来,在 NPM、PyPI 乃至 Rust 的 Crates.io 生态中,“开源供应链投毒”早就不是什么新鲜事了。黑客们的攻击手段已经从早期的“暴力破解服务器”,演变成了极其阴险的“社会工程学与自动化投毒”。

他们的套路简单粗暴,但杀伤力惊人:

黑客会去盗取某个高星级开源库作者的 GitHub 账号,或者利用极具迷惑性的“拼写错误(Typosquatting,比如把 mongodb 拼成 mogodb)”发布一个恶意包。在这个包的 init() 函数里,他们悄悄塞进一段挖矿脚本、一段窃取服务器环境变量(包含 AWS Key 或数据库密码)的后门代码,然后打上一个闪亮的最新版本号,比如 v1.9.9。

这个时候,谁最先更新依赖,谁就最先成为黑客刀下的韭菜。

在网络安全界,有一个极其残酷的定律:恶意代码从发布到被发现,是存在一个“致命时间差”的。

当一个投毒包被发布到全世界的代理镜像(Proxy)上,到它被安全社区的白帽子发现、逆向分析、并最终拉黑(报 CVE 漏洞),通常需要几天到几周的时间。

在这段无人察觉的“安全盲区”里,你对“最新版”的盲目狂热,恰恰成了黑客最喜欢的传播加速器。你在帮黑客做大范围的灰度测试,而你的生产服务器,就是那只可怜的小白鼠。

Go 的三道防线:MVS 与 SumDB 的极限,以及最后的防守漏洞

很多 Go 开发者看到这里可能会不服气:“Tony 老师,你说的都是 Node.js 和 Python 那边的事儿。我们 Go 语言的依赖管理系统可是业界公认最安全的!”

没错,Go 语言在设计模块系统(Go Modules)时,确实比其他语言多长了几个心眼。我们目前拥有两道底层防线:

第一道防线:MVS(最小版本选择,Minimal Version Selection)。

当你安装一个依赖时,NPM 默认会去寻找符合语义化版本(SemVer)的“最新兼容版本”。但 Go 的 MVS 算法极其保守,它只会选择能满足所有依赖要求的最老版本(即最小版本)。这意味着,即使黑客发布了一个带毒的 v1.2.9,只要你的项目依赖树只要求 v1.2.0,Go 就绝对不会自作多情地帮你自动升级到最新版。MVS 直接掐断了黑客通过“传递依赖”悄悄感染你的路径。

第二道防线:SumDB(校验和数据库)。

如果你在本地偷偷篡改了某个版本的代码,Go 会在构建时大声报错。因为 Go 引入了一个基于密码学的透明日志系统 sum.golang.org。每一个包的版本只要一经发布,它的哈希值就会被永久记录在这个不可篡改的账本上。黑客无法“悄悄替换”一个已经存在的历史版本。

既然有了 MVS 和 SumDB,我们是不是就绝对安全了?

错!这两道防线有一个致命的盲点:它们防不住“开发者手贱”。

如果黑客发布了一个全新的带毒版本 v2.0.0,而你为了追求新特性,或者仅仅是强迫症发作,主动在终端里敲下了 go get -u,或者 go get xxx@latest,那么 MVS 的保护伞将瞬间失效。你主动把门禁打开,把伪装成“最新版”的木马迎进了核心机房。

终极杀招:Go 社区的建议——“让子弹飞一会儿”

既然传统的静态代码扫描防不住这种零日投毒,既然开发者总是管不住手想要升级最新版,那该怎么办?

Go 社区在提案中给出了一种解法:“既然投毒被发现需要时间,那我们就用魔法打败魔法——给依赖强行加一个物理隔离的冷却期(Cooldown)。”

在这个代号为 #76485 的提案中,开发者提出引入一个全新的环境变量来掌控全局:

GOCOOLDOWN=15d go mod tidy

这句话的底层指令是:“Go 工具链请注意,在帮我拉取或更新依赖时,请自动屏蔽掉所有发布时间少于 15 天的包。哪怕它的版本号再高、特性再诱人,只要它太年轻,一律当它不存在。”

这个设计的底层逻辑简直绝妙:绝大多数开源投毒攻击,在极度活跃的头几天内就会被安全专家揪出来。只要你忍住不当全网第一批“小白鼠”,等这个包在开源世界里被成千上万的其他语言开发者“趟过雷”,冷却了 15 天依然安然无恙,那么它大概率就是真正安全的。

这就是传说中的:只要我跑得足够慢,黑客的镰刀就永远割不到我。

如何骗过时间?Go 底层的极度严谨

看到这里,有经验的高级架构师肯定会抛出一个极其尖锐的质疑:

“等等!如果黑客在发布恶意包的时候,直接篡改 Git 的 Tag 时间,把今天的发布时间伪造成三个月前,这所谓的冷却期不就成了一个毫无防备的摆设了吗?”

如果你能想到这层,说明你已经具备了极强的黑客攻防思维。但在提案的深度讨论中,Go 密码学包主要维护者 FiloSottile 等核心开发者,早就把黑客的这条退路给焊死了。

在 Go 团队的设计构想中,冷却期的计算,绝对不依赖于容易被任意篡改的 Git Tag 或包作者自己声称的发布时间。

相反,Go 将调用我们前面提到的那套坚如磐石的基础设施——SumDB

当全球代理(如 proxy.golang.org)第一次看到并抓取某个包的全新版本时,SumDB 会在它的密码学叶子节点上,不可撤销地打上一个“首次观测时间戳(First-observed timestamp)”

这就像是去典当行抵押物品。小偷可以随意把手表的出厂日期磨掉改成十年前,但他绝对无法欺骗典当行头顶那带时间戳的监控录像。只要 SumDB 的日志显示这块表是昨天刚拿进来的,那么 GOCOOLDOWN 就会无情地将其拦截在门外。

至此,Go 语言的供应链防线形成了完美的逻辑闭环:

  • MVS 确保了你不会被动卷入升级;
  • SumDB 确保了历史包的绝对不可篡改;
  • 而全新的 Cooldown(冷却期),则补齐了你主动拉取最新版时的最后一块安全护盾。

小结:在特性落地前,我们该怎么保护自己?

虽然目前 #76485 依然在激烈的 Proposal Review(提案评审)阶段,甚至可能最终会演变成一个外部的轻量级过滤代理工具,但它透露出的底层工程哲学,值得每一位后端开发者立刻应用到日常的高并发架构中:

  1. 立刻戒掉 @latest 的瘾:在生产环境中,尽量不要使用 go get -u 去盲目追新。稳定运行了几个月的依赖树,如果没有极其严重的 Bug 或报出的 CVE 安全漏洞,绝对不要去动它。
  2. 拥抱自动化的“安全缓冲期”:如果你在公司内部使用了 Renovate 或 Dependabot 这样的自动依赖更新机器人,立刻去后台把“最小发布年龄(Minimum Release Age)”配置项打开,设置为 7 天或 15 天。让机器替你踩刹车。
  3. 敬畏时间,建立护城河:软件工程不是追星买首发。让别人不重要的边缘业务先去帮这个开源库的最新版“踩坑”,这是一个能够扛起千万级 QPS 的资深架构师应有的沉稳与克制。

在险象环生的网络世界里,时间不仅是解药,更是我们最强大的防火墙。期待 GOCOOLDOWN 的防守理念早日普及,让我们彻底告别每天提心吊胆更新依赖的日子。

资料链接:https://github.com/golang/go/issues/76485


今日互动探讨

你在公司里,遇到过因为同事“手贱升级了最新依赖”而导致生产环境崩溃,或者遭遇供应链投毒的血泪史吗?

欢迎在评论区疯狂吐槽与分享


认知跃迁:读懂底层机制,才能看透系统架构的本质

从保守的 MVS,到密码学级别的 SumDB,再到今天探讨的反直觉的 GOCOOLDOWN,你会发现,Go 团队在设计这门语言的工具链时,处处透着一种对工程稳定性、安全性的极致追求和克制。

然而,令人遗憾的是,很多开发者写了五六年的 Go 代码,却依然只停留在“会用 Gin 写写 CRUD 接口”的表层。他们对 Go 工具链底层的设计哲学、并发调度的本质、内存模型的安全逻辑一无所知。一旦线上的高并发系统出现复杂的性能瓶颈,或是遭遇底层的安全漏洞,往往束手无策,只能靠瞎猜。

如果你渴望突破这种“熟练调包侠”的瓶颈,想要像顶级大厂架构师一样,看透 Go 语言背后的系统级设计思维,建立起坚不可摧的技术护城河——

我的极客时间专栏 Tony Bai·Go语言进阶课 正是为你量身定制。

在这 30+ 讲极其硬核的内容中,我不仅带你剥开语法糖,深挖 Goroutine 调度、Channel 哲学、内存逃逸;更会带你全面吃透 Go 的工程化实践,把构建、依赖管理背后的深层逻辑一次性讲透。

目标只有一个:助你完成从“Go 熟练工”到“能做顶级架构决策的 Go 专家”的蜕变!

扫描下方二维码,加入专栏。不要用战术上的勤奋,掩盖战略上的懒惰。让我们一起用架构师的视角,重新认识 Go 语言。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

🔲 ☆

拒绝无效告警!用 Govulncheck 构建高信噪比的 Go 安全扫描工作流

本文永久链接 – https://tonybai.com/2026/02/25/govulncheck-high-signal-to-noise-ratio-security-workflow

大家好,我是Tony Bai。

在当今的软件开发流程中,持续集成/持续部署(CI/CD)和自动化的安全左移(Shift Left)已经成为行业共识。在这个大背景下,诸如 GitHub Dependabot 这样的自动化依赖更新工具应运而生,并迅速占据了几乎每一个开源项目和商业级代码库的 Repository 设置。它们不知疲倦地扫描 go.mod,一旦发现有依赖项爆出 CVE 漏洞,就会自动生成一个拉取请求(Pull Request, PR),仿佛是在告诉你:“别担心,我已经帮你修好了。”

然而,事实真的如此美好吗?

近日,密码学领域的权威专家、前 Google Go 安全团队负责人 Filippo Valsorda 在其个人博客上发表了一篇极具冲击力的文章,标题直截了当:“TURN DEPENDABOT OFF”(关掉 Dependabot)。他毫不客气地指出,这款被无数开发者信赖的工具,实际上是一个“噪音制造机”(Noise Machine)。它不仅浪费了开发者的宝贵精力,更在无形中损害了整个 Go 生态系统的安全根基。

作为 Go 开发者,我们该如何审视这种看似“政治正确”的安全自动化工具?如果不使用 Dependabot,我们又该如何保卫代码库的安全?本文将深度剖析 Filippo 的核心观点,揭示传统版本比对扫描的致命缺陷,并手把手教你如何利用官方推荐的 govulncheck 构建真正高效、高信噪比的现代化 Go 安全扫描工作流。

安全自动化的幻象与“告警疲劳”

为了理解 Filippo 为什么如此强烈地反对 Dependabot 这种类型的扫描工具,我们需要先剖析软件工程心理学中的一个经典问题:告警疲劳(Alert Fatigue)

什么是告警疲劳?

告警疲劳是指操作人员或开发人员在长时间暴露于频繁且大量低价值(即假阳性、False Positives)的系统警告下,逐渐变得对这些警告麻木、脱敏的现象。

在医疗领域,如果重症监护室的心电监护仪总是因为轻微干扰而发出刺耳的警报声,护士最终可能会忽略真正的病危信号;在网络安全领域,如果防火墙每天产生一万条拦截记录,安全分析师就不可能从中挑出那一条真正的 APT 高级持续性威胁。


图:Dependabot alerts

在软件开发中,Dependabot 完美地扮演了那个“总是狼来了”的角色。它带来的不是安全感,而是一种虚假的工作充实感。正如 Filippo 所言:“它让你感觉自己好像在做有用的工作,但实际上你是在阻碍真正有用的工作。”

传统版本扫描的致命缺陷:一刀切的模块级匹配

Dependabot 和大多数传统的软件成分分析(SCA)工具一样,其工作原理极其简单粗暴,可以概括为基于版本的字符串比对

以 Go 语言为例,它们的逻辑是这样的:
1. 解析你的 go.mod 和 go.sum 文件,列出你所使用的所有依赖模块(Module)及其版本(如 github.com/foo/bar v1.0.0)。
2. 查询公共漏洞数据库(如 NVD)。
3. 如果数据库显示 github.com/foo/bar 在 < v1.2.0 时存在某个漏洞,且你的版本在这个范围内,立刻生成一个高危告警,并创建一个将版本升级到 v1.2.0 的 PR。

在某些动态类型语言(如 Ruby 或早期 JavaScript)生态中,这种方法或许是唯一可行的。但在 Go 语言这样强调静态类型、拥有明确抽象边界和包级结构的生态中,这种“模块级”的一刀切匹配就显得极其愚蠢和低效。

真实案例分析:edwards25519 漏洞风波

为了让这个问题更加具象化,Filippo 在文章中分享了一个他亲身经历的“案发现场”。

不久前,Filippo 为他维护的密码学基础库 filippo.io/edwards25519 发布了一个安全修复版本(v1.1.1)。这个库在 Go 生态中举足轻重,被数十万个开源项目间接依赖。然而,这个漏洞的触发条件极其苛刻:

漏洞仅存在于 (*Point).MultiScalarMult 这个非常高级且罕用的 API 方法中,且只有当该方法的接收者(Receiver)不是初始的 identity point 时才会产生未定义的行为。

现实情况是:在整个 Go 生态系统中,几乎没有任何项目实际调用了这个存在缺陷的特定方法。 大多数依赖该库的项目(比如著名的 github.com/go-sql-driver/mysql 库,拥有 22.8 万以上的依赖者)仅仅是导入了该库的其他基础功能,与有漏洞的代码路径八竿子打不着。

Dependabot 的反应是什么?

灾难性的噪音。Dependabot 不分青红皂白,仅仅因为版本号低于 v1.1.1,就向 GitHub 上的数千个甚至根本不受影响的 Repository 发送了疯狂的更新 PR。更糟糕的是,这些 PR 附带了由算法自动生成的、耸人听闻的、根本不合逻辑的 CVSS v4 漏洞评分,以及所谓的“73% 兼容性风险警告”。

结果就是,无数个深夜,开源项目的维护者们收到了刺耳的安全警报,被迫中断手中的工作,去 review 一个修改了一行他们压根用不到的代码的依赖升级 PR。如果他们不合并,项目上就会一直挂着一个红色的“安全风险”标签;如果他们机械地合并了,这就成了“告警疲劳”的典型发作。

Filippo 一针见血地指出这种行为的荒谬性:

“由于扫描器未能过滤掉无关的漏洞,这种额外的劳作被硬生生地扔到了开源维护者的脚下,这是不可持续的。维护者的责任是确保项目不受安全漏洞影响;而扫描工具的责任是确保它们不会用假阳性告警去打扰用户。

当升级依赖(Dependency bump)成为一种应付扫描工具的机械动作,而不是基于对漏洞影响的真实评估(如是否需要轮换生产环境的密钥、是否需要通知受影响的用户),我们距离真正的安全就已经越来越远了。

拥抱静态分析,Govulncheck 的降维打击

既然基于版本的 Dependabot 如此不堪,我们应该如何科学地防范软件供应链安全风险?

答案是:抛弃盲目的版本匹配,使用严肃的、基于静态代码分析的漏洞扫描器。 计算机完全有能力为你完成过滤无用噪音的工作。在 Go 语言生态中,这个“杀手级”的工具就是官方出品的 govulncheck

丰富的 Go 官方漏洞数据库

要实现精准的扫描,首先需要高质量的数据源。这正是 Filippo 在 2020 年至 2021 年领导 Go 安全团队时极力推动的战略——投入大量资源建设 Go 官方漏洞数据库(Go Vulnerability Database)

与一般只记录模块版本和一段文字描述的 CVE 库不同,Go 漏洞数据库包含了极其丰富的、机器可读的元数据。它严格遵循标准的 OSV (Open Source Vulnerability) 格式。

让我们看看前面提到的 edwards25519 漏洞(GO-2026-4503)在数据库中的记录:

modules:
  - module: filippo.io/edwards25519
    versions:
      - fixed: 1.1.1
    vulnerable_at: 1.1.0
    packages:
      - package: filippo.io/edwards25519
        symbols:
          - Point.MultiScalarMult   # 关键所在:精确到了有漏洞的具体方法!

请注意最底部的 symbols 字段。Go 安全团队并没有笼统地标记整个模块不安全,而是像外科手术刀一样,精准定位到了那个有缺陷的方法 Point.MultiScalarMult。这就为后续的精准静态分析提供了弹药。

Govulncheck 的核心优势:基于可达性分析

有了精确到“符号(函数/方法)”级别的数据源,govulncheck 就可以对你的代码库施展“降维打击”了。相比于 Dependabot,它具有两大碾压级的优势:

优势一:包级别的过滤

Go 语言的模块通常由多个子包(Packages)组成,这是良好的代码组织习惯。如果一个漏洞发生在模块的 pkgA 中,而你的代码只导入了 pkgB,你显然是安全的。

任何合格的漏洞扫描器至少应该做到这一层过滤。实际上,这只需要执行一次简单的 go list -deps ./… 命令即可分析出包依赖关系。Dependabot 甚至连这基本的一步都没有做到,导致了大量的假阳性。

优势二:基于调用图的符号可达性分析

这是 govulncheck 引以为傲的黑科技。它不仅知道你引入了哪些包,它还会像编译器一样分析你的代码,构建出一棵完整的函数调用图(Call Graph)

当扫描器运行时,它会沿着调用链路一路追溯:从你的 main 函数或测试入口开始,顺着你的业务逻辑,追踪到你调用的第三方库,再追踪到第三方库调用的更底层的库……

如果 govulncheck 发现,存在漏洞的那个特定函数(比如 Point.MultiScalarMult),在这棵庞大的调用树中根本不可达(即没有任何一条代码执行路径会调用到它),那么它就会保持沉默。

让我们看看实际的运行效果。如果你的项目只使用了 go-sql-driver/mysql,并且运行 govulncheck:

$ govulncheck ./...
=== Symbol Results ===
No vulnerabilities found.

Your code is affected by 0 vulnerabilities.
This scan also found 1 vulnerability in packages you import and 2
vulnerabilities in modules you require, but your code doesn't appear to call
these vulnerabilities.
Use '-show verbose' for more details.

看,结果多么清爽!

govulncheck 明确地告诉你:“我看到了你的依赖树里有一个有漏洞的模块,但是不用慌,你的代码逻辑根本没有触碰到那个雷区,你是安全的。”

这种极高的信噪比,是 Dependabot 永远无法企及的。它把安全专家的宝贵时间,留给了真正需要紧急响应的致命漏洞,而不是在日常的升级杂务中消耗殆尽。

重塑现代 Go 项目的 CI/CD 工作流

如果你被 Filippo 的观点说服,决定彻底关闭 Dependabot 的安全警报,那么你必须建立一套更为科学的自动化机制来接管依赖管理和漏洞检测的工作。

Filippo 给出了非常具体的行动指南:用两个定时执行的 GitHub Actions 替换 Dependabot。

行动一:部署独立的 Govulncheck 定时扫描任务

你应该每天定时运行一次 govulncheck。它的作用是充当真正有价值的安全哨兵。

name: Govulncheck Scan
on:
  push:
    branches: [ "main" ]
  pull_request:
  schedule:
    # 每天 UTC 时间 10:22 执行
    - cron: '22 10 * * *'
  workflow_dispatch:

permissions:
  contents: read

jobs:
  govulncheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false

      - uses: actions/setup-go@v6
        with:
          go-version-file: go.mod

      - name: Run govulncheck
        run: |
          go run golang.org/x/vuln/cmd/govulncheck@latest ./...

为什么这个 Action 不会自动开 PR?

这是深思熟虑后的设计。如果 govulncheck 报警并导致 CI 失败,这意味着:你的代码明确且切实地调用了一个有已知漏洞的函数。

此时,情况已经相当严重了。你不能仅仅是指望像机器人一样点击“Merge”升级一个版本就万事大吉。你需要人类工程师介入:

  1. 评估该漏洞在你的特定业务上下文中是否可被利用。
  2. 检查是否有数据泄露。
  3. 评估是否需要紧急轮换生产环境的数据库凭证、API 密钥或 JWT 签名密钥。
  4. 手动更新依赖,运行详尽的回归测试,然后再部署上线。

把安全审计权交还给人类大脑,这才是对工程负责的态度。

行动二:测试最新的依赖项,而不是盲目更新

有人会反驳:可是 Dependabot 除了报安全漏洞,还能帮我们保持依赖常新,避免未来积累过多的技术债啊!

Filippo 认为,这种做法同样陷入了误区。

依赖的更新节奏,应当服从于你自身项目的开发周期和发布节奏,而不是被你的上游库作者的发布频率牵着鼻子走。例如,你应该在决定发布下一个主要版本时,集中精力进行一次依赖升级和全面测试,而不是天天被各种次要版本的更新 PR 打扰。

但是,保持对上游变化的敏感度同样重要。如果我们不天天更新,等真正需要安全更新时,可能会因为版本跨度太大而遭遇严重的 API 不兼容(Patch Delta 过大)。

Filippo 提出的巧妙解法是:每天在 CI 中,使用你所有依赖的最前沿版本运行一次你的测试套件。

name: Go Nightly Tests against Latest Dependencies
on:
  schedule:
    # 每天运行
    - cron: '22 10 * * *'

# ... 省略部分环境配置 ...

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        go:
          - { go-version: stable }
          - { go-version-file: go.mod }
        deps:
          - locked  # 针对锁定版本的 go.mod 运行测试
          - latest  # 针对最新版本依赖运行测试
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go.go-version }}

      - name: Run tests with sandboxed CI environment
        uses: geomys/sandboxed-step@v1.2.1
        with:
          run: |
            if [ "${{ matrix.deps }}" = "latest" ]; then
              # 关键指令:将所有依赖临时拉取到最新版本,但不修改 go.mod
              go get -u -t ./...
            fi
            go test -v ./...

这种策略的双赢之处:

  1. 零打断的早期预警:你的测试套件每天都在与最前沿的第三方代码搏斗。一旦某个上游库发布了一个引发不兼容的改动,你的每日 CI 就会立刻失败并向你报警,你可以在闲暇时从容应对,而不需要在某个紧急修复的当口被卡住。
  2. 极简的代码库:只要测试通过,你根本不需要去修改 go.mod 提交没必要的版本跳跃。你的仓库历史依然干净。

进阶安全提示:防范 CI 投毒

当你在 CI 中运行 go get -u 时,你实际上是在无审查的情况下执行可能包含了恶意代码的第三方库(尤其是在执行测试时)。为了缓解供应链攻击带来的风险,Filippo 强烈推荐在执行此类测试时引入安全沙箱机制。在上述配置中,geomys/sandboxed-step 是一个基于 gVisor 的沙盒工具,它收回了工作流脚本对 GitHub 环境变量、机密信息以及不必要网络的访问权,确保即使拉取到了恶意的依赖包,它也无法窃取凭证或进行横向移动。这种防御深度,展现了前 Google 安全专家一贯的严谨。

小结:让工具回归辅助的本位

从盲目轻信机器人的批量 PR,到利用编译原理和图论(可达性分析)进行精准手术刀式的漏洞定位,Filippo Valsorda 给 Go 社区上了一堂生动的工程哲学课。

自动化绝不是推卸责任的借口。作为一个成熟的软件开发团队,我们应当停止对“警报数量”的崇拜,转而追求“警报质量”。关闭那些让你产生疲劳的噪音机器,配置好你的 govulncheck,把精力集中在真正需要人类智慧去解决的架构演进和安全设计上。

这不仅是 Go 语言最佳实践的一次更迭,更是我们在面对日益复杂的软件供应链时,应有的冷静与定力。

资料链接:https://words.filippo.io/dependabot/


你被 Dependabot “骚扰”过吗?

自动生成的 PR 虽然方便,但也可能成为开发者的负担。在你的项目中,你是选择一键合并所有的安全更新,还是会仔细评估漏洞的真实影响?你会考虑关掉 Dependabot 的警报,转而投奔 Govulncheck 吗?

欢迎在评论区分享你的安全治理心得!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

🔲 ☆

Windows 11 更新又坏了:微软怀疑部分电脑在安装 2026 年 1 月更新 (KB5074109) 后可能无法启动

来自 windowslatest 的消息:微软怀疑部分电脑在安装 Windows 11 2026 年 1 月更新 (KB5074109) 后可能无法启动。
已知 Windows 11 25H2 与 Windows 11 24H2 都会受到影响。

KB5074109 累积更新

KB5074109 是微软在2026年1月13日发布的 Windows 11 版本 25H2 和 24H2 强制性安全更新,OS 内部版本 26200.7623 和 26100.7623

包括最新的安全修补程序(100多个已知的安全问题)和改进,以及上个月可选预览版的非安全更新,会自动安装在 PC 上。

微软在一份支持文档中指出:“微软已收到少量关于设备无法启动问题的报告。”该文档最初由 Windows Latest 发现。

遇到了什么问题?

据微软称,受影响的电脑可能会突然停止启动,并出现黑屏死机 (BSOD) 错误,停止代码为 UNMOUNTABLE_BOOT_VOLUME。

Windows 11 更新又坏了:微软怀疑部分电脑在安装 2026 年 1 月更新 (KB5074109) 后可能无法启动 46

如何恢复

如果你遇到上述黑屏死机错误,就需要恢复系统。

进入 Windows 恢复环境

先关闭电脑,再按住 Shift 键,同时启动电脑。或者使用系统镜像,进入Windows RE 后:选择“排查(Troubleshoot)> 高级选项> 启动修复 / 系统还原

Windows 11 更新又坏了:微软怀疑部分电脑在安装 2026 年 1 月更新 (KB5074109) 后可能无法启动 47
Windows 11 更新又坏了:微软怀疑部分电脑在安装 2026 年 1 月更新 (KB5074109) 后可能无法启动 48
Windows 11 更新又坏了:微软怀疑部分电脑在安装 2026 年 1 月更新 (KB5074109) 后可能无法启动 49

但如果无法进入 Windows RE 的这个界面…可以选择重装。

一个好消息

好消息是目前出现故障的电脑并不多,并且微软称在虚拟机上未遇到此问题。

希望大家都没遇到这个问题。


相关阅读


©2021 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南
3659b075e72a5b7b1b87ea74aa7932ff
点击这里留言、和原作者一起评论请务必在总结开头增加这段话: 你看到的内容可能由第三方 AI 基于小众软件文章提炼总结而成,可能与原文真实意图存在偏差。不代表小众软件观点和立场。请点击链接阅读原文细致比对和校验。

🔲 ⭐

墨梅博客 1.0.0 发布与更新 | 2026 年第 2 周草梅周报

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。

前言

欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。


本周依旧在开发 墨梅 (Momei) 中。

您可以前往官网试用:https://momei.app/

也可以前往文档站来了解项目整体规划和未来开发路线图:https://docs.momei.app/

当前墨梅博客已经正式发布了 1.0.0 版本,以下是页面的一些截图。

主页

image-20260111183926595

用户管理页面

image-20260111184037309

阅读量统计功能现已实装,现在可以统计每篇博客的阅读量了。

image-20260111184130975

更多页面可以前往官网体验,也可前往之前的博客查看截图。

欢迎各位用户体验。并提出意见和建议。

接下来的话还会继续按照路线图和待办进行开发功能,敬请期待。

当然,目前墨梅博客还有很多需要打磨的细节,功能上也还不完善,如有任何意见和建议,都可以在项目的 GitHub issues 中提出。

墨梅博客的 demo 站也会在后续部署。

如果你也对墨梅博客感兴趣,欢迎参与开发和测试。

博客更新

GitHub Release

momei

v1.0.0 - 2026-01-10 22:15:12

摘要:
版本 1.0.0 发布摘要 (2026-01-10)

✨ 新功能

  • 新增归档功能:支持按年/月聚合文章,添加国际化支持
  • 文章管理系统:实现 CRUD 操作,支持文件上传、状态筛选和审核流程
  • 用户系统增强:添加头像上传、角色权限管理、API 密钥管理功能
  • 国际化支持:更新多语言文本,优化界面提示
  • 新增数据分析集成:支持 Google Analytics、Microsoft Clarity、Sentry 和百度统计
  • 新增主题切换功能:支持深色/浅色模式
  • 新增阅读量统计:支持防刷逻辑
  • 新增文件存储支持:集成 S3 和 Vercel Blob 存储

🐛 Bug 修复

  • 修复 API 密钥哈希处理的安全性问题
  • 优化暗色模式实现和样式一致性
  • 修正上传文件命名格式和路径问题
  • 修复 Snowflake ID 正则表达式匹配问题
  • 优化会话管理和 cookie 缓存策略
  • 修正 PrimeVue 菜单的暗色模式样式
  • 更新请求频率限制逻辑

📦 代码重构

  • 优化 API 返回结构和分页逻辑
  • 重构日期格式化工具
  • 统一组件样式增强可读性
  • 更新数据库实体关联关系
  • 优化国际化文本处理

本次发布包含 45 项新功能、40 项错误修复和 5 项重构改进,主要聚焦于文章管理系统、用户权限控制和国际化支持的完善。

最新 GitHub 加星仓库

  • CaoMeiYouRen starred UniVideo - 2026-01-09 19:20:41
    UniVideo 是一个视频处理框架,提供统一的理解、生成和编辑功能。该项目主要使用 Python 语言开发,目前在 GitHub 上获得 228 个星标。
  • CaoMeiYouRen starred workers-sdk - 2026-01-06 22:45:15
    Wrangler 是 Cloudflare Workers 的命令行工具,主要使用 TypeScript 语言开发,目前在 GitHub 上获得 3703 个星标。

其他博客或周刊推荐

阮一峰的网络日志

阿猫的博客

潮流周刊

二丫讲梵的学习周刊

总结

本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:

往期回顾

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/2026-02-caomei-weekly-momei-blog-1-0-release-update.html
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

🔲 ☆

草梅 Auth 1.11.0 发布与 GitHub 依赖安全更新 | 2025 年第 45 周草梅周报

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。

前言

欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。


本周依旧在开发 草梅 Auth 中。

你也可以直接访问官网地址:https://auth.cmyr.dev/
Demo 站:https://auth-demo.cmyr.dev/
文档地址:https://auth-docs.cmyr.dev/

本周 草梅 Auth 发布了 1.11.0 版本。

image-20251109225725739

本周的主要改动是添加了 Facebook 登录支持,增加了暗色模式的切换按钮。

除此之外也添加了一部分测试用例,后续还会继续补充。

如果想了解如何部署和使用项目,可以参考文档的内容,也欢迎补充文档缺失的内容。

如果你对草梅 Auth 感兴趣,欢迎参与开发和测试。


image-20251109230723757

本周处理了一些项目中存在的依赖安全漏洞,是由 Dependabot 提醒的。

image-20251109231011940

虽然借助 Dependabot ,也能自动更新依赖,不过有一些间接依赖就没那么好处理,往往需要添加覆盖原有版本的依赖选项的配置,比如 pnpm 中的 overrides字段,就是用来指定覆盖版本的。

不过我也得吐槽下,GitHub 默认的这个 Dependabot alerts 面板实际上没那么好查看具体的漏洞信息,还得每条点开,于是我就干脆写了个 n8n 工作流,生成一份 markdown 文件,用于集中报告 Dependabot alerts 详情,为修复做指导。

image-20251109231216615

当然,如果进一步优化的话,应该扔给 AI 来自动修复,这样会更节约时间一点。

博客更新

GitHub Release

rss-impact-server

v1.17.1 - 2025-11-08 20:12:01

摘要:

主要修复内容:

  • 通知功能:新增基于 isRemotePush 参数的远程推送字段条件验证,确保远程推送操作的正确性

本次更新为小版本修复,主要针对通知功能中的远程推送验证逻辑进行了完善。通过添加 isRemotePush 字段的条件验证,提升了系统在远程推送场景下的稳定性和可靠性。

push-all-in-one

v4.5.0 - 2025-11-06 23:42:39

摘要:

新增功能:

  • 添加了 push-all-in-cloud 服务推送功能

caomei-auth

v1.11.0 - 2025-11-08 20:08:06

摘要:
版本 1.11.0 更新摘要 (2025-11-08)

新功能:

  1. 认证模块新增 Facebook 登录支持及相关配置
  2. 主题模块增加系统偏好设置的暗色模式同步功能
  3. 主题模块新增暗色模式支持及主题切换功能

Bug 修复:

  1. 样式模块优化暗色模式样式,统一媒体查询格式

picgo-plugin-optimization

v1.0.1 - 2025-11-07 20:23:09

摘要:
版本 1.0.1 (2025-11-07) 摘要:

主要更新内容:

Bug 修复:

  • 优化了 PNG 图片压缩级别的计算逻辑,修复了相关 bug

本次更新主要针对 PNG 图片处理进行了优化,改进了压缩级别的计算方式,提升了插件处理 PNG 图片的性能和效果。

最新 GitHub 加星仓库

  • CaoMeiYouRen starred ebook2audiobook - 2025-11-07 15:35:12
    该文本介绍了一个基于 Python 的音频书籍生成工具,具有语音克隆功能并支持 1107 多种语言。项目在 GitHub 上获得了 15017 个星标,表明其受欢迎程度。核心功能包括将电子书转换为有声读物和高质量的语音克隆技术。
  • CaoMeiYouRen starred BettaFish - 2025-11-05 01:08:31
    微舆是一款基于 Python 开发的多 Agent 舆情分析工具,旨在提供客观全面的舆情分析服务。该工具完全从零开发,不依赖任何现有框架,具备打破信息壁垒、还原真实舆情、预测发展趋势等功能。目前该项目已在 GitHub 上获得 23698 颗星标,显示出较高的社区关注度。
  • CaoMeiYouRen starred LiveGalGame - 2025-11-03 18:04:26
    一款基于 Kotlin 开发的创新应用,能够为与美少女的对话添加类似 GalGame 的交互体验。该应用提供选项选择和字幕显示功能,模拟视觉小说游戏中的对话系统。项目在 GitHub 上获得 1592 个星标,显示其受欢迎程度。开发者选择 Kotlin 作为主要编程语言,适合 Android 平台开发。应用旨在增强聊天互动性,为用户提供游戏化的交流体验。
  • CaoMeiYouRen starred yolov5_anime - 2025-11-03 14:17:34
    基于 YOLOv5 的动漫人脸检测工具,使用 Python 开发,获得 105 星标。
  • CaoMeiYouRen starred face-alignment - 2025-11-03 14:17:33
    基于 PyTorch 开发的 2D 和 3D 面部对齐库,主要使用 Python 语言编写,已获得 7415 个星标。

其他博客或周刊推荐

阮一峰的网络日志

潮流周刊

二丫讲梵的学习周刊

总结

本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:

往期回顾

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/2025-45-caomei-weekly-caomei-auth-1-11-0-github-dependabot.html
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

🔲 ⭐

Npm 安全更新与千星沙箱 | 2025 年第 43 周草梅周报

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。

前言

欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。


Npm 安全更新

image-20251026195521995

最近收到了 Npm 的邮件,提示我令牌过期了。

这实际上是 Npm 最近的一次安全系统更新,将逐渐弃用之前的经典令牌和 TOTP 2FA。

image-20251026195638990

Npm 这么做的目的就是为了解决 Npm 令牌泄露导致的问题。

长期以来,出于自动化发包的需求,一般都需要用户生成一个 Npm 令牌来供 CI 系统调用。

但也正是这个原因,导致部分开发者(包括我自己)都选择了生成一个长期有效的令牌,来减少 Npm 令牌的更新次数。

不过,这样做也就导致了一旦泄露,由于令牌长期有效,若不及时吊销,将会造成重大影响。

而如果使用短期令牌,又将面临着频繁更新的麻烦。

因此在之前,安全和便捷总是无法两全的。

不过,随着 Npm 这次的安全更新,这个问题将得到解决。

现在,Npm 采取一种叫 受信任发布(Trusted publishing) 的方案,来同时解决安全和便捷这两个问题。

Trusted publishing allows you to publish npm packages directly from your CI/CD workflows using OpenID Connect (OIDC) authentication, eliminating the need for long-lived npm tokens. This feature implements the trusted publishers industry standard specified by the Open Source Security Foundation (OpenSSF), joining a growing ecosystem including PyPI, RubyGems, and other major package registries in offering this security enhancement.

受信任发布允许你使用 OpenID Connect (OIDC) 身份验证直接从你的 CI/CD 工作流程中发布 npm 包,无需使用长寿命的 npm 令牌。此功能实现了 Open Source Security Foundation (OpenSSF) 指定的受信任发布者行业标准,加入了包括 PyPI、RubyGems 和其他主要包注册中心的不断增长的生态系统,提供这种安全增强功能。

不过,目前 Npm 仅支持在 GitHub ActionsGitLab CI/CD Pipelines 上使用,在自托管运行器上尚不支持,,但计划在未来版本中支持。

有关受信任发布的更多内容请点击该链接查看:trusted publishing (OIDC)

配置可信发布的方法也很简单,先在包的页面找到 “Trusted Publisher“ ,然后设置好对应的 CI/CD 配置即可。

例如,push-all-in-one 这个包配置完成就是这样的:

image-20251026200934452

具体的配置表单则是这样:

image-20251026200949281

根据字段提示也很容易进行填写。

随后,在 GitHub 这边,则要在 .github/workflows/release.yml 文件夹下写以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
name: Release
on:
push:
branches:
- master

permissions:
id-token: write # id-token 的权限是必须的
packages: write
contents: write
issues: write
pull-requests: write

jobs:
release:
name: Release
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: "latest"
- name: Setup Node.js environment
uses: actions/setup-node@v5
with:
node-version: "lts/*"
cache: "pnpm"
- run: pnpm i --frozen-lockfile
- run: pnpm run lint
- run: pnpm run build
- env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # 旧的 token 可以直接注释掉
run: pnpm run release
# - run: npm publish # 如果没有自定义的 release 命令,可采用手动发布

其中比较关键的配置是需要给 GitHub Action 添加 id-token 权限,否则无法生成 OIDC 令牌。

其次是 npm CLI 的版本需要在 11.5.1 版本或以上。

我个人比较常用的自动化发包软件 semantic-release也在最近更新了对应内容,现在可以直接使用 semantic-release 完成 Npm 包的受信任发布。

以上就是这次 Npm 安全更新带来的一些影响和解决方案,如有帮助,欢迎订阅。


千星沙箱和低代码平台

《原神》最近上线了一个新的玩法——千星奇域。

这是个 UGC 玩法,也就是可以让玩家自己创造游戏。

不过作为程序员,我更关心的是开发千星奇域的工具——千星沙箱

image-20251026204426040

image-20251026204440961

在看到熟悉的流程图的时候,我估计大部分程序员都会反应过来,这不就是个低代码平台吗?只是用了游戏的素材。

确实,从某种意义上讲,千星沙箱还真就是个基于原神的低代码平台,跟之前周报提过的 n8n 很像。

不过,就这段时间的体验而言,千星沙箱还是存在一些不足的。

比如说自定义文本需要创作者 3 级以上。虽然也能理解是出于审核的原因,但这就导致游戏连一点文字提示都没有了,游玩体验会变得极差。

QQ截图20251026153441

比如这张图,并不是我没有写选项卡的文字,而是我压根没权限展示自定义文本

以及,虽然说千星沙箱是个低代码平台,但上手难度并不低,我可以确信的是,大部分玩家都会在研究千星沙箱的前三十分钟就放弃。

而我本人,虽然有一些编程经验,但也一边看文档,一边自己琢磨+调试,花了几个小时,才初步掌握使用千星沙箱的方法。

有些人可能会说,也就几个小时而已,学习编程或者游戏开发不就是这样的吗?需要投入大量的时间和精力。

但我认为,千星沙箱作为原神 UGC 玩法的核心编辑器,是不能就这么把普通玩家给排除在外的。

说到底,千星奇域是游戏的一个玩法,那么千星沙箱至少也要提供一个能让游戏玩家无缝理解的编辑方式,来实现玩家自己的想法。

之前游戏中有过的《神工天巧》玩法就简单的多,一个萌新也能理解要如何设计关卡

而我之前说花了几个小时研究千星沙箱,仅仅是跑通了一小段逻辑而已,要完整的实现一个游戏关卡,还要继续投入十几个小时。

可以说,哪怕只想实现一个最简单的打怪升级通关,或者跑酷通关,都是一件不容易的事情。

我觉得开发千星沙箱的项目组在一定程度上也陷入了开发者陷阱——那就是没有考虑普通玩家如何使用这些功能。而他们自己因为有相关的知识,则容易上手。

老实说千星沙箱的设计已经是非常完善的了,可以实现非常多的功能,从低代码平台的角度基本上可以打个 7/8 分(虽然还不能自定义函数),单从游戏的角度,可以打 1/2 分,因为太难上手了。

希望制作组接下来可以继续改善,降低使用门槛,让更多的玩家可以体验 UGC 开发。

至于我个人,也会继续使用千星沙箱,尝试还原一些游戏玩法。

不过也不一定会发布,这次也算体会到游戏开发的不易了。

GitHub Release

cmyr-template-cli

v1.41.7 - 2025-10-20 00:52:22

摘要:
版本 1.41.7 (2025-10-19) 摘要:

Bug 修复:

  1. 启用了 npm 发布功能并更新了相关工作流配置
  2. 添加了 pnpm 配置以覆盖 semantic-release 的依赖版本

本次更新主要解决了 npm 发布和工作流配置相关的问题,同时优化了依赖管理。

最新 GitHub 加星仓库

其他博客或周刊推荐

阮一峰的网络日志

HelloGitHub 热点速览

阿猫的博客

潮流周刊

二丫讲梵的学习周刊

总结

本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:

往期回顾

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/2025-43-caomei-weekly-npm-security-update-and-thousand-stars-sandbox.html
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

🔲 ☆

7个新手YouTuber常犯的错误(以及如何避免它们)(2025指南)

翻译自:7 Common Mistakes New YouTubers Make (and How to Avoid Them)(2025 Guide)

开设 YouTube 频道本来是一件令人兴奋的事——你有很多想法、无限的热情,还有建立观众群的梦想。
但事实是,很多初学者都会掉进相同的陷阱,导致频道增长停滞,甚至在太早的时候就放弃了。

如果你刚刚起步,这里总结了新手 YouTuber 最常见的 7 个错误,以及如何避免它们的实用方法。


1. 一味追求完美而不敢开始

很多人迟迟没有发布第一条视频,因为他们一直在等“万事俱备”——设备齐全、背景完美、剪辑无瑕。

你不需要专业的相机和复杂的灯组

你不需要专业的相机和复杂的灯组

也不需要专业的视频剪辑软件

也不需要专业的视频剪辑软件

👉 如何避免:立刻开始。手机摄像头 + 免费剪辑软件已经足够。做得越多,进步越快。记住:进步比完美更重要


2. 忽视缩略图和标题

你可能花了几个小时打磨视频内容,但如果缩略图和标题乏味,没人会点击。YouTube 是一个视觉平台,第一印象至关重要

👉 如何避免:缩略图要清晰、大胆。使用易读的文字、有表现力的图片,并设计能激发好奇心的标题,让观众愿意点击。

在海量的视频里,好的缩略图会让你的视频脱颖而出

在海量的视频里,好的缩略图会让你的视频脱颖而出

3. 不了解自己的受众

很多新手随意上传视频,没有想过自己是为谁创作的。这样很难培养忠实观众。

👉 如何避免:明确目标观众。问问自己:我在跟谁说话?我解决了什么问题?然后创作真正对他们有价值的内容。

Youtuber困惑于自己的观众是谁

Youtuber困惑于自己的观众是谁

4. 上传时间表不一致

一周上传 3 条视频,然后消失两个月,会让观众困惑,也不利于频道成长。

你的观众在 Youtube 的活跃时段

你的观众在 Youtube 的活跃时段

👉 如何避免:选择一个自己能长期坚持的频率——比如每周一次,或者每两周一次——并坚持下去。前期规律比数量更重要


5. 过度纠结设备

很多人误以为成功取决于昂贵的相机、专业灯光和录音棚级别的麦克风。虽然这些设备能加分,但并不是成长的关键。

👉 如何避免:专注于清晰的声音和好的叙事。等内容和预算都到位时,再逐步升级设备。


6. 忽视与观众互动

不少新手把 YouTube 当作单向平台:只上传,从不与观众交流。这会让建立社区变得困难。

👉 如何避免:回复评论、向观众提问、鼓励反馈。互动不仅能加强观众关系,也能让算法更愿意推荐你的视频。

回答回复,询问观众问题,鼓励交互

回答回复,询问观众问题,鼓励交互

7. 太早放弃

前几条视频只有寥寥数个观看时,很多人就失望退出,以为自己失败了。

👉 如何避免:记住,YouTube 是一场持久战。往往需要几十甚至上百个视频后,才能看到稳定的增长。专注于学习、改进,并保持耐心。


总结

每一位成功的 YouTuber 都是从零开始的——他们都会犯错、学习,然后逐渐变得更好。关键在于:坚持创作、保持一致,为观众创造价值

💡 如果你能避开这几个常见陷阱,就已经领先大多数新手一步,为长期成功打下基础。


7个新手YouTuber常犯的错误(以及如何避免它们)(2025指南)最先出现在Tinyfool的个人网站

🔲 ☆

草梅 Auth 1.7.0 发布 Demo 模式 | 2025 年第 37 周草梅周报

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。

前言

欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。


本周依旧在开发 草梅 Auth 中。

你也可以直接访问官网地址:https://auth.cmyr.dev/
Demo 站:https://auth-demo.cmyr.dev/
文档地址:https://auth-docs.cmyr.dev/

本周 草梅 Auth 发布了 1.7.0 版本。

本周的主要改动是增加了 Demo 模式,可以前往 Demo 站 查看效果。

image-20250914184701438

您可以使用 Demo 账号登录,以查看管理员视角。

用户名:demo_admin
默认密码:Demo@123456
昵称:演示管理员
邮箱:demo_admin@example.com
用途:用于展示 管理员 视角

image-20250914190742062

您也可以查看第三方登录设置后的效果(Demo 站的第三方登录配置是无效的,如需使用,请访问主站

image-20250914191250458

查看管理员后台。

image-20250914184929521

如果想查看用户端视角,可以登录主站查看。

在接下来的版本中,会添加多语言适配、时区设置等功能,敬请期待。

如果想了解如何部署和使用项目,可以参考文档的内容,也欢迎补充文档缺失的内容。

如果你对草梅 Auth 感兴趣,欢迎参与开发和测试。

GitHub Release

push-all-in-one

v4.4.4 - 2025-09-14 01:56:18

摘要:
版本 4.4.4 (2025-09-13) 摘要:

Bug 修复:

  • 构建:移除 validate-commit-msg 依赖和 husky commit-msg 钩子

caomei-auth

v1.7.0 - 2025-09-13 20:27:20

摘要:
版本 1.7.0 主要更新包括:

新增邮箱验证选项,要求用户登录前验证邮箱;添加 Demo 模式相关类型定义、假数据生成工具和配置;支持通过环境变量设置密码强度要求;添加调试构建支持。

Bug 修复涉及邮箱验证配置、环境变量引用简化、Demo 用户接口更新、SSO 提供商生成逻辑调整、依赖版本错误修正、密码强度验证修复、构建工具更换、数据预填充恢复、错误信息捕获、配置更新等。

代码重构增强了 Demo 模式守卫,阻止危险的管理操作和写操作。

最新 GitHub 加星仓库

  • CaoMeiYouRen starred openpose - 2025-09-09 16:31:53
    OpenPose 是一个实时多人关键点检测库,支持身体、面部、手部和足部姿态估计。主要编程语言为 C++,在 GitHub 上获得 33036 个星标。
  • CaoMeiYouRen starred cocos2d-x - 2025-09-08 20:43:09
    Cocos2d-x 是一套开源跨平台游戏开发工具,被全球数百万开发者使用。其核心已发展为 Cocos Creator 1.x 和 2.x 的基础框架,主要采用 C++语言开发,在 GitHub 上获得 18729 个星标。
  • CaoMeiYouRen starred pixijs - 2025-09-08 20:41:41
    HTML5 Creation Engine 是一款使用 TypeScript 开发的高性能 2D WebGL 渲染引擎,能够创建精美的数字内容。该引擎以快速和灵活著称,在 GitHub 上获得 45,720 个星标。
  • CaoMeiYouRen starred phaser - 2025-09-08 20:27:05
    Phaser 是一个免费、快速且有趣的 2D 游戏框架,用于开发桌面和移动网页浏览器的 HTML5 游戏,支持 Canvas 和 WebGL 渲染。主要编程语言为 JavaScript,在 GitHub 上获得 38,382 个星标。

其他博客或周刊推荐

阮一峰的网络日志

潮流周刊

二丫讲梵的学习周刊

总结

本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:

往期回顾

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/2025-37-caomei-weekly-caomei-auth-1-7-0-demo-mode.html
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

🔲 ☆

WAU 管理器 3.8.5.0 汉化 Windows 自动更新管理

WAU 管理器 (Windows自动更新管理器) 是内置 Windows 更新界面的功能齐全的替代品。该工具使您可以完全控制 Windows 更新,例如安装时间和方式,并为 Windows 更新提供全面的卸载和维护支持。 修改说明 • 基于官方原版 • 汉化界 …
🔲 ☆

草梅 Auth 1.3.0 发布与 GitHub 动态 | 2025 年第 32 周草梅周报

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。

前言

欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。


本周依旧在开发 草梅 Auth 中。

你也可以直接访问官网地址:https://auth.cmyr.dev/
文档地址:https://auth-docs.cmyr.dev/

本周 草梅 Auth 发布了 1.3.0 版本。

本周主要是优化了日志相关模块,优化用户管理页面,增加 SSO 功能,和修复内存缓存错误。

image-20250810202809751

如果想了解如何部署和使用项目,可以参考文档的内容,也欢迎补充文档缺失的内容。

如果你对草梅 Auth 感兴趣,欢迎参与开发和测试。

GitHub Release

caomei-auth

v1.3.0 - 2025-08-09 19:22:25

摘要:
版本 1.3.0 更新摘要 (2025-08-09)

代码重构:

  • 优化日志格式化代码,提升可读性和一致性
  • 简化日志记录实现,移除不必要的依赖
  • 重构 OAuth 应用管理路由和命名
  • 新增 SSO 提供商管理功能,支持敏感信息隐藏和错误处理
  • 替换用户代理解析库为 ua-parser-js

新功能:

  • 管理后台添加项目文档链接
  • 新增 SSO 登录功能和管理界面
  • 集成 Winston 日志库,支持多级别日志记录和每日轮转
  • 增强用户管理功能,支持排序、搜索和筛选
  • 新增 SSOProvider 实体管理单点登录配置
  • 添加无障碍适配文档和社交登录图标支持

Bug 修复:

  • 使用更安全的 crypto 模块生成 OAuth 客户端密钥
  • 修复内存存储类型和增量逻辑问题

cmyr-template-cli

v1.39.3 - 2025-08-08 01:20:01

摘要:
[1.39.3]版本更新摘要:

主要变更:

  1. Bug 修复:
    • 将 ignore 属性调整为可选属性
    • 更新了 YAML 字符串化配置

本次更新主要解决了配置相关的问题,通过使 ignore 属性变为可选并调整 YAML 处理方式,提高了工具的灵活性和兼容性。

最新 GitHub 加星仓库

  • CaoMeiYouRen starred ani-rss - 2025-08-08 19:41:14
    蜜柑 RSS 动漫是一款基于 Java 开发的自动追番订阅下载工具,拥有 2234 个星标。
  • CaoMeiYouRen starred better-auth-localization - 2025-08-04 01:53:27
    Better Auth 的本地化插件,可自动翻译错误信息。主要使用 TypeScript 语言开发,获得 25 个星标。
  • CaoMeiYouRen starred ua-parser-js - 2025-08-04 00:55:22
    UAParser.js 是一个用于用户代理检测的 JavaScript 工具库,能够解析浏览器用户代理字符串。该项目在 GitHub 上获得 9785 个星标,主要编程语言为 JavaScript。其核心功能是帮助开发者识别访问者的浏览器、操作系统和设备信息,适用于各类 Web 开发场景。

其他博客或周刊推荐

阮一峰的网络日志

HelloGitHub 热点速览

阿猫的博客

潮流周刊

二丫讲梵的学习周刊

总结

本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:

往期回顾

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/2025-32-caomei-weekly-caomei-auth-1-3-0-github-updates.html
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

🔲 ☆

草梅 Auth 1.2.0 发布与最新动态 | 2025 年第 31 周草梅周报

本文在 草梅友仁的博客 发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。

前言

欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。


本周依旧在开发 草梅 Auth 中。

你也可以直接访问官网地址:https://auth.cmyr.dev/

本周 草梅 Auth 发布了 1.2.0 版本。

本周主要是优化了后台管理页面,增加了登录统计页面。

image-20250803195105231

此外,也正式发布了文档:https://auth-docs.cmyr.dev/

image-20250803195413011

如果想了解如何部署和使用项目,可以参考文档的内容,也欢迎补充文档缺失的内容。

如果你对草梅 Auth 感兴趣,欢迎参与开发和测试。

rss-impact-server 也增加了 OIDC 登录支持。

后续,草梅 Auth 也将正式进入宣发阶段,欢迎试用。

博客更新

GitHub Release

rss-impact-server

v1.16.0 - 2025-08-02 20:52:51

摘要:
版本 1.16.0 摘要:

  1. 回退变更:

    • 撤销了 connect-redis 从 8.1.0 升级到 9.0.0 的依赖更新
  2. 新增功能:

    • 认证模块新增 OIDC 兼容配置支持,包含动态检测和处理逻辑
    • 添加完整的 OIDC 认证支持,更新了相关配置和回调处理
  3. Bug 修复:

    • 修正了 Auth0 登录重定向 URL,现使用 BASE_URL 作为基础路径

afdian-linker

v1.4.0 - 2025-08-02 20:23:53

摘要:
版本 1.4.0 更新摘要:

代码重构:

  • 优化了登录页面的代码结构

新功能:

  • 在用户资料页面新增显示 OAuth ID 功能
  • 改进了用户信息展示方式
  • 修复了重定向消息编码问题

Bug 修复:

  • 添加了 ms 库及其类型定义,优化了缓存过期时间设置
  • 修复了 OAuth 用户信息标准化问题
  • 增加了对用户名的支持
  • 优化了配置端口设置

caomei-auth

v1.2.0 - 2025-08-02 19:23:43

摘要:
版本 1.2.0 摘要 (2025-08-02)

代码重构:

  • 优化管理员角色同步逻辑,新增用户对象复用功能
  • 移除权限管理相关内容和废弃 API
  • 改进应用创建功能,支持 RFC7591 标准响应
  • 优化身份验证中间件结构和注释
  • 替换 Alert 为 Message 组件优化双因素认证提示
  • 加强 URL 验证逻辑,使用 validator 库进行严格检查

新功能:

  • 使用 dayjs 优化日期处理,提升统计准确性
  • 实现管理员角色自动同步功能
  • 新增登录统计页面和 API 端点
  • 添加侧边栏收缩功能和导航项显示优化
  • 集成 primelocale 库并设置中文为默认语言
  • 添加应用状态管理功能(启用/禁用)
  • 支持 JWT 认证和 JWKS 实体类
  • 集成 Microsoft Clarity 行为分析工具
  • 新增部署指南和常见问题文档
  • 添加 Sentry 错误监控集成
  • 实现用户协议和隐私政策同意功能

Bug 修复:

  • 优化用户操作按钮的角色和状态判断
  • 修正凭证图标和名称显示
  • 更新用户信息声明,优化隐私处理
  • 添加 PKCE 配置选项控制
  • 更新 OAuth 2.0 兼容性提示
  • 修改用户信息显示为昵称
  • 禁止用户名使用手机号格式
  • 添加邮件和文件上传限流配置

最新 GitHub 加星仓库

  • CaoMeiYouRen starred TrendRadar - 2025-08-01 11:02:59
    一款多平台热点聚合工具,可监控 35 个主流平台的热点内容,包括今日头条、百度热搜、微博等。提供智能关键词筛选和自动分析报告功能,支持多种企业通讯工具推送。部署便捷,1 分钟完成,兼容 docker 方式。旨在帮助用户高效获取关键信息,避免信息过载。
  • CaoMeiYouRen starred snapdom - 2025-07-29 09:44:40
    snapDOM 是一个 JavaScript 库,能够快速准确地将 HTML 元素捕获为图像。该项目已获得 4369 个星标。
  • CaoMeiYouRen starred LunaTranslator - 2025-07-29 09:43:54
    C++开发的视觉小说翻译工具,支持 HOOK、OCR 和剪贴板三种翻译方式。该项目在 GitHub 上获得 7772 个星标,表明其受欢迎程度较高。主要功能包括实时文本提取和翻译,适用于视觉小说类游戏。
  • CaoMeiYouRen starred Wan2.2 - 2025-07-28 23:30:01
    Wan 是一个开源的大规模视频生成模型项目,采用 Python 作为主要开发语言。该项目在 GitHub 上获得了 2284 个星标,表明其在开发者社区中受到广泛关注。作为先进的视频生成框架,Wan 专注于大规模视频内容的生成任务。

其他博客或周刊推荐

阮一峰的网络日志

HelloGitHub 月刊

阿猫的博客

潮流周刊

二丫讲梵的学习周刊

总结

本周的更新和动态如上所示。感谢您的阅读!
您可以通过以下方式订阅草梅周报的更新:

往期回顾

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/2025-31-caomei-weekly-auth-1-2-0-updates.html
版权声明:本文采用 CC BY-NC-SA 4.0 协议 进行分发,转载请注明出处!

🔲 ☆

更一个新

有好几个月没更新了,今天来更一个新。
最近一年有点儿懈怠,也许是年纪大了,精力上有些不济,再加上很多东西都失去了分享的动力,好些东西原来想着写上来的,但是过几天就没有分享的欲望了。

不知道同样写 Blog 的你是否也有同样的困惑。

就本站的流量来看,从三月开始逐月下降,意料之中,不更新内容,还想有流量,想的美。

月初去了三藩市,市面比去年干净了一些。

2025-07-19 17.53.13.jpg2025-07-19 19.49.16.jpg2025-07-19 19.49.46.jpg2025-07-14 14.50.51.jpg2025-07-19 21.28.53.jpg2025-07-13 15.11.35.jpg

每年都会去三藩市。

有些照片放到了这里,https://images.g2soft.net/album/San-Francisco.hE7

可以看看。

❌