**核心要点** - 动作必须使用不可变 `@` 固定;禁止 `@vX` 与 `@main`。 - 最小权限与受控密钥;工作流仅启用必要的 `permissions`。 **实现示例** ```ts type Step = { uses?: string; with?: Record; permissions?: Record } function pinned(uses?: string): boolean { if (!uses) return false const m = /@[a-f0-9]{40}$/i.exec(uses) return !!m } function validPerms(perms?: Record): boolean { if (!perms) return true const deny = ['admin'] for (const k of Object.keys(perms)) if (deny.includes(k)) return false return true } function evaluate(steps: Step[]): { ok: boolean; errors: string[] } { const errors: string[] = [] for (const s of steps) { if (s.uses && !pinned(s.uses)) errors.push(`unpin:${s.uses}`) if (!validPerms(s.permissions)) errors.push('permissions') } return { ok: errors.length === 0, errors } } ``` **审计与CI门禁** - 构建前校验所有 `uses` 是否 `@` 固定;不合规阻断。 - 审计记录包含动作名称、固定版本与权限摘要,支持回溯。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部