Zod 的 .refine() 方法如何导致拒绝服务攻击——以及如何修复

发布日期:2026-05-01 10:00:26   浏览量 :1
发布日期:2026-05-01 10:00:26  
1

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

太长不看版

Zod 的 .refine() 方法会在每次输入时执行——即使之前的验证器(如 .min().max())已经失败。 如果你在 .refine() 中放置了诸如数据库查询等耗时操作,攻击者可以通过每个请求触发该查询,包括那些包含完全无效输入、永远无法通过验证的请求。如果并发发送足够多的此类请求,服务器将会宕机。 修复方法仅需一行代码——先验证,后查询——但前提是你必须知道这种行为的存在。

简介

Zod 是应用最广泛的 TypeScript 验证库之一。如果你正在构建 Next.js API 路由、tRPC 端点或服务器动作,Zod 很可能参与了你的验证层。它之所以受到信赖,正是因为它让验证变得简单直接——定义一次模式,随处进行验证。

这种信任使得这一行为上的边界情况比在较少使用的库中更加危险。开发人员通常认为,如果 .min().max() 拒绝了某个输入,Zod 就会在此停止。事实并非如此。如果你在生产代码中将数据库查询放在了 .refine() 内部——这在实现唯一性检查时是很自然的做法——那么你的服务器就存在一个应用层拒绝服务漏洞,利用该漏洞无需身份认证,也无需特殊工具。

什么是 Zod?

Zod 是一个优先支持 TypeScript 的模式验证库。定义一个模式,针对该模式验证数据,返回经过验证的数据或类型化的错误对象。它适用于全栈场景:客户端的表单验证、服务器端的 API 请求和响应验证、启动时的环境变量验证,以及在 TypeScript 无法提供编译时保证的任何地方进行运行时类型收窄。

import { z } from "zod"

const UserSchema = z.object({
  username: z.string().min(2).max(20),
  email: z.string().email(),
  age: z.number().int().min(18),
})

// parse 返回类型化数据或抛出 ZodError 错误
const user = UserSchema.parse(req.body)

// safeParse 返回 { success: true, data } 或 { suc

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部