KeystoneJS 6生产环境如何关闭GraphQL查询错误字段拼写提示
解决方案
Keystone 6 底层确实基于 Apollo Server 提供 GraphQL 服务,可通过修改 Keystone 配置文件自定义错误处理逻辑,生产环境关闭敏感错误提示:
- 找到项目根目录下的
keystone.ts(或keystone.js)配置文件,在导出的配置对象中新增 GraphQL 相关配置项,参考代码如下:
import { config } from '@keystone-6/core'; import { lists } from './schema'; export default config({ // 你原本的数据库配置 db: { provider: 'postgresql', url: process.env.DATABASE_URL || 'postgres://localhost/keystone', }, lists, // 新增的GraphQL配置 graphql: { // 生产环境关闭GraphQL调试页面,避免攻击者直接访问接口调试入口 playground: process.env.NODE_ENV !== 'production', apolloConfig: { // 仅开发环境开启调试模式,生产环境自动关闭字段推荐等提示 debug: process.env.NODE_ENV !== 'production', // 自定义错误格式化逻辑,生产环境隐藏schema相关敏感信息 formatError: (err) => { if (process.env.NODE_ENV === 'production') { return { message: '请求参数错误', extensions: { code: err.extensions?.code || 'REQUEST_ERROR', }, }; } // 开发环境保留完整错误信息,不影响调试 return err; }, }, }, // 你原本的其他配置:session、UI配置等 });
- 配置生效后,生产环境下的非法 GraphQL 请求只会返回通用错误提示,不会再出现字段名推荐、模型名称等可被利用来枚举数据结构的信息,开发环境的错误提示不受影响,不影响正常开发调试。
额外优化建议
- 可额外配置 GraphQL 查询复杂度、深度限制,避免攻击者通过构造多层嵌套查询消耗服务资源
- 若启用了 Keystone 自动生成的 REST API,可通过配置接口路由的中间件统一处理错误返回,进一步降低信息泄露风险
内容的提问来源于stack exchange,提问作者ConductedClever
相关产品推荐
相关产品推荐

