• בלוג
  • היום למדתי: undefined בשאילתת פריזמה

היום למדתי: undefined בשאילתת פריזמה

16/08/2025

הפקודה הבאה ב prisma לא תיגמר טוב-

prisma.user.deleteMany({
  where: {
    id: undefined
  }
})

פקודת deleteMany שמקבלת undefined ב where מתעלמת מאותו בלוק where ולכן הפקודה תמחק את כל המשתמשים. זו דוגמה מהעולם האמיתי לכישלון:

const { shopId } = payload;
await prisma.event.deleteMany({
  where: { visitor: { shopId } }
});

מספיק לקבל payload בלי השדה shopId או עם שגיאת כתיב בשם השדה כדי שהבלוק ימחק את כל האירועים. מקור: https://www.ingressr.com/blog/webhook-security-incident-analysis/.

לי היתה תקלה דומה במקום אחר בשפת רובי עם like, כשבלוק כזה:

Item.where("name like '#{prefix}%-phone'").destroy_all

מחק יותר מדי רשומות כשבטעות prefix עבר בתור nil.

שורה תחתונה לגבי וולידציה - חשוב לבצע את הוולידציה כמה שיותר קרוב לפעולה המסוכנת. פריזמה בוחנים אפשרות להגדיר undefined בתוך שאילתה בתור שגיאה:

https://www.prisma.io/docs/orm/prisma-client/special-fields-and-types/null-and-undefined#strict-undefined-checks-preview-feature

כשזה יקרה כמובן שכדאי להפעיל את זה. עד אז לפני כל קריאה ל deleteMany תוסיפו בדיקה לוודא שהמשתנים שעוברים לשאילתה מכילים ערך.