PracticU

Improper Error Handling

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › Improper Error Handling
מילון מושגים:
לקוח - תוכנה או מחשב שפונים לשרת ומבקשים ממנו שירות או מידע, למשל דפדפן שמבקש דף אינטרנט.
Northwind - מסד נתונים לדוגמה של מיקרוסופט, המדמה חברת מסחר ומשמש ללימוד ולהדגמת שאילתות SQL.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
מפתח זר - עמודה בטבלה שמפנה למפתח הראשי בטבלה אחרת, ובכך יוצרת קשר בין הטבלאות.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
הערה - טקסט בקוד שמסביר אותו לבני אדם ואינו מבוצע על ידי המחשב.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
שם משתמש - מזהה ייחודי שמשתמש מזין כדי להזדהות במערכת, לרוב יחד עם סיסמה.

Improper Error Handling
Improper Error Handling הוא מצב שבו המערכת מחזירה ללקוח הודעות שגיאה גולמיות וחושפת מידע פנימי. ההרצאה מראה איך נראית הבעיה ואיך מונעים אותה בעזרת קבצי הגדרות נפרדים ל-development ול-production.
מה הבעיה
כדי לדמות קריסה, משנים זמנית את שם טבלת הפורום במסד הנתונים. הלקוח מקבל הודעה אוטומטית של המערכת, שחושפת את שם מסד הנתונים northwind ואת שם הטבלה. מחיקת מוצר שיש לו קשרים בטבלאות אחרות מחזירה הודעת foreign key constraint שחושפת עוד שמות של טבלאות ועמודות. הודעות כאלה לא אמורות להגיע ללקוח, כי האקר מנצל אותן כדי להכיר את המבנה.
הפתרון
1. שני קבצי קונפיגורציה: משכפלים את הקובץ ל-development ול-production. ב-app.js טוענים את אחד מהם ומעבירים להערה את השני. בהעלאה לאוויר מחליפים ביניהם.
2. משתנה isProduction: ב-development הערך false, וב-production true.
3. תיקיית helpers: יוצרים errors-handler.js עם פונקציה getError. אם config.isProduction אמת, מחזירה הודעה כללית כמו "some error occurred, please try again later". אחרת מחזירה err.message. חושפים אותה דרך module.exports.
4. שימוש בקונטרולרים: מבצעים require ל-error handler בכל קונטרולר, ובכל catch במקום err.message קוראים ל-errorHandler.getError(err).
5. בדיקה: ב-development מוצגת ההודעה המפורטת למפתח, וב-production רק ההודעה הכללית.
שימו לב
בכל הודעה שמוצגת למשתמש כדאי לבדוק אם היא חושפת מידע. דוגמה אחרת: בלוגין, הודעה כמו "incorrect username" ואחריה "incorrect password" מאפשרת לברר אם משתמש קיים. לכן נהוג להציג הודעה אחת, incorrect user name or password.
אפשר עכשיו להפריד בין הודעות מפורטות למפתחים להודעות כלליות ללקוחות באתר אמיתי.
השיעור הבא בקורס: Preventing Password Response

פרקי ההרצאה: Improper Error Handling

  1. 00:00

    דיווח לא מאובטח על שגיאות

  2. 00:42

    הדמיית קריסה בשינוי שם טבלה

  3. 01:22

    מידע שנחשף בהודעת השגיאה

  4. 02:17

    הודעת foreign key בזמן מחיקה

  5. 03:26

    הודעות שונות ב-development וב-production

  6. 04:38

    קבצי config לפיתוח ולפרודקשן

  7. 05:37

    המשתנה isProduction

  8. 06:20

    תיקיית helpers וקובץ errorsHandler

תמלול ההרצאה: Improper Error Handling

הטקסט המלא של הדקות הראשונות בהרצאה «Improper Error Handling» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:04

    הבעיה הראשונה שאנחנו הולכים לתקוף נקראת בז'רגון המקצועי של security improper error handling. זה בעצם מצב שבו המערכת מדווחת ללקוח באופן לא נכון ולא secured הודעות שגיאה.

  2. 00:23

    אבל כרגע המערכת לא מדווחת שום הודעות שגיאה, לפחות כמו שראינו. אנחנו רוצים לדמות כאילו יש פה איזושהי בעיה בשביל לראות מה זה אומר שהמערכת מדווחת הודעות בצורה לא טובה.

  3. 00:39

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

  4. 01:05

    אנחנו רואים שפורום שונה לפורום 2. אני נמצא ב-Home, אני הולך לפורום, וכמובן הוא לא יכול לתת לי את השירות, אז הוא נותן לי הודעת שגיאה.

  5. 01:14

    אז זה נראה כאילו, מה הבעיה? הנה, הוא נותן לי הודעת שגיאה. אבל זה לא אוקיי. קודם כל, ההודעה הזאת היא בכלל לא אינטואיטיבית כלפי הלקוח.

  6. 01:22

    הלקוח לא אמור לראות הודעות שגיאה של מערכת. בואו נראה מה כתוב פה. Error no such table. Table northwind. Forum doesn't exist.

  7. 01:35

    עכשיו, זה לא אני כתבתי את ההודעה הזאת, או לא המתכנת כתב אותה, זו הודעה אוטומטית שנשלחת על ידי המערכת. מה האקר יכול לדעת?

  8. 01:43

    קודם כל, שיש לנו דאטאבייס שנקרא Northwind, ב. שיש לנו טבלה שנקראת פורום. כל מיני נתונים שאנחנו ממש לא רוצים להעביר אותם לאף אחד. עכשיו, ברור שההאקר לא ילך לפורום וישנה את השם של הטבלה ואז יראה את ההודעה הזאת, כי אם הוא ניגש לדאטאבייס הוא כבר רואה מה יש שם, אבל זה רק דוגמה

  9. 02:05

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

  10. 02:25

    אם אני הולך ומבצע איזושהי פעולה לא חוקית מבחינת הדאטאבייס, נניח אני הולך ל-CHI ומוחק אותו, אני מנסה למחוק אותו, כל ההודעות האלה שאתם רואים כרגע שהמערכת נותנת לנו, מה SQL מראה לנו, אלה הודעות שכאמור by default אנחנו זורקים ללקוח,

  11. 02:44

    אם אנחנו לא מטפלים בזה כמו שצריך. בואו נראה מה ההודעה הזאת אומרת, cannot delete or update a parent or a foreign key constraint fails. הנה הוא חשף לנו את השם של הדאטאבייס, הנה הוא חשף לנו שם של טבלה א', חשף לנו שיש relationship, הנה הוא חשף שם של עמודה.

  12. 03:01

    אוקיי, הנה עוד שם של טבלה, אנחנו רואים שההודעות האלה, הודעות החריגה, אסור להן להגיע ללקוח הסופי. יכול להיות שהאקר יבוא וינסה לבצע כל מיני פעולות אסורות, אולי האתר מאפשר לו למחוק איזה משהו, אז הוא ינסה למחוק משהו אסור, בום, מקבל הודעות קריסה.

  13. 03:18

    אנחנו לא רוצים שההודעות האלה יגיעו ללקוח. אז מה אנחנו עושים? אז קודם כל אנחנו צריכים להבין שאם אנחנו נמצאים בשלב של הפיתוח, מה שנקרא development, אנחנו כן רוצים לראות את ההודעות האלה, יש פה איזושהי קריסה, אני רוצה לטפל בה.

  14. 03:37

    אולי הקריסה הזאת היא באמת קריסה בקוד שלנו בתור מתכנתים, אבל אם אנחנו נמצאים במצב של פרודקשן, זאת אומרת שהאתר הוא באוויר, אנחנו לא רוצים להציג את ההודעות האלה.

  15. 03:48

    למה ההודעות האלה נשלחו? בואו נסתכל על הקונטרולרים שתמיד בנינו. כל הודעה כזאת, בואו נלך לפורום, אנחנו תפסנו את הקריסות בcatch, דיווחנו הודעת 500 שזה בסדר, אבל תמיד תמיד שלחנו err.message וזה הדבר הלא נכון.

  16. 04:10

    אנחנו צריכים לשלוח err.message רק אם אנחנו ב-development, בזמן הפיתוח. אם אנחנו בפרודקשן, המערכת הזאת נמצאת באתר אמיתי באוויר, אנחנו רוצים לשלוח הודעה כללית, שהיוזר יבין שיש איזושהי בעיה כרגע, אבל בלי לחשוף לו שום מידע.

  17. 04:30

    כאשר אנחנו למדנו על קבצי קונפיגואציה ראינו בדיוק ויש איזשהו סוג של פתרון כזה שאומר, יש שני קבצים שאנחנו יכולים להגדיר, אחד עבור Production, אחד עבור Development.

  18. 04:43

    אז בואו ניקח את ה-Config, ונגיד שה-Config הזה הוא עבור Development, ונשכפל אותו, ונגיד שה-Config הבא הוא עבור Production, dev ו-prod.

  19. 04:59

    כרגע אין ביניהם שום הבדל. דבר נוסף, אנחנו צריכים לגשת ל-app, ולשנות את זה. יש לנו פה כרגע config/development, נשכפל ל-prod, אבל נשים את ה-prod בהערה כרגע.

  20. 05:17

    ואז כל מה שאנחנו צריכים לעשות כשאנחנו מעלים את האתר לאוויר זה להחליף בין החבר'ה האלה, ויש לנו בעצם אפשרות להחליט איזה קבצים כרגע פעילים.

  21. 05:30

    אז מה שאנחנו רוצים לעשות זה להגיע לקובץ, בעצם לשני הקבצים, נתחיל עם הדיבלופמנט ובדיבלופמנט אנחנו רוצים להגדיר שיש לנו פה משתנה שנקרא is production.

  22. 05:48

    אנחנו נמצאים בדיבלופמנט אז הרקור הוא false ונשכפל אותו לפרודקשן ובפרודקשן נגיד true. כמובן הם חייבים להיות בצורה כזאת. אז דבר ראשון אנחנו רואים שבדיבלופמנט ובפרודקשן יש איזשהו משתנה שאומר האם אנחנו בשלב של דיבלופמנט או בפרודקשן.

  23. 06:10

    ואנחנו יכולים עכשיו להשתמש במשתנה הזה בכדי לדעת באיזה מוד אנחנו, איך אנחנו משתמשים בזה. בואו ניגש ונבנה תיקייה helpers שתעזור לנו, יש פה כל מיני עזרים שאנחנו הולכים להשתמש בהם.

  24. 06:28

    בתוך helpers נוסיף קובץ, נקרא לו errorsHandler.js ונבנה פה פונקציה,

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: הכרות עם האתר הפרוץ שלנו - Insecure Website Review

ההרצאה הבאה: Preventing Password Response

הרצאות קשורות מקורסים אחרים

  • Error Handling - טיפול בשגיאות
  • Exception Handling
  • Reactive Forms - Error Messages
  • טיפול בשגיאות - Exception Handling

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React