docs(patterns): K14 — סוד בשורת שאילתה ש-SDK הניטור מתעד בעצמו
דפוס חדש מ-CodeBot PR #3270 — מפתח Gemini הופיע במלואו ב-Sentry.
למה זה לא K13
ב-K13 הקוד שלך מרכיב את המחרוזת ושולח אותה ל-sink, וכלל הזיהוי הוא source-to-sink בקוד שלך. כאן אין sink בקוד שלך לעקוב אליו: הקוד העביר params={"key": ...} — צורה שמופיעה בתיעוד של ספקים רבים — ואינטגרציית ה-HTTP של sentry-sdk קראה את הכתובת ורשמה אותה בעצמה.
שתי תכונות מחריפות את זה:
- האינטגרציה נמצאת ב-
_AUTO_ENABLING_INTEGRATIONSונדלקת לבד כשהספרייה מותקנת. היעדרה מ-integrations=[...]שב-initאינו ראיה שהיא כבויה — וזה בדיוק מה שמכשיל סקירה. - הרישום קורה בכל בקשה מוצלחת, לא רק בכשל.
הראיה, מהרצה על URL בצורה הזו:
sanitize=False → key=AIza... (מה שהאינטגרציה עושה)
sanitize=True → key=[Filtered] (המנקה המובנה שקיים ולא נקרא)
והחצי השני: "המצב המומלץ" של K13 היה מיושם — ובכל זאת נכשל
בפרויקט הייתה נקודת ניקוי מרכזית מתועדת ככזו בקוד, hook על before_send_transaction עם הערה שמסבירה שה-spans נושאים כתובות מלאות, ומעבר עמוק על מבנה האירוע שנכשל-סגור ומטפל במעגלים, ב-bytes וב-repr של אובייקטים זרים. עבודה טובה.
הפגם היחיד: רשימת הדפוסים הייתה בגודל אחד. מי שכתב את זה הבין את הערוץ במדויק וסגר אותו לספק אחד; הספק השני עבר דרכו בלי לגעת בדפנות. K13 אינו דורש שהרשימה תהיה חסינת-ספק, ולכן זה החצי השני של K14: רשימת דפוסי-צורה היא רשימה שחורה שמתעדכנת רק אחרי דליפה.
תיקון לכלל קיים
bugbot-rules/secret-in-derived-text.md העניק ב-false-positives פטור להרכבת URL מקומית, על סמך ההנחה שהסיכון הוא חריגות בלבד — "ספריית ה-HTTP לא מדליפה את ה-URL בחריגות שלה". ההנחה שגויה, והכלל הקיים היה אומר לריוויוור שהמקרה הזה הוא false positive. הפטור צומצם, עם הפניה לכלל החדש.
מה נוסף
| קובץ | מה |
|---|---|
docs/source-projects/codebot-patterns.md | Pattern 8 — מסמך המקור |
CRITICAL-PATTERNS.md | K14 |
bugbot-rules/secret-in-url-query.md | כלל חדש |
claude-md-snippets/critical.md | כלל 13 |
INTEGRATION.md | שורת טריגר + שורה בבלוק "תמיד, בכל פרויקט" |
bugbot-rules/secret-in-derived-text.md | תיקון — צמצום ה-false-positive |
שורת הטריגר המקבילה נוספה גם ל-CLAUDE.md של CodeBot, באותו PR של התיקון — לפי הכלל ש"דפוס בלי שורת טריגר = דפוס שלא ייקרא".
שתי נקודות מהאירוע ששוות תשומת לב
כלל לפי-שם חייב לטפל בשם כמקטע. הניסוח הראשון דרש התאמה מדויקת מהמפריד, ולכן auth_token, oauth_token, id_token, private_key, x-api-key ו-session_token כולם דלפו — שמות סטנדרטיים לגמרי. ריוויוור תפס את זה. התיקון הנכון אינו הוספתם לרשימה (זו אותה רשימה שחורה בגלגול נוסף) אלא תחילית-מקטע.
ההרצה תפסה מה שקריאת הקוד לא. הדפוס עוגן תחילה ל-?/&, ואימות מול מבנה ה-span האמיתי הראה שהוא מפספס בדיוק את השדה שדלף: http.query הוא מחרוזת עירומה, בלי ? מוביל. זה נכנס ככלל זיהוי מספר 4.
🤖 Generated with Claude Code
https://claude.ai/code/session_01GrAPatY7VmTTVxUJjxHBKi
Generated by Claude Code