הסרת XSLT כדי ליצור דפדפן מאובטח יותר

Mason Freed
Mason Freed
Dominik Röttsches
Dominik Röttsches

תאריך פרסום: 29 באוקטובר 2025

‫Chrome מתכוון להוציא משימוש את XSLT ולהסיר אותה מהדפדפן. במסמך הזה מוסבר איך אפשר להעביר את הקוד לפני ההסרה בסוף שנת 2026.

‫Chromium הוציא משימוש באופן רשמי את XSLT, כולל XSLTProcessor JavaScript API והוראת העיבוד של גיליון סגנונות XML. אנחנו מתכוונים להסיר את התמיכה מגרסה 155 (17 בנובמבר 2026). גם בפרויקטים של Firefox ו-WebKit ציינו תוכניות להסרת XSLT ממנועי הדפדפנים שלהם. במאמר הזה אנחנו מספקים היסטוריה והקשר, מסבירים איך אנחנו מסירים את XSLT כדי להפוך את Chrome לבטוח יותר, ומציעים דרך להעברה לפני שהתכונות האלה יוסרו מהדפדפן. כדאי לעיין גם בערך סטטוס הפלטפורמה של Chrome כדי לקבל את העדכונים האחרונים.

מה יוסר?

יש שני ממשקי API בדפדפן שמטמיעים XSLT, ושניהם יוסרו:

ציר זמן ב-Chrome

‫Chrome מציע את התוכנית הבאה:

  • ‫Chrome 142 (28 באוקטובר 2025): נוספו ל-Chrome הודעות קונסולה עם אזהרה מוקדמת.
  • ‫Chrome 143 (2 בדצמבר 2025): הוצאה רשמית משימוש של ה-API – הודעות אזהרה על הוצאה משימוש יתחילו להופיע במסוף וב-Lighthouse.
  • ‫Chrome 148 (גרסת Canary מ-10 במרץ 2026): גרסאות Canary,‏ Dev ו-Beta מתחילות להשבית את XSLT כברירת מחדל, כאזהרה מוקדמת.
  • ‫Chrome 152 (25 באוגוסט 2026): גרסת המקור לניסיון (OT) ומדיניות Enterprise (EP) עוברות לשלב הבדיקה. הם מאפשרים לאתרים ולחברות להמשיך להשתמש בתכונות אחרי תאריך ההסרה.
  • ‫Chrome 155 (17 בנובמבר 2026): ‏ XSLT מפסיק לפעול בגרסאות יציבות, עבור כל המשתמשים מלבד משתתפים בניסוי מקור ובמדיניות ארגונית.**
  • ‫Chrome 164 (17 באוגוסט 2027): גרסת המקור לניסיון ומדיניות Enterprise יפסיקו לפעול. ‫XSLT מושבת לכל המשתמשים.**

מה זה XSLT?

‫XSLT, או Extensible Stylesheet Language Transformations (שפת גיליונות סגנון ניתנים להרחבה), היא שפה שמשמשת להמרת מסמכי XML, בדרך כלל לפורמטים אחרים כמו HTML. הוא משתמש בקובץ גיליון סגנונות XSLT כדי להגדיר את הכללים להמרה הזו, ובקובץ XML שמכיל את הנתונים שמשמשים כקלט.

בדפדפנים, כשמתקבל קובץ XML שמקושר לגיליון סגנונות XSLT, הדפדפן משתמש בכללים בגיליון הסגנונות הזה כדי לסדר מחדש, לעצב ולהמיר את נתוני ה-XML הגולמיים לדף מובנה (לרוב HTML) שאפשר לעבד עבור המשתמש.

לדוגמה, גיליון סגנונות XSLT יכול לקבל את קלט ה-XML הבא:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="demo.xsl" ?>
<page>
 <message>
  Hello World.
 </message>
</page>

וגיליון הסגנונות הבא של XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/page/message">
    <body>
      <p>Message: <xsl:value-of select="."/></p>
    </body>
  </xsl:template>
</xsl:stylesheet>

ולעבד אותם לקוד ה-HTML הזה כדי שהדפדפן יציג אותם: HTML

<body>
  <p>Message: Hello World.</p>
</body>

בנוסף להוראת העיבוד של XSL שמוצגת בדוגמה הקודמת, יש גם את XSLTProcessor JavaScript API שאפשר להשתמש בו כדי לעבד מסמכי XML מקומיים עם גיליונות סגנונות מקומיים של XSLT.

היסטוריה של XSLT

‫XSLT הומלצה על ידי World Wide Web Consortium ‏ (W3C) ב-16 בנובמבר 1999 כשפה להמרת מסמכי XML לפורמטים אחרים, בדרך כלל HTML לתצוגה בדפדפני אינטרנט. לפני ההמלצה הרשמית 1.0, מיקרוסופט יזמה מוקדם יותר הטמעה קניינית שמבוססת על טיוטה של W3C ב-Internet Explorer 5.0, שפורסמה במרץ 1999. בהתאם לתקן הרשמי, מוזילה הטמיעה תמיכה מקורית ב-XSLT 1.0 ב-Netscape 6 בסוף שנת 2000. גם בדפדפנים נפוצים אחרים, כולל Safari,‏ Opera וגרסאות מאוחרות יותר של Chrome, שולבו מעבדי XSLT 1.0 מקוריים, מה שהפך את ההמרות של XML ל-HTML בצד הלקוח לטכנולוגיית אינטרנט שימושית בתחילת שנות ה-2000.

שפת XSLT המשיכה להתפתח, ובשנת 2007 פורסמה גרסה XSLT 2.0 ובשנת 2017 פורסמה גרסה XSLT 3.0. בגרסאות האלה נוספו תכונות מתקדמות כמו ביטויים רגולריים, שיפור של סוגי הנתונים והיכולת לעבד JSON. עם זאת, התמיכה בדפדפנים לא התקדמה. נכון להיום, כל המנועים העיקריים של דפדפני האינטרנט מספקים תמיכה מובנית רק ב-XSLT 1.0 המקורי משנת 1999. הקיפאון הזה, יחד עם העלייה בשימוש ב-JSON כפורמט העברה, ובספריות ובמסגרות של JavaScript (כמו jQuery,‏ React ו-Vue.js) שמציעות גמישות רבה יותר ועוצמה רבה יותר במניפולציה של DOM ובתבניות, הובילו לירידה משמעותית בשימוש ב-XSLT בצד הלקוח. התפקיד שלו בדפדפן האינטרנט הוחלף במידה רבה בטכנולוגיות האלה שמבוססות על JavaScript.

למה צריך להסיר את XSLT?

המשך השימוש ב-XSLT 1.0 בדפדפני אינטרנט יוצר סיכון אבטחה משמעותי ומיותר. הספריות הבסיסיות שמבצעות את ההמרות האלה, כמו libxslt (שמשמשת בדפדפני Chromium), הן בסיסי קוד מורכבים של C/C++‎ שהם ישנים יחסית. סוג הקוד הזה ידוע כרגיש לפרצות אבטחה שקשורות לבטיחות הזיכרון, כמו גלישת חוצץ, שעלולות להוביל להרצת קוד שרירותי. לדוגמה, בביקורות אבטחה ובכלי מעקב אחרי באגים זוהו שוב ושוב נקודות חולשה ברמת חומרה גבוהה במנתחי הנתונים האלה (למשל, ‫CVE-2025-7425 ו-CVE-2022-22834, שתיהן ב-libxslt). מכיוון ש-XSLT בצד הלקוח הוא עכשיו תכונה נישתית שמשתמשים בה לעיתים רחוקות, הספריות האלה מקבלות הרבה פחות תחזוקה ובדיקות אבטחה מאשר מנועי JavaScript מרכזיים, אבל הן מייצגות משטח תקיפה ישיר ופוטנציאלי לעיבוד תוכן אינטרנט לא מהימן. למעשה, XSLT הוא המקור לכמה ניצול נקודות חולשה באבטחה שזכו לפרסום רב לאחרונה, וממשיכים לסכן את המשתמשים בדפדפנים. סיכוני האבטחה שקשורים לתחזוקה של הפונקציונליות המיושנת והלא יציבה הזו גדולים בהרבה מהתועלת המוגבלת שלה כיום.

בנוסף, המטרה המקורית של XSLT בצד הלקוח – המרת נתונים ל-HTML שניתן לעיבוד – הוחלפה בממשקי API של JavaScript שהם בטוחים יותר, נוחים יותר לתפעול ומתוחזקים טוב יותר. פיתוח אתרים מודרני מסתמך על דברים כמו Fetch API לאחזור נתונים (בדרך כלל JSON) ו-DOMParser API לניתוח בטוח של מחרוזות XML או HTML למבנה DOM בארגז חול מאובטח של JavaScript בדפדפן. מסגרות כמו React,‏ Vue ו-Svelte מנהלות את העיבוד של הנתונים האלה בצורה יעילה ומאובטחת. ערכת הכלים המודרנית הזו נמצאת בפיתוח פעיל, נהנית מהשקעה עצומה באבטחה במנועי JavaScript, ומשמשת כמעט את כל מפתחי האינטרנט כיום. למעשה, רק כ-0.02% מטעינות דפי האינטרנט כיום משתמשות ב-XSLT, ופחות מ-0.001% משתמשות בהוראות עיבוד של XSLT.

הפעולה הזו לא מתבצעת רק ב-Chrome או ב-Chromium: שני מנועי הדפדפן העיקריים האחרים תומכים גם בהסרה של XSLT מפלטפורמת האינטרנט: WebKit ו-Gecko.

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

שיפור האבטחה של ניתוח XML

בדומה לבעיות האבטחה החמורות ב-libxslt, לאחרונה דווח על בעיות אבטחה חמורות ב-libxml2, שמשמשת ב-Chromium לניתוח, לסריאליזציה ולבדיקה של תקינות ה-XML. כדי לטפל בבעיות אבטחה עתידיות בניתוח XML ב-Chromium, אנחנו מתכננים להפסיק את השימוש ב-libxml2 ולהחליף את ניתוח ה-XML בספריית ניתוח XML בטוחה לזיכרון שנכתבה ב-Rust. חשוב לציין שלא נסיר את XML מהדפדפן, אלא רק את XSLT. אנחנו רוצים לוודא שההחלפה של libxml2 תהיה שקופה לחלוטין למפתחי אתרים.

איך מבצעים את ההעברה

יש כמה דרכים חלופיות לביצוע ההעברה.

JSON

אין דרך אחת שמתאימה לכל האתרים שנבנו באופן מלא ב-XML וב-XSL. אפשרויות ההעברה כוללות העברה של צינור העיבוד של XSLT לצד השרת ושליחה של ה-HTML שעבר רינדור ללקוח, או העברה של נקודות קצה של XML API בצד השרת ל-JSON, וביצוע רינדור בצד הלקוח באמצעות JavaScript כדי להמיר JSON ל-HTML DOM ול-CSS.

‫XSLT בצד הלקוח ב-JavaScript

יש כמה ספריות XSLT בצד הלקוח (מבוססות JavaScript), אבל הגדולה ביותר היא של Saxonica (אפשר לעיין בתיעוד המקיף של Saxonica). ההטמעה חורגת מההטמעה של XSLT 1.0 בדפדפני אינטרנט, ומיישמת תמיכה מלאה בתקן v3.0 העדכני, ובסופו של דבר גם בתקן v4.0 שנמצא בתהליך פיתוח.

פוליפיל

יש polyfill שמנסה לאפשר לקוד קיים, שתלוי בהטמעות של XSLT 1.0 בדפדפני אינטרנט, להמשיך לפעול, בלי להשתמש בתכונות XSLT מקוריות מהדפדפן. ה-polyfill נמצא ב-GitHub.

ה-polyfill מכיל תחליף פוליפיל פונקציונלי מבוסס-WASM למחלקה XSLTProcessor, כך שקוד JavaScript קיים יכול להמשיך לפעול כמו שהוא:

<script src="xslt-polyfill.min.js"></script>

<script>
const xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsltDoc);
const fragment = xsltProcessor.transformToFragment(xmlDoc, document);
</script>

ה-polyfill מספק גם פונקציית כלי עזר אוטומטית שמאפשרת להחליף בקלות מסמכי XML שמשתמשים בהוראות עיבוד XSLT:

אם יש לכם קובץ מקורי demo.xml כזה:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="demo.xsl"?>
<ROOT>
...content...

אפשר להוסיף שורה אחת כדי להפעיל את ה-polyfill ולשנות את המסמך באמצעות גיליון הסגנונות של XSLT שאליו מתייחסים:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="demo.xsl"?>
<ROOT>
<script src="xslt-polyfill.min.js"
   xmlns="http://www.w3.org/1999/xhtml"></script>
...content...

במקרה הזה, רכיב <script> החדש טוען את ה-polyfill, שמזהה את סוג מסמך ה-XML ואת הוראת העיבוד של XSLT, וטוען אותו באופן שקוף, ומחליף את המסמך.

Extension

יש גם תוסף ל-Chrome שאפשר להוסיף לדפדפנים נתמכים, והוא יחיל את אותו פוליפיל של XSLT על כל דפי ה-XML הגולמיים שמכילים הוראות עיבוד של XSLT או קריאות ל-XSLTProcessor. אפשר להשתמש בזה באפליקציות שבהן אי אפשר לשנות את מקור ה-XML או ה-XSLT, כדי לשמור על הפונקציונליות.

בפרט, כש-XSLT מושבת, Chrome מציג עכשיו באנר אזהרה שמקשר ישירות לדף חיפוש תוספים, כדי לעזור למשתמשים למצוא תוסף:

ההודעה שמוצגת ב-Chrome כשמזוהה xslt.

תרחישים ספציפיים לדוגמה

בדיון בתקני HTML, זוהו כמה תרחישי שימוש קונקרטיים. בקטע הזה נסביר על כל אחת מהן בנפרד, כדי להמליץ על דרכים למפתחים שמפרסמים היום משאבי XML שמשתמשים ב-XSLT.

פידים של RSS ו-Atom

בפידים רבים קיימים בפורמט RSS או Atom, נעשה שימוש ב-XSLT כדי להפוך פידים גולמיים בפורמט XML לקריאים כשצופים בהם ישירות בדפדפן. תרחיש השימוש העיקרי הוא שכאשר משתמש לוחץ בטעות על קישור לפיד RSS של אתר, במקום להדביק את הקישור הזה לקורא ה-RSS שלו, הוא מקבל תגובת HTML מעוצבת שהוא יכול לקרוא, במקום קובץ ה-XML הגולמי עצמו.

יש שני תרחישים לדוגמה לשימוש ב-Google Analytics 4. הדרך הסטנדרטית לעשות את זה ב-HTML היא להוסיף <link rel="alternate" type="application/rss+xml"> לאתר (מבוסס-HTML), במקום להוסיף <a href="something.xml"> גלוי (למשתמשים) שמשתמשים עלולים ללחוץ עליו בטעות. הפתרון הזה מאפשר לקוראי RSS למצוא את הפיד אם משתמש מדביק רק את כתובת האתר, אבל הוא גם מאפשר למשתמשים אנושיים לראות את תוכן ה-HTML הרגיל בלי להתבלבל מקישור למשאב XML. הגישה הזו תואמת גם לפרדיגמה הרגילה באינטרנט, שלפיה HTML מיועד לאנשים ו-XML מיועד למכונות. כמובן שזה לא פותר את המקרה שבו למשתמש יש קישור RSS ממקום כלשהו, והוא מדביק אותו בדפדפן האינטרנט (ולא בקורא ה-RSS).

אם לא רוצים להשתמש בפתרון הזה, אפשר להשתמש ב-polyfill. כמו שצוין קודם, אפשר להוסיף לפיד ה-XML של RSS/Atom שורה אחת, <script src="xslt-polyfill.min.js" xmlns="http://www.w3.org/1999/xhtml"></script>, כדי לשמור על ההתנהגות הקיימת של המרה מבוססת XSLT ל-HTML. זה לא אמור להשפיע על היכולת של קורא ה-RSS להמשיך לנתח את ה-XML, כי <script> הוא צאצא ישיר של רכיב הבסיס.

פלט API למכשירים מוטמעים

חלק מהמכשירים המסחריים המוטמעים מודדים נתוני XML או יוצרים אותם בדרך אחרת לצריכה על ידי משתמשים ברשת המקומית. חלק מהמכשירים האלה עושים את זה על ידי יצירה של פיד נתונים יחיד בפורמט XML, שמשתמש ב-XSLT כדי להמיר אותו לפורמט HTML שנוח לקריאה. כך אפשר לראות את ה-API ישירות בדפדפן בלי להוסיף קוד במכשיר או בדפדפן.
מכיוון שמדובר בתרחיש שימוש ספציפי מאוד לאפליקציה, יכול להיות שהפתרון יהיה שונה. באפליקציות שבהן אפשר לעדכן את קוד המקור של המכשיר המוטמע, כל אחת מהאפשרויות שמתוארות למעלה (JSON, ‏ Polyfill) יכולה להתאים. עם זאת, קשה או בלתי אפשרי לעדכן הרבה מהמכשירים האלה, מסיבות שונות. במקרה כזה, סביר להניח שהתוסף הוא האפשרות הטובה ביותר, כי הוא מאפשר לדפדפני הלקוח להמשיך לקרוא את הנתונים בדיוק באותו אופן, בלי לשנות את המכשיר.

תבניות עצלניות לאתרים

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

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

אם נתקלתם בבעיה ספציפית ב-Chrome שקשורה להוצאה משימוש של XSLT, אפשר לדווח על באג כאן.

איך מזהים שימוש ב-XSLT

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

‫Reporting API

Reporting API הוא מנגנון דיווח כללי לאפליקציות אינטרנט, שמאפשר לדווח על תכונות ותנאים שונים בפלטפורמה, כולל הוצאה משימוש של תכונות. כדי להגדיר אותו לדיווח על הוצאה משימוש של XSLT, אפשר להשתמש בקטע קוד כמו זה:

new ReportingObserver((reports, observer) => {
  reports.forEach((report) => {
    if (report.body.id === "XSLT") {
      // XSLT usage was detected - report it back here.
    }
  });
}, {types: ["deprecation"],buffered: true}).observe();

כאן אפשר לראות את הקוד בפעולה ב-CodePen.

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

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