זהירות! אינטרנט אקספלורר 11 שינה את ה-User Agent String שלו

כתבתם סקריפט שבודק אם מדובר באינטרנט אקספלורר? הוא לא יעבוד בגרסה 11 של דפדפן הגיהנום

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

הנך משתמש בדפדפן לא מוכר. אנא עבור לאינטרנט אקספלורר 7 ומעלה או כרום/פיירפוקס. אבל הגולש השתמש באקספלורר 11.
הנך משתמש בדפדפן לא מוכר. אנא עבור לאינטרנט אקספלורר 7 ומעלה או כרום/פיירפוקס. אבל הגולש השתמש באקספלורר 11.

מה קרה כאן?

המתכנתים שבנו את האתר של לאומי כארד השתמשו ב-User Agent detection. מה זה בדיוק? מדובר במחרוזת טקסט קטנה שניתן לקרוא אותה עם JavaScript באופן הבא:


navigator.userAgent;

אתם מוזמנים להריץ את השורה הזו ב-console. כל דפדפן מחזיר תוצאה אחרת בהתאם לסוג הדפדפן. כרום למשל יחזיר:


"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"

דפדפן אינטרנט אקספלורר 9 יחזיר משהו כזה:


Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US)

באתר הזה יש רשימה אדירה של user strings של דפדפנים רבים רבים על מערכות הפעלה רבות כולל User String של מערכות שאינן דפדפנים כלל (כמו crawlers למשל).

מתכנת יכול לקחת את ה-User String ולבדוק באמצעותו את גרסת המשתמש. הסברתי במאמר על Browser detection איך עושים את זה.

מה הבעיה עם אינטרנט אקספלורר 11? מיקרוסופט בחוכמתה כה רבה, הודיעה על כך שהיא משנה את ה-User agent של אינטרנט אקספלורר 11 כך שיהיה מטעה בכוונה (!!!) וימנע ממתכנתים למצוא בקלות שמדובר באינטרנט אקספלורר 11.

כך הוא נראה:


    Mozilla/5.0 (Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko

ה-User agent הזה שונה באופן מהותי מזה של הגרסאות האחרות של אינטרנט אקספלורר. השוו למשל ל-User agent של אינטרנט אקספלורר 10 שמצהיר על עצמו בגאון, בדומה לשאר הגרסאות, על היותו אינטרנט אקספלורר:


Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)

מיקרוסופט ממש ניסו, בכוח, להקשות על מתכנתים לבצע Browser detection. לא רק שהם הורידו את MSIE, הם הוסיפו את המילה Gecko למשל – שהיא מילת המפתח שמופיעה בדפדפן פיירפוקס.

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

כדי להגביר את השמחה והששון – אם אינטרנט אקספלורר 11 מבצע אמולוציה לגרסאות קודמות, אז גם שם ה-User agent משתנה למחרוזת שונה…. נהדר! 🙁

ביצוע Browser detection לאינטרנט אקספלורר 11

קודם כל – עדיף מאוד לא לבצע Browser detection. אפשר לעשות Feature detection נורמלי. כדאי לכם לעשות את זה – אם אי אפשר, אפשר פשוט לחפש את המילה Trident או MSIE כמו בדוגמה הבאה:


var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var net = !!navigator.userAgent.match(/.NET4.0E/);
var IE11 = trident && net
var IEold = ( navigator.userAgent.match(/MSIE/i) ? true : false );
if(IE11 || IEold){
alert("IE")
}else{
alert("Other")
}

למה מיקרוסופט עשו את זה?

כמו כל פיצ'ר חדשני, עולה השאלה למה בדיוק מיקרוסופט עשו את זה? התירוץ הרשמי שלהם הוא שהם 'רוצים למנוע ממפתחים להשתמש ב-Browser detection'.
באופן אישי, אני חושב שמדובר בתירוץ עלוב. אני גם לא חושב ש-Browser detection הוא משהו נכון לעשות – אבל עם כל הכבוד מיקרוסופט הם מפתחי דפדפן, לא המחנכים של מתכנתי אינטרנט. יש פה עניין של תאימות לאחור. ובכך שהם שינו חלק מהותי שבו משתמשים לא מעט מתכנתים הם גרמו ללא מעט אפליקציות להשבר והוכיחו – שוב, שלמיקרוסופט אין שום רצון בלבוא לקראת המתכנתים אלא שוב הם מנסים להפיל על השוק את התכתיבים שלהם.

דרך חשיבה כזו כמובן היא לא רק אנכרוניסטית אלא גם פועלת כחרב פיפיות כנגד הדפדפן המחליא: מצד המתכנתים – היא לא מוסיפה אהבה גדולה לדפדפן הנתעב. אבל גם ככה רובם המוחץ של המתכנתים מתעבים את השיקוץ. מצד המשתמשים – טוב, אין כמו לשדרג את דפדפן אינטרנט אקספלורר ואז לקבל הודעות שגיאה באתר הבנק שלך… זה בטח יוביל חלק מהם לזרועות של דפדפנים אחרים.

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

פוסטים נוספים שכדאי לקרוא

גלילה לראש העמוד