# GraphQL输入验证与错误处理安全指南
## 概述
GraphQL灵活输入容易触发类型绕过与高负载。通过输入校验与错误约束可有效降低风险。
## 自定义Scalar与校验
```typescript
import { GraphQLScalarType, Kind } from 'graphql'
export const EmailScalar = new GraphQLScalarType({
name: 'Email',
serialize(value: unknown) {
const s = String(value)
if (!/^\S+@\S+\.\S+$/.test(s)) throw new TypeError('invalid_email')
return s
},
parseValue(value: unknown) {
const s = String(value)
if (!/^\S+@\S+\.\S+$/.test(s)) throw new TypeError('invalid_email')
return s
},
parseLiteral(ast) {
if (ast.kind !== Kind.STRING) throw new TypeError('invalid_email')
if (!/^\S+@\S+\.\S+$/.test(ast.value)) throw new TypeError('invalid_email')
return ast.value
}
})
```
## 输入类型白名单
```graphql
input CreateUserInput {
email: Email!
name: String!
role: String @allowed(values: ["user", "admin"])
}
```
## 统一错误模型
```typescript
type ApiError = { code: string; message: string }
function safeError(err: unknown): ApiError {
const code = err instanceof Error ? err.message : 'unknown_error'
const map: Record

发表评论 取消回复