תוצאות ביקורת אבטחה: למה הרגשתי מבוכה
לאחרונה הרצתי ביקורת אבטחה על כל הפרויקטים האישיים שלי. זה כולל את ה-FastAPI backend שלי, בוטים של Telegram, אפליקציות PWA ו-Streamlit.
חשבתי שהקוד שלי בטוח כי הייתי זהיר. טעיתי.
אני משתף את באגים אמיתיים מסביבת הייצור (production) כדי לעזור לכם להימנע מהם. אלו אינם רשימות תיוג תיאורטיות. אלו טעויות שאני באמת עשיתי.
מלכודת האימות המותנה (Conditional Authentication) כתבתי קוד שבדק אם קיים API secret לפני שהוא אימת אותו. אם משתנה הסביבה (environment variable) היה חסר, הבדיקה פשוט נדלגה. זה אומר שכל ה-API שלי היה פתוח לציבור. Rule: אם secret חסר, תכשיל את הפעולה בצורה חריפה עם שגיאת 500. לעולם אל תדלג על אימות (authentication).
הדלפת היסטוריית Git פעם הכנסתי API key בצורה קשיחה (hardcoded) לצורך בדיקה מהירה. העברתי אותו לקובץ .env מאוחר יותר וחשבתי שהבעיה נפתרה. אבל Git זוכר הכל. כל אחד יכול למצוא את המפתח הזה בהיסטוריית ה-commit שלי. Rule: אם ביצעת commit למפתח, הנח שהוא נגנב. בצע לו rotation באופן מיידי. השתמש ב-git-filter-repo כדי לנקות את ההיסטוריה שלך.
הדלפת endpoint של debug השארתי endpoint של
/debug/configבסביבת ה-production כדי לעזור לי בפתרון תקלות (troubleshoot). הוא חשף את כתובות ה-database שלי ואת הגדרות הסביבה. Rule: הסר את כל ה-debug endpoints לפני פריסה (deployment). השתמש ב-logs במקום.הדלפת מידע מערכת דרך שגיאות השתמשתי ב-
str(e)בתגובות השגיאה שלי. זה שלח שגיאות database ונתיבי קבצים ישירות למשתמש. תוקפים משתמשים בזה כדי למפות את התשתית (infrastructure) שלך. Rule: תרשום (log) את השגיאה המפורטת עבור עצמך. שלח הודעת "Internal Server Error" כללית ללקוח.סיכון XSS ב-Frontend השתמשתי ב-
innerHTMLכדי לרנדר תוכן משתמש. זה אפשר לסקריפטים לרוץ בדפדפנים של משתמשים אחרים. Rule: תמיד בצע escape ל-HTML. התייחס ל-innerHTMLכדרך להריץ קוד שרירותי.היעדר מגבלות קצב (Rate Limits) היו לי endpoints שקראו למודלי AI יקרים ללא שום מגבלה. לולאה אחת או מפתח גנוב יכלו לעלות לי מאות דולרים. Rule: אימות (authentication) עוצר משתמשים לא מורשים. מגבלת קצב (rate limiting) עוצרת משתמשים מורשים מלעשות שימוש לרעה במערכת שלך.
מדיניות CORS רחבה מדי השתמשתי ב-
allow_origins=["*"]ב-production. זה מאפשר לכל אתר לבצע בקשות ל-API שלך. Rule: אפשר רק את דומיין ה-frontend הספציפי שלך.The Temporary File Leak If my code crashed while processing a file, the temporary file stayed on the disk forever. This wastes space and leaks sensitive data. Rule: Use try-finally blocks to ensure files are deleted even if an error occurs.
My new mandatory checklist:
Before coding: • Create a .gitignore • Create a .env.example
For every endpoint: • Add authentication • Use generic error messages • Add rate limits to expensive tasks
Before committing: • Scan for secrets in your diff
Before deploying: • Run security audits on your dependencies
Security issues do not happen by accident. They happen because of "TODO" comments and "temporary" fixes that stay in production forever.
Fixing a bug is boring. Fixing a breach is expensive.