Defaults.Exposed

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 נקודות ומדורג כבעיית חומרה בינונית — לא כיוון שהכותרת לבדה היא קטסטרופה, אלא כיוון שהיעדרה הוא אות אמין שהבסיסיות לא ננעלו.

מה זה יכול לעלות לך

אלה תרחישים ריאליים ברמת העסק — לא תיאטרון מקרה גרוע.

אף אחד מאלה לא דורש תוקף מתוחכם. ניצול 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/פרוקסי דומה) — לעתים קרובות המהיר ביותר, מכסה את כל האתר בבת אחת:

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 קיים. בדוק את האתר בקצרה כדי לאשר שלא נשבר דבר מסוגנן או מסוקרפט — באתר בנוי נכון, לא ישבר.

טעויות נפוצות

מסור זאת לאיש ה-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 מלא.