跳转到正文
报告库
用途分类 / 其他用途

Email And Password Best Practices Skill 安全审计

作者说它能做什么(原文)

Configure email verification, implement password reset flows, set password policies, and customise hashing algorithms for Better Auth email/password authentication. Use when users need to set up login, sign-in, sign-up, credential authentication, or password security with Better Auth.

第三方安全检查结论

先别安装或运行

已检查文件
1
发现的风险
4
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。发现 1 项风险
高风险

迁移命令执行未固定版本的远程 npm 包

原文依据:1 处
发现了什么

快速开始要求运行 `npx auth@latest migrate`。`@latest` 会选择执行时发布的版本,而不是用户已审查或锁定的版本;npx 还可能下载并执行该包。

为什么需要注意

如果上游版本被入侵、名称解析到意外包或新版本行为发生变化,它可在开发者权限下执行代码。迁移还可能修改认证数据库结构,造成兼容性或可用性问题。

该命令不仅引用未固定的 `@latest`,还要求执行 `migrate`。在 npx 需要获取包时,远程发布的新版本会在用户环境中执行,并可能修改认证数据库结构。源码没有提供版本校验、迁移预览或回滚说明。用户可要求固定包版本、发布校验信息,以及先备份并审查迁移计划。

SKILL.md:11来自说明文档打开原文件
3. Add `sendResetPassword` for password reset flows4. Run `npx auth@latest migrate`5. Verify: attempt sign-up and confirm verification email triggers
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
中风险

密码重置事件把用户邮箱写入应用日志

原文依据:2 处
发现了什么

示例在密码成功重置后,将完整用户邮箱插入 console 日志。生产环境通常会集中收集和长期保存这些日志。

为什么需要注意

能访问日志的人员或日志服务可看到哪些邮箱拥有账户以及何时发生密码重置;这会扩大个人数据暴露范围,并可辅助定向钓鱼。

这是标注为可选的事件钩子示例,不会仅因阅读 Skill 自动运行;但若用户照搬并启用,它会在每次成功重置后把完整邮箱写入 console。若生产日志被集中收集或长期保留,这会扩大个人信息的访问和留存范围。用户可要求作者默认省略或脱敏该字段,并限制日志访问、留存和导出。

SKILL.md:87来自说明文档打开原文件
    // Optional event hook    onPasswordReset: async ({ user }, request) => {      // your logic here      console.log(`Password for user ${user.email} has been reset.`);    },  },
查看另外 1 个位置
SKILL.md:86来自说明文档打开原文件
    },    // Optional event hook    onPasswordReset: async ({ user }, request) => {      // your logic here      console.log(`Password for user ${user.email} has been reset.`);    },  },
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
中风险

未跟踪的密码重置邮件任务可能被提前终止

原文依据:2 处
发现了什么

示例用 `void sendEmail(...)` 丢弃邮件 Promise,因此回调会在发送完成或失败前返回。后面的 serverless 建议只能等待被交给 handler 的 Promise;此示例没有把该邮件 Promise 交给它。

为什么需要注意

在请求结束后会冻结进程的 serverless 环境中,重置邮件可能未发送;发送失败也无法由此回调可靠处理,导致用户无法恢复账户。

密码重置示例用 `void` 启动邮件发送后立即让回调返回,因此发送失败不会由该回调等待或传播;在可能冻结进程的 serverless 环境中,邮件也可能未完成。后文虽建议使用 `waitUntil` 类处理器,但示例没有返回邮件 Promise 或显式把它传给该处理器。用户可要求作者展示两者的实际连接方式,并在部署平台上验证发送完成和失败处理。

SKILL.md:79来自说明文档打开原文件
    // Custom email sending function to send reset-password email    sendResetPassword: async ({ user, url, token }, request) => {      void sendEmail({        to: user.email,        subject: "Reset your password",        text: `Click the link to reset your password: ${url}`,      });    },    // Optional event hook
查看另外 1 个位置
SKILL.md:99来自说明文档打开原文件
On serverless platforms, configure a background task handler:```tsexport const auth = betterAuth({  advanced: {    backgroundTasks: {      handler: (promise) => {        // Use platform-specific methods like waitUntil        waitUntil(promise);      },    },
低风险

安装命令没有固定依赖版本

原文依据:1 处
发现了什么

安装命令没有指定依赖版本。同样的命令以后可能下载不同代码,你实际安装的内容可能与这次检查时不同。

为什么需要注意

即使命令和报告没变,以后安装时也可能下载到另一份代码。

快速开始明确要求运行带 `@latest` 的 npx 命令。若本机没有对应包,npx 可能下载并执行运行时的最新版本,因此将来执行的代码可能不同于当前审查版本,并会进行数据库迁移。用户可要求作者给出经过验证的固定版本及迁移前备份、预览步骤,或仅允许使用项目锁文件中的本地 CLI。

SKILL.md:11来自说明文档打开原文件
3. Add `sendResetPassword` for password reset flows4. Run `npx auth@latest migrate`5. Verify: attempt sign-up and confirm verification email triggers
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

6 个说明模块

该 Skill 配置邮件验证发送,但只有启用 requireEmailVerification 才会阻止未验证用户登录;单独发送验证邮件并不强制验证。

查看原文
SKILL.md:41来自说明文档打开原文件
For stricter security, enable `emailAndPassword.requireEmailVerification` to block sign-in until the user verifies their email. When enabled, unverified users will receive a new verification email on each sign-in attempt.
SKILL.md:44来自说明文档打开原文件
```tsexport const auth = betterAuth({  emailAndPassword: {    requireEmailVerification: true,  },});```

密码重置令牌默认一小时过期且成功使用后删除;撤销现有会话是需要另外开启的选项。

查看原文
SKILL.md:116来自说明文档打开原文件
Tokens expire after 1 hour by default. Configure with `resetPasswordTokenExpiresIn` (in seconds):
SKILL.md:127来自说明文档打开原文件
Tokens are single-use — deleted immediately after successful reset.
SKILL.md:131来自说明文档打开原文件
Enable `revokeSessionsOnPasswordReset` to invalidate all existing sessions on password reset:```tsexport const auth = betterAuth({  emailAndPassword: {    enabled: true,    revokeSessionsOnPasswordReset: true,  },

该 Skill 允许替换密码哈希算法,并明确警告直接切换会使旧密码无法登录,因此现有系统需要迁移策略。

查看原文
SKILL.md:186来自说明文档打开原文件
To use Argon2id or another algorithm, provide custom `hash` and `verify` functions:
SKILL.md:212来自说明文档打开原文件
**Note**: If you switch hashing algorithms on an existing system, users with passwords hashed using the old algorithm won't be able to sign in. Plan a migration strategy if needed.
从这里开始 · 工作说明SKILL.md
email-and-password-best-practices
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。
文件与检查记录1 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明

代码和说明中提到的操作

安装其他软件包
SKILL.md:11来自说明文档打开原文件
3. Add `sendResetPassword` for password reset flows4. Run `npx auth@latest migrate`5. Verify: attempt sign-up and confirm verification email triggers
连接外部网站
SKILL.md:59来自说明文档打开原文件
Always use absolute URLs (including the origin) for callback URLs in sign-up and sign-in requests. This prevents Better Auth from needing to infer the origin, which can cause issues when your backend and frontend are on different domains.
SKILL.md:63来自说明文档打开原文件
const { data, error } = await authClient.signUp.email({  callbackURL: "https://example.com/callback", // absolute URL with origin});
SKILL.md:164来自说明文档打开原文件
    email: "john.doe@example.com", // required    redirectTo: "https://example.com/reset-password",  },
读取了多少行
213
文件校验值(用于核对版本)
0c861912c7349f700f2f8eb23f613cf28c2e6b7031f77645770b556bc2211d53