Defaults.Exposed › תיקונים › הגנת MIME-sniffing (X-Content-Type-Options)
כיצד לתקן הגנת MIME-sniffing (X-Content-Type-Options)
כותרת בשורה אחת שעוצרת דפדפנים מניחוש מה קובץ הוא באמת. ללא זה, קובץ שמישהו מעלה לאתר שלך — או קובץ בדפים שלך — עלול להתפרש שגוי ע"י הדפדפן ולרוץ כקוד, שזה בדיוק כיצד חלק מהתקפות הופכות העלאה שנראית תמימה לדרך לגנוב את הסשנים של לקוחותיך.
השורה התחתונה לעסק שלכם: כותרת זו חסרה היא אות ברור וניתן לסריקה שהבסיסיות אינן מוגנות. בפני עצמה היא לעתים נדירות מורידה אתר, אבל בשילוב עם טופס העלאת קבצים או תוכן שנוצר ע"י משתמשים היא פותחת נתיב לתוקף להריץ קוד זדוני בדפדפני המבקרים — חטיפת סשנים מחוברים, גניבת פרטי כניסה או כרטיס, ומציבה אותך בצד הלא נכון של שיחת הפרצת מידע. זהו אחד התיקונים הזולים ביותר באבטחה: שורה אחת, חינמית, כ-5 דקות.
מה זה יכול לעלות לכם
- כל דף שבו לקוחות או עובדים יכולים להעלות קבצים (אווטארים, מסמכים, קבצים מצורפים לתמיכה, תמונות רישומים) הופך לנקודת השקה אפשרית להתקפות בצד הדפדפן.
- תוקף יכול להסוות קוד זדוני כתמונה או קובץ טקסט ולגרום לדפדפן המבקר להריץ אותו — גונב את הסשן המחובר שלהם באתר שלך.
- שאלוני אבטחה, בדיקות ביטוח סייבר, וקונים ארגוניים סורקים כותרת זו; היעדרה קוראת כ'הם לא עושים את הבסיסיות' ויכולה לעצור או לטבוע עסקה.
- דפדפנים ישנים וכמה אינטגרציות 'מנחשים' סוגי תוכן ועלולים לטפל בקבצים בצורות שמשברות אמון או מדליפות נתונים.
מדוע זה חשוב. דפדפנים, כשהשרת מעורפל לגבי מה קובץ הוא, ינסו לנחש ('לנחש') את סוג התוכן. תוקפים מנצלים ניחוש זה: העלה קובץ שהשרת מתייג כתמונה, אבל עצב את תוכנו כך שהדפדפן יחליט שהוא למעשה JavaScript — ויריץ אותו. הכותרת X-Content-Type-Options: nosniff אומרת לכל דפדפן להפסיק לנחש ולסמוך על הסוג שהוצהר ע"י השרת, וסוגרת את כל אותה קבוצה של תחבולות. זוהי בדיקה מנוקדת ששווה 25 נקודות ומדורגת חומרה בינונית כשחסרה.
הגרסה הקצרה לבעל העסק
יש הנחה שקטה מובנית בכל דפדפן אינטרנט: כשהוא מוריד קובץ מהאתר שלך, הוא מנסה לעבוד על מה סוג הקובץ. בדרך כלל הוא סומך על השרת שלך. אבל אם השרת שלך מעורפל, הדפדפן ינחש — והניחוש הזה נקרא MIME-sniffing.
הבעיה היא שתוקפים יכולים לשחק עם הניחוש. הם יכולים לעצב קובץ שהשרת שלך מאמין בצורה כנה שהוא תמונה תמימה, אבל שהדפדפן, ברשות לנחש, מחליט שהוא למעשה קוד תוכנה — ואז מריץ אותו, ממש בתוך הדפדפן של לקוחך, בדומיין שלך.
יש הוראה בשורה אחת שמכבה את הניחוש: X-Content-Type-Options: nosniff. היא אומרת לכל דפדפן, “אל תנחש — סמוך בדיוק על מה שהשרת שלי אומר לך.” זה כל התיקון. הוא חינמי, לוקח כ-5 דקות, ובאתר בנוי נכון הוא לא שובר כלום.
בדיקה זו מחפשת אותה כותרת. אם היא חסרה, אתה מפסיד 25 נקודות ומדורג כבעיית חומרה בינונית — לא כיוון שהכותרת לבדה היא קטסטרופה, אלא כיוון שהיעדרה הוא אות אמין שהבסיסיות לא ננעלו.
מה זה יכול לעלות לך
אלה תרחישים ריאליים ברמת העסק — לא תיאטרון מקרה גרוע.
-
“הקובץ המצורף התמים” שלא היה. אתה מריץ פורטל תמיכה או שוק שבו לקוחות מעלים קבצים — קבלות, תמונות, מסמכים. תוקף מעלה קובץ שהמערכת שלך מאחסנת ומגישה כתמונה. ללא nosniff, הדפדפן של קורבן מנחש שהקובץ הוא למעשה סקריפט ומריץ אותו — גונב בשקט את הסשן המחובר של אותו מבקר באתר שלך. עכשיו לתוקף יש אותם: מציב הזמנות, קורא הודעות, משנה פרטים. אתה גלה זאת כשלקוחות מתחילים להתלונן על פעילות שלא עשו.
-
העסקה שעוצרת בשאלון אבטחה. צוות רכש של לקוח גדול מריץ סריקה אוטומטית של האתר שלך לפני החתימה. כותרות אבטחה חסרות מופיעות מיד. גם אם כלום מעולם לא נוצל, הדוח אומר “כותרות אבטחת אינטרנט בסיסיות חסרות,” ופתאום אתה עונה על שאלות תיקון ודוחה את תאריך הסגירה שלך בשבועות — על תיקון שהיה לוקח חמש דקות.
-
חידוש ביטוח הסייבר שמסתבך. יותר מבטחים מריצים כעת סריקות חיצוניות לפני הצעת מחיר או חידוש. פרופיל כותרת נקי הוא הוכחה זולה להיגיינה; חסר הוא כתם קטן שמונח עם אחרים דוחף את הפרמיה שלך למעלה או את התנאים שלך למטה.
-
פגיעת המוניטין שאינה בקלות בטלה. אם אירוע חטיפת סשן עוקב בחזרה לקובץ שנגיש מהדומיין שלך, הסיפור אינו “כותרת נסתרת חסרה” — הוא “[העסק שלך] דלף חשבונות לקוחות.” זוהי הגרסה שלקוחות זוכרים, ועולה הרבה יותר מהתיקון שאי פעם היה עולה.
אף אחד מאלה לא דורש תוקף מתוחכם. ניצול MIME-sniffing מובן היטב ואוטומטי, שזו בדיוק הסיבה שסורקים מסמנים את הכותרת החסרה בנחרצות כל כך.
מה זה בעצם
כשדפדפן מקבל קובץ, השרת אמור לתייג אותו עם סוג תוכן (לדוגמה, image/png לתמונת PNG או text/html לדף אינטרנט). היסטורית, דפדפנים לא סמכו לחלוטין על התייג הזה — חלקית כיוון שחלק מהשרתים טעו — אז הם היו מציצים בבייטים האמיתיים של הקובץ ומחליטים בעצמם. ההצצה הזו היא MIME-sniffing.
זו הייתה נוחות שהפכה לחבות. אם תוקף יכול להכניס קובץ לאתר שלך (דרך טופס העלאה, שדה הערות, מסמך מיובא) ולהשפיע על תוכנו, הוא יכול לעצב משהו שהשרת מתייג בצורה תמימה אבל הדפדפן מנחש כסקריפט ניתן להרצה. הדפדפן אז מריץ אותו בדומיין שלך, עם כל האמון שהדומיין שלך נושא.
X-Content-Type-Options: nosniff מסיר את הניחוש לחלוטין. כשהוא מוגדר, לדפדפן נאמר: השתמש בסוג המוצהר של השרת ולא בכלום אחר. קובץ שמתויג כתמונה מטופל כתמונה, נקודה — גם אם תוכנו נראה כסקריפט. וקטור ההתקפה נסגר.
מה נראה “טוב”: כל תגובה מהאתר שלך — דפים ונכסים כאחד — נושאת בדיוק את הכותרת הזו:
X-Content-Type-Options: nosniff
אין ערך חוקי אחר ואין כוונון לעשות. אם ה-CDN והשרת שלך שניהם מוסיפים אותו (כך שאתה רואה nosniff, nosniff), זה בסדר גמור ועדיין נחשב למעבר.
כיצד לתקן (חינם, ~5 דקות)
מסור חלק זה למי שמריץ את האתר שלך — איש ה-IT שלך, מפתח האינטרנט שלך, או תמיכת האירוח שלך. התיקון חינמי ומהיר; אין מה לקנות. מה שאתה מבקש הוא פשוט: “הוסף את כותרת התגובה X-Content-Type-Options: nosniff לכל דף ונכס באתר.”
הנה הפרטים עבורם, לפי פלטפורמה נפוצה.
Cloudflare (או CDN/פרוקסי דומה) — לעתים קרובות המהיר ביותר, מכסה את כל האתר בבת אחת:
- השתמש בכלל Transform של Response Header (Rules → Transform Rules → Modify Response Header) כדי להגדיר את
X-Content-Type-Optionsל-nosniffלכל הבקשות הנכנסות. זה מיישם אותו ברחבי האתר ללא נגיעה בשרת המקור.
Nginx — הוסף בתוך בלוק ה-server (או location) הרלוונטי:
add_header X-Content-Type-Options "nosniff" always;
מילת המפתח always מבטיחה שהיא נשלחת גם בתגובות שגיאה. טען מחדש Nginx לאחר שמירה.
Apache — דורש שmod_headers מופעל; בתצורת האתר או .htaccess:
Header always set X-Content-Type-Options "nosniff"
IIS / אירוח Windows — ב-web.config תחת <system.webServer>:
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
</customHeaders>
</httpProtocol>
Node / Express — הגדר אותה לכל תגובה:
app.use((req, res, next) => {
res.setHeader('X-Content-Type-Options', 'nosniff');
next();
});
(או השתמש בחבילת helmet, שמגדירה זאת ומספר כותרות אבטחה אחרות כברירת מחדל.)
אתרי Google Workspace / Microsoft 365: אלה מנהלים את האימייל והמסמכים שלך, לא את אירוח האתר הציבורי שלך, אז הכותרת לא נקבעת שם — היא נקבעת היכן שהאתר שלך עצמו מוגש (ה-CDN שלך, שרת האינטרנט, או בונה האתר). אם אתה משתמש בבונה אתרים מאורח (Squarespace, Wix, Shopify ודומים), רבים מוסיפים את הכותרת הזו אוטומטית; בדוק את התוצאה ולא תניח, ובקש מהתמיכה שלהם אם היא חסרה.
לאחר פריסה, אמת אותה. הרץ מחדש את הסריקה שלך, או בקש מהמפתח שלך לבדוק את כותרות התגובה בכלי מפתח הדפדפן (לשונית Network → לחץ על כל בקשה → Response Headers) ואשר ש-X-Content-Type-Options: nosniff קיים. בדוק את האתר בקצרה כדי לאשר שלא נשבר דבר מסוגנן או מסוקרפט — באתר בנוי נכון, לא ישבר.
טעויות נפוצות
- הגדרתה בדף הבית בלבד. הכותרת חייבת להיות על כל תגובה — כולל תמונות, סקריפטים, גיליונות סגנונות וקבצים שהועלו — כיוון שאלה הם המשאבים ש-sniffing משפיע עליהם. יישם אותה ברמת השרת או ה-CDN כך שהיא אוניברסלית, לא דף-אחר-דף.
- שגיאת כתיב בערך. הערך החוקי היחיד הוא
nosniff. כל דבר אחר (ערך ריק, שגיאת כתיב) כושל בבדיקה ולא מספק הגנה. הסורק ידווח על הערך שראה בפועל כדי שתוכל לאתר שגיאת כתיב. - הנחה שהיא מחליפה מדיניות אבטחת תוכן. nosniff היא שכבה אחת. היא לא שולטת באילו סקריפטים מותר לטעון — זה עבודתה של CSP. הוסף nosniff עכשיו כניצחון מהיר, וטפל ב-CSP ראויה כמעקב גדול יותר.
- הסרת ה”כפילות”. אם ה-CDN והמקור שלך מגדירים אותה, תראה אותה פעמיים. זה לא מזיק — אל תבלה זמן בהסרת אחת.
- תשלום עבורה. זה שינוי תצורה חינמי. ניטור, ביקורות ולוחות מחוונים של תיק הם בצדק בתשלום; הוספת כותרת יחידה — לא.
מסור זאת לאיש ה-IT שלך
הסיכום הטכני: בדיקה זו בוחנת את כותרות תגובת ה-HTTP ועוברת כש-X-Content-Type-Options קיים וערכו (לא תלוי-רישיות) מכיל nosniff — כולל המקרה מרובה-מקורות nosniff, nosniff שבו CDN ומקור שניהם מגדירים אותו. חסר או כל ערך שאינו nosniff נכשל. זוהי בדיקת P2 מנוקדת ששווה 25 נקודות, מדורגת בינוני בחומרה כשנכשלת, וממופה ל-OWASP Top 10 A05 (Security Misconfiguration). התיקון הוא כותרת תגובה סטטית יחידה שמיושמת בכל התגובות; אין פרמטרים ואין ערכים חוקיים חלופיים. הגדר אותה בקצה (CDN) לכיסוי כלל האתר, או בשרת האינטרנט עם סמנטיקה always כך שהיא נפלטת גם בתגובות שגיאה, ואז אשר בכותרות התגובה.
שאלות נפוצות
אנחנו לא מאפשרים לאף אחד להעלות קבצים. האם אנחנו עדיין צריכים את זה?
כן, ועדיין כדאי לעשות זאת. הכותרת היא הגנה לעומק: היא גם עוצרת את הדפדפן מקריאת סקריפטים, גיליונות סגנונות, וקבצי נתונים הנובעים מהאתר שלך בצורה שגויה, מה שמגן מפני מספר תחבולות cross-site-scripting גם באתרים ללא טופס העלאה. זה לא עולה כלום ולעולם לא שובר אתר מוגדר נכון, אז אין סיבה לדלג על זה.
האם הוספת זה תשבור משהו באתר שלנו?
כמעט אף פעם. nosniff פשוט גורם לדפדפנים לכבד את סוג התוכן שהשרת שלך כבר שולח. הדרך היחידה שזה גורם לצרות היא אם השרת שלך מתייג קבצים בצורה שגויה — לדוגמה שולח גיליון סגנונות או סקריפט עם הסוג הלא נכון. אם משהו אכן נשבר, זהו באג אמיתי ש-nosniff חשף ולא גרם, וכדאי לתקן אותו ממילא. בדוק פעם אחת לאחר פריסה.
מה נראה 'טוב' בפועל?
כותרת תגובה יחידה על כל דף ונכס: X-Content-Type-Options: nosniff. זוהי כל התצורה הנכונה — אין ערכים חוקיים אחרים ואין כוונון לעשות.
ה-CDN שלנו (Cloudflare או דומה) והשרת שלנו שניהם מוסיפים אותה — האם זה בעיה?
לא. ראיית הערך פעמיים ('nosniff, nosniff') כיוון שגם ה-CDN וגם המקור מגדירים אותו בסדר גמור ועדיין עובר. אינך צריך להסיר אחת.
האם תיקון זה עולה כסף?
לא. התיקון הוא שורת תצורה חינמית אחת על שרת האינטרנט או ה-CDN שלך. כל אחד שגובה ממך תשלום להוספת כותרת יחידה גובה יתר על המידה. הדברים היחידים ששווה לשלם עליהם בתחום זה הם ניטור שוטף, תצוגת תיק עבור אתרים רבים, או ביקורת פורמלית — לא התיקון עצמו.
במה זה שונה ממדיניות אבטחת תוכן (CSP)?
הם משלימים. CSP שולט באילו סקריפטים ומשאבים מותרים לטעון בכלל; nosniff עוצר את הדפדפן מסיווג שגוי של קובץ שהוא כן טוען. אתה רוצה את שניהם. nosniff הוא הרבה פשוט ומהיר יותר להוספה, אז הוא צעד ראשון טוב בדרך ל-CSP מלא.