🗄️
Prismaで不要なカラムを除外する方法
Prismaでデータ取得時に不要な列を除外し、セキュリティリスクを軽減する方法を紹介します。
検証バージョン: Prisma 5.14.0
サンプルスキーマ
// schema.prisma
model User {
id Int @id @default(autoincrement())
name String
email String
}
方法1: 対策なし(非推奨)
const users = await prisma.user.findMany();
問題点: id、name、emailのすべての列が取得されます。意図せずemailなどの機密情報が含まれ、情報漏洩のリスクがあります。
方法2: selectで明示的に指定
const users = await prisma.user.findMany({
select: {
id: true,
name: true,
},
});
メリット:
- 取得する列を明示的に指定できる
- シンプルで分かりやすい
デメリット:
- 列が増えた場合、すべての
selectを修正する必要がある - 複数箇所で同じ定義を繰り返す
方法3: Zodでバリデーション(推奨)
import { z } from 'zod';
// スキーマ定義
const UserSchema = z.array(
z.object({
id: z.number(),
name: z.string(),
})
);
// データ取得とバリデーション
const users = UserSchema.parse(await prisma.user.findMany());
メリット:
- スキーマで取得データの型を定義・検証できる
- 型を再利用できる
// 型の再利用
type User = z.infer<typeof UserSchema>[number];
デメリット:
- Zodのスキーマ定義が必要
- ���ンタイムでのバリデーションコストが発生
推奨アプローチ
開発初期・小規模プロジェクト
selectを使った明示的な指定で十分です。
中規模以上・型安全性重視
Zodを使ったスキーマ定義を推奨します。以下の利点があります。
- 型の一元管理
- ランタイムバリデーション
- APIレスポンスの型安全性
まとめ
Prismaで不要な列を除外することで、以下のリスクを軽減できます。
- 機密情報の意図しない露出
- 不要なデータ転送によるパフォーマンス低下
プロジェクトの規模や要件に応じて、適切な方法を選択しましょう。
Discussion