היום למדתי: 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 בתוך שאילתה בתור שגיאה:
כשזה יקרה כמובן שכדאי להפעיל את זה. עד אז לפני כל קריאה ל deleteMany תוסיפו בדיקה לוודא שהמשתנים שעוברים לשאילתה מכילים ערך.