Fastify Schema校验不能防止SQL注入,它仅验证输入格式合法性,无法拦截恶意SQL payload;真正防护必须依赖参数化查询或ORM,Schema仅作为压缩攻击面的前置约束。

Fastify Schema校验本身不防SQL注入,但能帮你提前暴露非法输入
直接说结论:Fastify的schema验证对SQL注入**没有拦截能力**——它只校验请求体、查询参数、路径参数等结构是否符合JSON Schema定义,而SQL注入的payload(如' OR 1=1--)完全可能通过{ "id": "' OR 1=1--" }这种合法JSON格式。Schema校验不是防火墙,它是“数据契约”,不是“安全网关”。
但它能帮你把问题显性化:比如你定义params.id为{ type: 'string', pattern: '^[a-zA-Z0-9]{6,12}$' },那带单引号、空格、分号的恶意ID根本进不了路由处理函数,自然也就不会传给数据库层。这是从**输入契约层面压缩攻击面**,不是靠Schema本身过滤。
- Schema只在
preValidation钩子触发,此时请求已解析但未进入业务逻辑,是做输入约束的最早可控节点 - 若你把
id定义为integer类型,那?id=1%20OR%201=1会直接返回400,连数据库连接都不用建 - 但注意:如果后端仍用字符串拼接构造SQL(比如
SELECT * FROM users WHERE id = '${req.params.id}'),Schema拦得住格式错误,拦不住绕过校验的合法字符串(如123后面跟UNION SELECT注入到其他字段)
真正防SQL注入的位置在数据库操作层,不是Schema层
Fastify的schema和SQL注入防护属于两个正交问题:前者管“请求长什么样”,后者管“怎么用这个请求去查数据库”。你在schema里写得再严,只要数据库调用还用字符串拼接,就等于门锁得很牢,但窗大开着。
正确做法是把Schema校验当作第一道“形状检查”,后面必须跟上参数化查询:
- 用
pg.query('SELECT * FROM users WHERE id = $1', [req.params.id])(PostgreSQL) - 用
mysql2的connection.execute('SELECT * FROM users WHERE id = ?', [req.params.id]) - 用Prisma时,所有
where条件自动参数化,无需手动干预
如果你在Fastify路由里看到db.query(`SELECT * FROM users WHERE name = '${req.body.name}'`)这种写法,删掉它——Schema再完美也救不了。
Schema配合白名单式路径/参数设计,能堵住常见注入入口
短链服务、API网关这类系统,很多SQL注入源于宽松的路径或参数命名。比如/api/user/:id中:id若允许任意字符串,攻击者可传1; DROP TABLE users;;而如果Schema强制params.id匹配^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$(UUID格式),就天然排除了分号、空格、SQL关键字。
同理,对querystring.sort字段,不要写{ type: 'string' },而是限定为{ enum: ['name', 'created_at', 'score'] }——攻击者想注入score; DROP TABLE?Schema直接400。
- 路径参数(
params)最适合作强约束,因为语义明确、格式固定 -
querystring适合枚举或正则限制,避免开放order by类动态字段 -
body字段若含URL、邮箱、手机号,务必用format: 'uri'、format: 'email'、pattern等收紧
别依赖Schema做内容过滤,该转义的地方还得转义
Schema不处理内容净化。比如你允许body.comment为任意string,用户提交<script>alert(1)</script>,Schema照收不误——这属于XSS范畴,和SQL注入无关,但也说明Schema不是万能胶。
真正关键的是分层意识:Schema负责“是不是我要的格式”,数据库驱动负责“是不是安全地执行”,模板引擎负责“输出时是不是转义了”,日志系统负责“记录时是不是剥离了控制字符”。漏掉任何一层,都可能让注入穿透。
最容易被忽略的是:你以为加了Schema就安全了,结果在日志里直接console.log(req.body),攻击者用\r\nSet-Cookie: admin=true就能做CRLF注入——这和SQL注入无关,但危害一样真实。

















