עלה בעבודה על PR #3502 (העלאת תוכן ארוך ל-CodeKeeper בלי לעבור דרך המודל). מחוץ לתחום שלו, ולכן לא תוקן שם.
הבעיה במשפט אחד
כשהתצורה נכשלת בזמן import — למשל כש-BOT_TOKEN חסר — config.py זורק ValueError(str(exc)), וה-str() של ValidationError ב-pydantic כולל את input_value: הייצוג של המילון שנאסף מהסביבה, מקוצר אבל עם תחילתו וסופו. כלומר קטעים מערכים של משתני סביבה אחרים — טוקנים, כתובת מונגו עם סיסמה — נכנסים להודעת החריגה, ומשם ל-traceback בלוג של השירות.
מה נבדק (main, 928addc)
config.py#L689-L693: config = load_config() בתוך try, ו-raise ValueError(str(exc)) from exc.
config.py#L485-L490: ה-model_config של BotConfig, בלי hide_input_in_errors.
- שחזור (30.09, pydantic 2.12.3, pydantic-settings 2.11.0): מחלקת
BaseSettings עם שדה חובה חסר, וסוד מזויף במשתנה סביבה אחר. str(exc) הכיל את הסוד המזויף. אותה מחלקה עם hide_input_in_errors=True ב-model_config לא הכילה אותו, וגם לא את input_value.
- ובסביבה אמיתית:
import mcp_server.app בלי BOT_TOKEN ו-MONGODB_URL הדפיס בשגיאה קטע מטוקן שהיה בסביבה.
hide_input_in_errors מתועד ב-pydantic/config.py של הגרסה המותקנת: "You can hide the input value and type by setting the hide_input_in_errors config to True".
מה זה עושה בפועל
קריסת עלייה בגלל משתנה חסר או שגוי — בדיוק הרגע שבו מישהו פותח את הלוגים — מעתיקה לתוכם קטעים של סודות. זה secret-in-derived-text (K13) ב-amir-bug-patterns: הסוד לא נרשם ישירות, הוא נגזר לתוך טקסט של חריגה.
כיוון לתיקון (לא החלטה — לדיון)
hide_input_in_errors=True ב-SettingsConfigDict של BotConfig. זה השורש: הדליפה נוצרת בעיבוד השגיאה של pydantic, וההגדרה מסירה את הקלט מכל שגיאת ולידציה של המחלקה, לא רק בעלייה. BotConfig היא מחלקת ה-BaseSettings היחידה בקוד (scripts/audit_config_definitions.py רק קורא את שמות השדות).
- ה-
ValueError נשאר (לפי ההערה בקוד, יש טסט שמצפה לו בזמן import); אחרי סעיף 1 הטקסט שלו כבר לא נושא קלט.
- טסט בתת-תהליך (
-B): שדה חובה חסר וסוד-דגל במשתנה אחר, והודעת השגיאה אינה מכילה את הדגל. הטסט צריך ליפול על הקוד הנוכחי.
עלה בעבודה על PR #3502 (העלאת תוכן ארוך ל-CodeKeeper בלי לעבור דרך המודל). מחוץ לתחום שלו, ולכן לא תוקן שם.
הבעיה במשפט אחד
כשהתצורה נכשלת בזמן import — למשל כש-
BOT_TOKENחסר —config.pyזורקValueError(str(exc)), וה-str()שלValidationErrorב-pydantic כולל אתinput_value: הייצוג של המילון שנאסף מהסביבה, מקוצר אבל עם תחילתו וסופו. כלומר קטעים מערכים של משתני סביבה אחרים — טוקנים, כתובת מונגו עם סיסמה — נכנסים להודעת החריגה, ומשם ל-traceback בלוג של השירות.מה נבדק (main,
928addc)config.py#L689-L693:config = load_config()בתוךtry, ו-raise ValueError(str(exc)) from exc.config.py#L485-L490: ה-model_configשלBotConfig, בליhide_input_in_errors.BaseSettingsעם שדה חובה חסר, וסוד מזויף במשתנה סביבה אחר.str(exc)הכיל את הסוד המזויף. אותה מחלקה עםhide_input_in_errors=Trueב-model_configלא הכילה אותו, וגם לא אתinput_value.import mcp_server.appבליBOT_TOKENו-MONGODB_URLהדפיס בשגיאה קטע מטוקן שהיה בסביבה.hide_input_in_errorsמתועד ב-pydantic/config.pyשל הגרסה המותקנת: "You can hide the input value and type by setting thehide_input_in_errorsconfig toTrue".מה זה עושה בפועל
קריסת עלייה בגלל משתנה חסר או שגוי — בדיוק הרגע שבו מישהו פותח את הלוגים — מעתיקה לתוכם קטעים של סודות. זה
secret-in-derived-text(K13) ב-amir-bug-patterns: הסוד לא נרשם ישירות, הוא נגזר לתוך טקסט של חריגה.כיוון לתיקון (לא החלטה — לדיון)
hide_input_in_errors=Trueב-SettingsConfigDictשלBotConfig. זה השורש: הדליפה נוצרת בעיבוד השגיאה של pydantic, וההגדרה מסירה את הקלט מכל שגיאת ולידציה של המחלקה, לא רק בעלייה.BotConfigהיא מחלקת ה-BaseSettingsהיחידה בקוד (scripts/audit_config_definitions.pyרק קורא את שמות השדות).ValueErrorנשאר (לפי ההערה בקוד, יש טסט שמצפה לו בזמן import); אחרי סעיף 1 הטקסט שלו כבר לא נושא קלט.-B): שדה חובה חסר וסוד-דגל במשתנה אחר, והודעת השגיאה אינה מכילה את הדגל. הטסט צריך ליפול על הקוד הנוכחי.