Config ומשתני סביבה
הגדרות ומשתני סביבה
מסר השיעור
תוכלו להחליט היכן לשמור כל הגדרה ולתאר כיצד התהליך צריך לקבל ולפרש אותה.
תרחיש פתיחה
מצב ההדגמה אמור להיות כבוי, אך התהליך קורא את המילה false ומקבל דווקא מצב נכון. כדי לאתר את הפער, צריך לברר גם מה התכוונו למסור וגם מה עושה פעולת הקריאה. שם ברור ומילה מוכרת עדיין אינם הוראות פירוש לקוד.
DEMO_MODE מכיל את הטקסט false. נניח שמעבירים אותו ישירות להמרה לוגית בפייתון. איזה מצב יתקבל? כתבו את כלל ההמרה שעליו אתם מסתמכים.
איך תתפרש המחרוזת בהמרה הישירה?
עדיין לא. המרה ישירה של טקסט שאינו ריק נותנת מצב פעיל, ולא שגיאה.
נכון. הפעולה bool בפייתון עונה אם המחרוזת אינה ריקה. כדי שהמילה false תתפרש ככבוי צריך כלל נוסף, כמו המפרש בתרגיל. הערך וחוזה הקריאה שלו נבדקים יחד.
עדיין לא. הטקסט אומר false, אך ההמרה הישירה בודקת אם הוא ריק ולא את משמעות המילה.
תפקיד הערך
חזרה על השיעור הקודם
- זהו בכל סביבה את הקוד, תוצר הבנייה וההגדרות.
- מיינו את החשיפה לפי הנכנסים, הנתונים וההשפעות האפשריות.
נתחיל במה שהערך עושה: כותרת לתצוגה יכולה להישאר זהה, יעד שירות עשוי להשתנות בין תרגול לייצור, וערך סודי מעניק סמכות שצריך להגן עליה. אלה הגדרות, Config, שמאפשרות לשנות פרטים בלי לערוך בכל פעם את כלל המוצר. בקובץ ההגדרות כתוב false, אך bool בפייתון בודק אם המחרוזת ריקה. גם אחרי שהובן התפקיד, צריך לבדוק את דרך הקריאה. סיומת הקובץ לבדה אינה בוחרת מקום מתאים לערך.
חשיפה ופירוש
לכל הגדרה שאלו שתי שאלות נפרדות. מי רשאי לראות אותה? ואיך הקוד מפרש את הטקסט כמספר, כתובת או מצב? שאלה אחת עוסקת בחשיפה והשנייה בפירוש. ערך ציבורי יכול להגיע לכולם ובכל זאת לשנות התנהגות בגלל פירוש שגוי. ערך סודי יכול לעבור פירוש תקין ולהישלח למקום שאסור לו להגיע אליו. הצלחה באחד הצירים אינה פותרת את האחר.
בדיקה 1 מתוך 9
מפתח שירות נקרא בסוג הנכון. אחר כך הועתק ערכו לדוח אבחון שפתוח לאנשים שאינם מורשים לקבל אותו.
איזה חלק בחוזה ההגדרה הופר במקרה הזה?
עדיין לא. הקריאה נתנה את הסוג הנכון. הצלחת הפירוש אינה קובעת מי רשאי לקבל את הערך.
עדיין לא. המקרה אינו עוסק במגבלה מספרית. דוח האבחון נמסר לאנשים שאינם מורשים לקרוא את הסוד.
נכון. הצלחת הקריאה אומרת שהמערכת הבינה את הערך; היא אינה מתירה למסור אותו לכל קורא. בדוח האבחון נחשף הסוד לאנשים שמחוץ לגבול ההרשאה.
ערך קבוע וערך תלוי סביבה
הכותרת ציוד המרכז אמורה להופיע למשתמש. בתרחיש הזה היא ציבורית, ואם היא קבועה למוצר אפשר לשמור אותה בקוד. כתובת שירות התרגול היא מקרה אחר: היא משתנה לפי הסביבה. כשמספקים אותה בנפרד מקוד הכללים, קל יותר לזהות לאן כל הפעלה פונה. עם זאת, עדיין צריך לוודא שנמסר היעד הנכון. ציבוריות אינה אומרת שערך זהה בכל סביבה.
בדיקה 2 מתוך 9
שרת התרגול אמור לפנות לכתובת אחרת מהשרת האמיתי.
מה כדאי להפריד מקוד הכללים?
נכון. מסירת כתובת לפי סביבה מקלה על זיהוי היעד, ועדיין צריך לבדוק שנמסר הערך הנכון.
עדיין לא. קביעות הכותרת מאפשרת לשמור אותה בקוד; אינה הסיבה להפרדה בתרחיש.
עדיין לא. ההפרדה עוסקת בערך היעד, ולא בהחלפת הכלל שהמוצר מפעיל.
משתנה סביבה
אפשר להעביר לתהליך ערך בשם דרך משתנה סביבה, Environment variable. כך מפרידים את הקוד מערכים שמשתנים מפריסה לפריסה. המנגנון מספר איך ערך מגיע; הוא אינו מספר מי רשאי לראותו. בדקו איך הערך מגיע לתהליך ומי רשאי לראות אותו. בשיעור הבא נבחן גם אספקת סודות בדרך הזאת. כאן נשתמש רק במפת ערכים בזיכרון, בלי לקרוא את סביבת התהליך האמיתית.
בדיקה 3 מתוך 9
ערך נמסר לתהליך כמשתנה סביבה, Environment variable.
מה המונח מתאר?
עדיין לא. רשימת הנכנסים אינה נובעת משמו של מנגנון המסירה.
נכון. משתנה סביבה הוא מנגנון אספקה. הרשאות וחשיפה דורשות בירור נוסף.
עדיין לא. הדרך אינה מבטיחה הגנה מסוימת; צריך לבדוק מי רואה וכיצד הערך מגיע.
המרה למצב לוגי
בדרך הרגילה ספריית Python מציגה משתני סביבה כמחרוזות. בתרגיל נבנה חיקוי באמצעות טקסט מפורש במפה. המילה false מכילה תווים, ולכן bool מחזיר עבורה נכון. הפעולה בודקת אם קיים טקסט; היא אינה מתרגמת את משמעות המילה למצב כבוי. ההבדל בין שתי השאלות הוא מקור התוצאה המקומית המפתיעה.
מילים מותרות
כדי לקבל את המצב הרצוי, נוסף מפרש שמקבל רק true או false ומחזיר את הערך הלוגי, Boolean, המתאים. כל טקסט אחר צריך להיעצר כקלט שהמפרש אינו תומך בו. זהו חוזה שנבחר לתרגיל. במסגרת פיתוח אחרת עשויים לקבל גם 0, 1 או צורות כתיבה אחרות. לכן קוראים את התיעוד והבדיקות של הכלי שבו משתמשים, במקום להעתיק את החוזה כאילו הוא אוניברסלי.
בדיקה 4 מתוך 9
המפרש בתרגיל מקבל true ו־false, והתקבל בו הטקסט yes.
מה התגובה שהחוזה דורש?
נכון. החוזה המקומי תומך בשתי המילים שנבחרו. כל טקסט אחר אמור להיעצר.
עדיין לא. ייתכן שכלי אחר מקבל צורות נוספות, אך החוזה של התרגיל הוא שקובע כאן.
עדיין לא. המפרש המפורש אינו מסתפק בכך שיש תווים כדי להחזיר נכון.
טווח של מספר
גם 200, מגבלת אורך ההערה, נכנס כמחרוזת. תחילה הופכים אותו למספר שלם, ואז משווים לטווח שנבחר במוצר. ההמרה עונה על שאלת הסוג בלבד. למשל, מספר שלילי או מספר גדול מאוד יכול להיות מספר שלם תקין ועדיין מגבלה שגויה. חוזה שימושי צריך לומר מה הסוג, מה הטווח ומה משמעות הערך במוצר.
זמן הקריאה
בררו באיזה שלב קוראים את הערך. קריאה בזמן בנייה עשויה להכניס אותו לתוצר, ואז שינוי בהגדרות ההרצה עשוי להשאיר את התוצר כפי שהיה. בקריאה בזמן הרצה, Runtime, התוצאה תלויה באופן שבו התהליך טוען הגדרות. ייתכן שצריך להתחיל אותו מחדש או לבצע רענון מתועד. שינוי שורה בקובץ עדיין אינו תצפית שהשירות משתמש בערך החדש.
בדיקה 5 מתוך 9
החליפו ערך בקובץ, והתהליך הפעיל טרם נבדק.
מה צריך לברר כדי לדעת שהערך נקלט?
נכון. בזמן הרצה ייתכן שנדרשים התחלה מחדש או רענון מתועד. עצם החלפת שורה אינה ראיית קליטה.
עדיין לא. מיקום כותרת אחרת אינו מסביר את טעינת הערך בתהליך הפעיל.
עדיין לא. הסוג מתאר את הפירוש, ולא את הזמן שבו תהליך רץ מקבל עדכון.
ערך בדפדפן
מה שנשלח לדפדפן צריך להיחשב נגיש ללקוח. כתובת שירות ציבורית עשויה להתאים לכך, אך ערך שמעניק סמכות פרטית דורש גבול אחר. שם מוסווה או מסך שמסתיר אותו אינם מגינים על תוכן שכבר נמסר. סמנו מראש מה נשאר בשרת ומה מיועד לתצוגה. מפת התרגיל מכילה רק הפניה למקום שממנו יסופק הסוד, בלי הערך עצמו.
בדיקה 6 מתוך 9
ערך מעניק סמכות פרטית ונשלח בתוך קובץ שהדפדפן מקבל.
איזה גבול דורש תיקון?
עדיין לא. טווח הערה אינו מגביל מי יכול לקרוא תוכן שכבר נמסר לדפדפן.
נכון. ערך שמעניק סמכות דורש גבול אחר ממידע ציבורי. תוכן שנמסר לדפדפן אינו מוגן בהסתרת שם.
עדיין לא. אין כאן כשל בהמרת מספר; הערך הגיע למקום שאינו מתאים לסמכותו.
ערך חסר
כתבו מה יקרה אם הערך חסר. לשם תצוגה אפשר לעיתים לבחור ברירת מחדל מתאימה, אך ברירת מחדל שפונה לנתונים אמיתיים יוצרת סיכון אחר. בתוכנית הזאת, חוסר ביעד הנתונים עוצר את ההכנה לשחרור. הודעת הבירור מציגה את שם ההגדרה שחסרה, בלי לחשוף מידע רגיש. התגובה לחסר היא החלטה במפרט התפעולי, ולא ניחוש בזמן ההפעלה.
בדיקה 7 מתוך 9
ההכנה נעצרה בגלל הגדרה רגישה חסרה.
איזה מידע מתאים להודעת הבירור?
עדיין לא. ערך קודם מרחיב חשיפה ואינו נחוץ לזיהוי השדה החסר.
עדיין לא. הודעת החסר צריכה לזהות את ההגדרה, בלי להפיץ את תוכן הסמכות.
נכון. שם ההגדרה מאפשר לזהות את החסר בלי להציג ערכים רגישים.
חוזה ההגדרה
כעת הכינו לכל הגדרה שורה שאדם נוסף יוכל לבדוק: שם, סוג, ספק הערך וזמן הטעינה. הוסיפו סיווג ציבוריות ותגובה לחסר. לבסוף ציינו איזו בדיקה תראה שהשירות אכן משתמש בערך. כך מבחינים בין מסמך שבו הכול נראה נכון לבין תהליך שמקבל בפועל את ההגדרות שהתכוונו למסור.
קריאת הקלט והפלט
זהו קלט לצד פלט שהתקבלו ממפרש מקומי לתרגיל. example.invalid מציין כתובת מומצאת; תווית ההפניה לסוד אינה מכילה ערך.
לקריאה בלבד, אין להריץ
{
"input": {
"APP_LABEL": "ציוד המרכז",
"API_BASE_URL": "https://training.example.invalid",
"DEMO_MODE": "false",
"MAX_NOTE_LENGTH": "200",
"MESSAGE_CREDENTIAL_REFERENCE": "reference-only/no-value"
},
"result": {
"python": "3.12.14",
"origin": "מיפוי לתרגול, לא סביבת תהליך אמיתית",
"naive_bool": true,
"explicit_bool": false,
"max_note_length": 200,
"network_requests": 0,
"secret_values_read": 0
}
}השוו APP_LABEL ל־API_BASE_URL. הכותרת נועדה למשתמש, והכתובת מצביעה על יעד תרגול מומצא. שתיהן גלויות כאן, אך רק הכתובת מתוכננת להשתנות בין סביבות. אל תחברו אוטומטית בין חשיפה ציבורית לבין קביעות הערך.
מצאו את DEMO_MODE בקלט ואז את naive_bool ואת explicit_bool בפלט. ההמרה הפשוטה נתנה נכון; המפרש המפורש נתן כבוי. הקלט נשאר אותו טקסט. מה שהשתנה הוא הכלל שקורא אותו.
השדה max_note_length מראה הצלחה בהפיכת הטקסט למספר בקלט שנבדק. הוא אינו מציג בדיקה של טווח לפי מדיניות המוצר. למפרש של יישום צריך להוסיף גם את הבדיקה הזאת, כדי להפריד בין סוג מספרי תקין למגבלה רצויה.
בדיקה 8 מתוך 9
הפלט מציג max_note_length: 200, לאחר קריאת טקסט ממפת התרגול.
מה כבר ניתן להסיק מהשדה הזה?
עדיין לא. המרה מוצלחת אינה תיעוד מדיניות לטווח המותר.
עדיין לא. ההרצה השתמשה במפת תרגול בזיכרון, ולא בתהליך ייצור.
נכון. בקלט שנבדק התקבל מספר מתוך הטקסט שסופק. התוצאה מתעדת את פעולת ההמרה הזאת, בלי להראות שנאכף טווח הערכים של היישום.
בדקו לבסוף מה נשאר מחוץ להרצה: ההפניה אינה מספקת ערך לחיבור לשירות, והסקריפט קרא רק את מפת התרגול שלו. מספר בקשות הרשת הוא אפס, וגם מספר ערכי הסוד שנקראו הוא אפס. אלה גבולות ההרצה המקומית שמוצגת כאן.
בדיקה 9 מתוך 9
בפלט מופיעה תווית reference-only/no-value לצד אפס בקשות רשת.
מה התווית מספקת?
נכון. המפה קראה ערכים סינתטיים. התווית אינה סוד שמאפשר להתחבר, ולא נקראו ערכי סוד.
עדיין לא. הטקסט הוא שם הפניה בלבד, ואינו מכיל מפתח לפעולה.
עדיין לא. אפס בקשות הרשת ותווית ההפניה אינם ראיה לחיבור שבוצע.
קבצים לתרגול
הורידו עותק מקומי של הקובץ לפני העריכה.
שינוי כתובת בשרת
הדפדפן קיבל תוצר שבו כתובת השירות שולבה בבנייה. לאחר מכן החליפו כתובת בהגדרות השרת. איזו ראיה דרושה כדי לקבוע שגם הדפדפן פונה כעת לכתובת החדשה?
הצגת הסבר למקרה
בדקו מה נמצא בתוצר הדפדפן וכיצד הכלי משלב בו את הכתובת בבנייה. לפי הכלי, ייתכן שצריך לבנות ולפרוס תוצר חדש. שינוי בשרת אינו מראה שתוכן שכבר הגיע לדפדפן התעדכן.
בקשה לסוכן
באיזה סוג מגיע כל ערך, מתי התהליך קורא אותו ומי יכול לראות אותו?
דרשו טבלה של שמות, סוגים, מקורות, זמני טעינה וחשיפה, לצד בדיקות לחסר ולערכים שגויים. את ערכי הסודות משאירים מחוץ לדוח.
איתור פגם
זהו את החלק החסר בחוזה של כל ערך.
- הבחינו בין פירוש הערך, בחירת יעד והגבלת חשיפה.
- בחרו תיקון לחוזה ובדיקה של קלט חריג.
הכתיבה תיפתח אחרי קריאת המשוב לכל הפריטים.
כתבו תשובה כדי לפתוח את הבדיקה העצמית.
הצגת תשובה לדוגמה
MAX_NOTE_LENGTH מתקבל כמספר שלם בגבולות שהמוצר הגדיר, ונקרא כשהתהליך מתחיל. אם הערך חסר או חורג, עוצרים את ההכנה ומציגים לבירור את שם ההגדרה.
בדיקת ידע
בחרו תשובה אחת בכל שאלה. בשליחה תקבלו משוב על כל בחירה.
סיכום השיעור
- קבעו בנפרד מי יכול לראות ערך ואם הוא משתנה בין סביבות.
- בדקו כיצד ההגדרה מתפרשת, מה הטווח ומתי קוראים אותה.
- בחרו מראש תגובה לחסר לפני שהשירות מופעל.
- Config: הגדרות שמשנות פרטים באופן שבו היישום פועל.
- Environment variable: משתנה סביבה, ערך בעל שם שמועבר לתהליך בזמן ההפעלה.
- Runtime: השלב שבו היישום רץ.
- Boolean: ערך לוגי ששני מצביו הם נכון ולא נכון.
- חוזה הגדרה: מה שקובע אילו ערכים מותרים ומה התהליך עושה בכל אחד מהם.
בהמשך נעקוב אחר סוד: איך הוא מגיע לשרת ומוחלף בלי שערכו נשמר בקוד?
בדיקה עצמית לפני סיום
סמנו רק מה שבדקתם בתשובה או בתיק שלכם. הסימון נשאר בעמוד ואינו אישור לשחרור.