הגדרות XML (.xml)
W3C תקןשפת הסימון הניתנת להרחבה (XML) היא שפת סימון רב-תכליתית המגדירה סט של חוקים לקידוד מסמכים בפורמט הקריא גם לבני אדם וגם למכונות.
כיווץ XML אונליין
פרטי - הקבצים לעולם אינם עוזבים את המכשיר שלך
בדיקה ומטא-נתונים
מערכות הפעלה ומנתחי קבצים מזהים קבצי XML על ידי בדיקת רצף הבייטים הבינארי הראשוני:
חתימת כותרת ברמת הבייט (Magic Bytes)
מערכות הפעלה ומנתחי קבצים מזהים קבצי XML על ידי בדיקת רצף הבייטים הבינארי הראשוני:
חתימת HEX (היסט 0):
3C 3F 78 6Dייצוג ASCII: <?xm
תקינה: W3C Recommendation (XML 1.0 Fifth Edition)
מפרט טכני
| מבנה המכולה | שפת סימון טקסטואלית היררכית עם תגיות סמנטיות ומאפיינים מותאמים אישית |
| דחיסה | דחיסת Gzip ו-Deflate יכולה להקטין את הגודל ב-85%-92% כשיש תגיות סגירה מפורטות |
| סדר בתים (Endianness) | זרם תווים UTF-8 / UTF-16 המוגדר על ידי מאפיין הקידוד בהצהרת ה-XML |
| מרחבי צבע | לא ישים |
| ערוצים ומבנה | אלמנטים (<tag>), מאפיינים (attr="val"), בלוקי CDATA, הוראות עיבוד |
| ממדים מרביים | מבנה עץ היררכי ללא הגבלת גודל |
| שקיפות | לא ישים |
| הזרמה ופרוגרסיביות | מנתחי SAX (Simple API for XML) ו-StAX מאפשרים קריאת זרמים חסכונית בזיכרון |
מטריצת השוואה טכנית: XML מול מתחרים
| תכונה טכנית | XML (נוכחי) | JSON | YAML | Protocol Buffers |
|---|---|---|---|---|
| מלל (Verbosity) | גבוה (תגיות סגירה ותחביר מאפיינים) | נמוך (פורמט מפתח-ערך קומפקטי) | נמוך (מבוסס הזחות) | נמוך במיוחד (סריאליזציה בינארית) |
| אימות סכמה | תקני XSD ו-DTD בוגרים עם אכיפת מהדר | JSON Schema (אופציונלי) | JSON Schema / סכמות Yaml | הגדרות סכמה נוקשות מסוג .proto |
| מרחבי שמות | תמיכה במרחבי שמות מובנים ב-XML (xmlns) | אין מנגנון מרחב שמות מובנה | אין מנגנון מרחב שמות מובנה | הצהרות חבילה |
| טרנספורמציות | צינורות עיבוד דקלרטיביים מסוג XSLT | קוד מותאם אישית / סקריפטים של jq | קוד מותאם אישית | קוד מותאם אישית |
מצבי השחתה נפוצים ומדריך שחזור הקסדצימלי (Hex)
שגיאת ניתוח XML: תג לא תואם או ישות לא מוגדרת.
גורם שורש: תווים שמורים שלא עברו escape (כמו '&', '<', או '>') או חוסר התאמה באותיות רישיות וקטנות בין תגיות פתיחה לסגירה.
שחזור: החלף '&' ב-'&', '<' ב-'<', '>' ב-'>', או עטוף טקסט שרירותי בתוך בלוקים מסוג '<![CDATA[ ... ]]>'.
ניתוח אבטחה ווקטורי תקיפה נגד מנתחי פורמטים (parsers)
מנתחי XML היו לאורך ההיסטוריה בין הרכיבים המותקפים ביותר במחשוב ארגוני, בשל יכולות ה-DTD והרחבת הישויות שלהם.
ווקטורי תקיפה ידועים
- ישות חיצונית ב-XML (XXE): DOCTYPE זדוני המפנה לקובצי שרת מקומיים ('file:///etc/passwd') או לנקודות קצה פנימיות ברשת.
- מתקפת Billion Laughs (פצצת XML): הצהרות ישויות מקוננות המתרחבות באופן מעריכי בזיכרון כדי לגרום למניעת שירות.
- הזרקת XPath: קלטי משתמש שלא עברו ניקוי ומאפשרים שאילתות בלתי מורשות על מסדי נתונים של XML.
שיטות מומלצות להגנה: נטרל תמיד פתרון DTD חיצוני ועיבוד ישויות חיצוניות (הגדר את המאפיין 'disallow-doctype-decl' כ-true) במנתחי XML.
היסטוריה ואבני דרך
יתרונות מרכזיים
- אימות סכמה קפדני באמצעות XSD (XML Schema Definition) או DTD מבטיח שלמות נתונים נוקשה.
- מרחבי שמות (xmlns) מונעים התנגשויות בשמות אלמנטים במסמכים מורכבים מרובי מקורות.
- כלי שאילתה וטרנספורמציה עוצמתיים (XPath, XSLT, XQuery).
מגבלות טכניות וחסרונות
- ארוכה ומפורטת מאוד: תגיות סגירה חוזרות על שמות אלמנטים, מה שיוצר קבצים גדולים וצריכת רוחב פס גבוהה.
- ניתוח DOM מייצר עצי אובייקטים גדולים וזוללי זיכרון.
- פגיע לפגיעויות אבטחה מסוג ישויות חיצוניות ב-XML (XXE) והרחבת ישויות.
עובדות טכניות מעניינות
- XML הוא תת-קבוצה פשוטה של SGML (Standard Generalized Markup Language), שתוכננה לפעול בצורה חלקה ברשת האינטרנט העולמית.
- מסמכי אופיס מודרניים (.docx, .xlsx), תמונות וקטוריות (.svg), וערוצי RSS הם כולם ניבים מיוחדים של XML.
- מתקפת מניעת השירות הקלאסית 'Billion Laughs' משתמשת בקילו-בייט אחד בלבד של ישויות XML מקוננות (lol1 המתייחס לעשרה lol0s, עד ל-lol9), שמתרחבות באופן מעריכי ל-3 ג'יגה-בייט של זיכרון בעת הניתוח.
שאלות טכניות נפוצות
מה ההבדל בין XML בנוי היטב לבין XML תקף?
XML "בנוי היטב" מציית לכללי התחביר הבסיסיים (תגיות תואמות, מרכאות סביב מאפיינים ואלמנט שורש יחיד). XML "תקף" הוא בנוי היטב וגם תואם בקפדנות לסכימה חיצונית (XSD או DTD).
מדוע JSON החליף את XML עבור רוב ממשקי ה-API ברשת?
JSON ממפה ישירות למבני נתונים מקוריים ב-JavaScript ובשפות תכנות אחרות (מפות גיבוב ומערכים), ודורש פחות קוד תשתית (boilerplate), מאפשר פענוח מהיר יותר ומייצר מטעני נתונים קטנים יותר ברשת.
מהי פגיעות ישות חיצונית ב-XML (XXE)?
פגיעות XXE מתרחשת כאשר מנתחי XML מעבדים מסמך לא מהימן עם הגדרת סוג מסמך חיצוני (DTD) מופעלת. תוקפים יכולים להגדיר ישויות המצביעות על קבצי שרת מקומיים (כגון קובצי הגדרות מערכת) או כתובות URL פנימיות ברשת, מה שגורם לשרת לקרוא ולחשוף נתונים סודיים.