קריאת JSON: הפרידו תחביר, חוזה ואמון

בקצרה

מנתח ממיר טקסט JSON לערכים. הוא אינו מוכיח תקינות עסקית, אמינות שולח או הרשאה להשתמש בנתונים.

מפת רשתות עולמית בחדר תדרוך ריק
במאמר זה

קלט תקין יכול לשאת משמעות שונה

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

קלט להדגמהקריאה תחביריתבדיקה שנותרה
{"ok":true}תקין.האם הערך מתאים לחוזה?
{"ok":true,}לא תקין: פסיק מסיים.טפלו בשגיאה במפורש.
nullתקין.האם החוזה מאפשר null?
{"id":9007199254740993}מספר תקין עם סיכון דיוק ב־JavaScript.השתמשו במחרוזת עבור המזהה.
{"a":1,"a":2}שמות כפולים: פירוש שאינו נייד.הגדירו ואכפו מדיניות דחייה.

בדקו כל שלב קבלה

  • השתמשו במנתח JSON מתוחזק, לעולם לא ב־eval. בדקו סטטוס HTTP, סוג תוכן, מגבלות גודל וטיפול מפורש בגוף חסר או פגום.
  • אמתו אחר כך את החוזה: סוג שורש, שדות חובה, ערכים מותרים והבדל בין חסר, null ואפס. שמרו מזהים ארוכים כמחרוזות אם החוזה מגדיר זאת.
  • קבעו מגבלות עומק ומשאבים, מדיניות שמות כפולים וטיפול בשגיאות. אל תשלבו מחרוזות שהתקבלו ב־HTML או בשאילתות ללא הגנה מתאימה.

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

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

מקורות ראשוניים

רישום שגיאות API של JSON ללא דליפת מטענים.

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

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

מקור ראשוני: ACSC and partners — Event logging and threat detection. שיטה קשורה: קריאת המדריך המעשי.

מפתחות JSON ומטמון מותאמים אישית

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

  • בחירת שמירה: RFC 9111 מבדיל בין הנחיות: ללא מטמון דורש אימות לפני שימוש חוזר, ללא אחסון אוסר על אחסון HTTP רלוונטי, ופרטי לא מוסמך אינו כולל אחסון משותף. אף אחד מהם לבדו אינו מבטיח סודיות מערכת.
  • בדיקת מפתחות: בדיקת שיטה, URI ומימדים המשנים ייצוג. שינויים נוגעים לשדות בקשה; זה לא אישור. חיפוש שפה שהושמטה, משא ומתן פורמט והקשר חשבון בשכבות יישום.

מקור ראשוני: IETF — RFC 9111, HTTP Caching. שיטה קשורה: קריאת המדריך המעשי.

דפדוף API וייצוא עקבי

נתונים משתנים עלולים ליצור חוסרים או כפילויות בייצוא.

  • תעדו מסננים, מיון ומפתח הכרעה לערכים שווים. בדקו אם ה־API מספק תמונת מצב או אוסף משתנה. בדקו יצירה ומחיקה בזמן קריאה; סמן אינו מבטיח שהנתונים קפואים.
  • ב־AIP-158 ערך next_page_token ריק מסיים קריאה, ולא עמוד תוצאות קצר או ריק. בעמודים בדיוניים [A,B] ו־[B,C] יש ארבע שורות אך שלושה מזהים ייחודיים. זהו גם סמן חוזר בלי התקדמות ופעלו לפי הסכם ה־API בפועל.
  • שמרו את האצווה באופן עמיד לפני אישור ההמשך. חזרו על אצווה שנקטעה עם מזהים יציבים ובדקו הרשאות בכל בקשה; סמן אינו אישור גישה. אם תמונת מצב פגה, התחילו מחדש או התאימו לפי מדיניות מפורשת; אל תאחדו מצבים שונים בשקט.

מקרה קבלה שניתן לשחזר

דוגמה בדיונית: הנתונים אינם מתארים לקוח או תוצאה שנצפתה.

הצגת נתוני המקרה
{
    "page_1_ids": [
        "A",
        "B"
    ],
    "page_2_ids": [
        "B",
        "C"
    ],
    "next_cursor": "c2",
    "empty_page_has_next_cursor": true
}

החלטה צפויה

B חוזר. בדקו מזהים והמשיכו עם הסמן הבא גם אחרי עמוד ריק.

נוהל בדיקה

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

Google AIP-158 — Pagination

האם מספר השורות הצפוי מוכיח שהייצוא שלם?

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

מקור ראשוני: Google AIP-158 — Pagination. שיטה קשורה: קריאת המדריך המעשי.