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

Clerk Custom Ui Skill 安全审计

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

Custom authentication flows and component appearance - hooks (useSignIn,

第三方安全检查结论

发现安全风险

已检查文件
6
发现的风险
3
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
低风险

完整示例会把原始认证错误对象显示给未登录访问者

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

参考资料说明 `errors.raw` 包含原始 Clerk 错误数组,但完整登录和注册示例使用 `JSON.stringify(errors)` 将整个错误对象直接渲染到认证页面。

为什么需要注意

如果原始错误含有内部错误代码、详细原因或账户状态信息,访问登录或注册页的人可能看到超出用户界面所需的认证诊断信息。可见内容取决于 Clerk 实际返回的错误。

资料明确说明 `errors` 可包含原始 Clerk 错误数组,而两个“完整示例”都把整个 `errors` 对象渲染到公开认证页面。若这些示例用于生产且 Clerk 返回内部诊断字段,未登录访问者可能看到超出友好提示所需的信息。来源未显示原始数组具体包含秘密,因此不能断言凭据已泄露。用户可要求生产界面仅展示经筛选的字段消息,并将完整诊断限制在受保护日志中。

core-3/custom-sign-in.md:173来自说明文档打开原文件
// Global errors (not tied to a field)errors?.global // ClerkGlobalHookError[] | null// Raw error arrayerrors?.raw // ClerkError[] | null```
查看另外 3 个位置
core-3/custom-sign-in.md:300来自说明文档打开原文件
        </div>        <button type="submit" disabled={fetchStatus === 'fetching'}>          Continue        </button>      </form>      {errors && <p>{JSON.stringify(errors, null, 2)}</p>}    </>  )
core-3/custom-sign-up.md:142来自说明文档打开原文件
// Global errorserrors?.global // ClerkGlobalHookError[] | null// Raw error arrayerrors?.raw // ClerkError[] | null```
core-3/custom-sign-up.md:242来自说明文档打开原文件
        </div>        <button type="submit" disabled={fetchStatus === 'fetching'}>          Continue        </button>      </form>      {errors && <p>{JSON.stringify(errors, null, 2)}</p>}      {/* Required for sign-up flows. Clerk's bot sign-up protection is enabled by default */}      <div id="clerk-captcha" />    </>
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 1 项风险
低风险

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

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

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

为什么需要注意

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

该技能主动要求安装 `@clerk/ui`,但命令未限定版本。用户执行时,npm 会按当时的依赖解析结果安装代码,因此未来可能得到与审计时不同的版本。这是可复现性和供应链变更风险,不代表软件包恶意。用户可要求作者提供兼容版本范围及锁文件,并在安装前审核实际解析版本。

SKILL.md:105来自说明文档打开原文件
```bashnpm install @clerk/ui```
查看另外 1 个位置
SKILL.md:102来自说明文档打开原文件
Install themes from `@clerk/ui`:```bashnpm install @clerk/ui```
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。发现 1 项风险
中风险

注册示例可能在未经用户实际确认时记录法律条款已接受

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

`signUp.update()` 示例把 `legalAccepted` 直接硬编码为 `true`,没有从同意复选框或其他明确的用户操作读取该值。

为什么需要注意

如果代理把示例直接用于生产注册流程,系统可能为未明确同意条款的用户记录接受状态,导致同意记录不可靠,并带来合同、审计或合规争议。

这是文档示例而非自动执行的实现,但它把 `legalAccepted` 与姓名、元数据一起直接设为 `true`,没有展示来自复选框或其他明确同意操作的依据。若代理照抄到真实注册流程,可能在用户未实际同意时记录法律条款已接受,影响合规记录和用户决定。用户可要求仅在明确同意事件后传值,并保存条款版本、时间和同意证据。

core-3/custom-sign-up.md:48来自说明文档打开原文件
### Update (add fields to existing sign-up)Use `update()` to add optional fields (name, metadata, legal acceptance, locale) to an existing sign-up before finalization.```typescriptconst { error } = await signUp.update({  firstName: 'Jane',  lastName: 'Doe',  unsafeMetadata: { referralSource: 'twitter' },  legalAccepted: true,})```

Skill 逻辑拆解

6 个说明模块

该 Skill 根据项目中的 Clerk SDK 版本选择 Core 2 或当前版参考资料,然后指导代理构建登录、注册或外观定制。

查看原文
SKILL.md:156来自说明文档打开原文件
1. Identify customization needs (custom flow or appearance)2. For custom flows: check SDK version → read appropriate `core-2/` or `core-3/` reference3. For appearance: WebFetch the appropriate documentation from table above4. Apply appearance prop to your Clerk components or build custom flow with hooks

外观流程会从 clerk.com 获取文档,并可能要求安装 Clerk 的主题包;这会产生网络访问,并在用户项目中增加依赖。

查看原文
SKILL.md:102来自说明文档打开原文件
Install themes from `@clerk/ui`:```bashnpm install @clerk/ui```
SKILL.md:156来自说明文档打开原文件
1. Identify customization needs (custom flow or appearance)2. For custom flows: check SDK version → read appropriate `core-2/` or `core-3/` reference3. For appearance: WebFetch the appropriate documentation from table above4. Apply appearance prop to your Clerk components or build custom flow with hooks

自定义认证示例接收密码、验证码和 MFA 码,并在认证完成后激活 Clerk 会话。提供的文本未指示把这些凭据发送到 Clerk 之外的目的地。

查看原文
core-2/custom-sign-in.md:145来自说明文档打开原文件
    try {      const result = await signIn.create({ identifier, password })      if (result.status === 'needs_second_factor') {        setStep('mfa')        return      }      if (result.status === 'complete') {        await setActive({ session: result.createdSessionId })        router.push('/')      }
core-2/custom-sign-up.md:133来自说明文档打开原文件
    try {      const result = await signUp.attemptVerification({        strategy: 'email_code',        code,      })      if (result.status === 'complete') {        await setActive({ session: result.createdSessionId })        router.push('/')      }

角色、权限和套餐条件使用的 `<Show>` 仅控制浏览器中的可见性。Skill 明确警告它不是安全边界,并要求在服务器端验证访问权限。

查看原文
core-3/show-component.md:106来自说明文档打开原文件
## Security Caveat**`<Show>` only visually hides content** — it remains in browser source. It is not a security boundary. For protecting sensitive data, always verify authentication server-side with `auth()` or use `auth.protect()` in middleware.
从这里开始 · 工作说明SKILL.md
clerk-custom-ui
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。
文件与检查记录6 个文件

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文
  • core-2/custom-sign-in.md已纳入全文
  • core-2/custom-sign-up.md已纳入全文
  • core-3/custom-sign-in.md已纳入全文
  • core-3/custom-sign-up.md已纳入全文
  • core-3/show-component.md已纳入全文

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

  • SKILL.md工作说明
  • core-2/custom-sign-in.md配套文件
  • core-2/custom-sign-up.md配套文件
  • core-3/custom-sign-in.md配套文件
  • core-3/custom-sign-up.md配套文件
  • core-3/show-component.md配套文件

代码和说明中提到的操作

连接外部网站
SKILL.md:51来自说明文档打开原文件
|------|---------------|| Appearance prop overview | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/overview || Options (structure, logo, buttons) | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/layout |
SKILL.md:52来自说明文档打开原文件
| Appearance prop overview | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/overview || Options (structure, logo, buttons) | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/layout || Themes (pre-built dark/light) | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/themes |
SKILL.md:53来自说明文档打开原文件
| Options (structure, logo, buttons) | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/layout || Themes (pre-built dark/light) | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/themes || Variables (colors, fonts, spacing) | https://clerk.com/docs/nextjs/guides/customizing-clerk/appearance-prop/variables |
运行命令
SKILL.md:104来自说明文档打开原文件
```bashnpm install @clerk/ui
安装其他软件包
SKILL.md:105来自说明文档打开原文件
```bashnpm install @clerk/ui```
读取密钥或账号配置
core-2/custom-sign-in.md:136来自说明文档打开原文件
  const [mfaCode, setMfaCode] = useState('')  const [step, setStep] = useState<'credentials' | 'mfa'>('credentials')  const [error, setError] = useState('')
读取了多少行
1,293
文件校验值(用于核对版本)
ed0e8d2b3d9cbf79f5eed453849b80086479036d2c46877cd5d26cd3e7788cdf