Defaults.Exposed › תיקונים › הגנת Clickjacking (X-Frame-Options)
כיצד לתקן הגנת Clickjacking (X-Frame-Options)
הוראה בשורה אחת שאומרת לדפדפנים לא לאפשר לאתרים אחרים לטעון את האתר שלך בסתר בתוכם. ללא זה, רמאי יכול להסתיר את הדפים האמיתיים של הכניסה שלך מאחורי דף מזויף ולגרום ללקוחותיך ללחוץ על דברים שמעולם לא התכוונו אליהם — אישור תשלום, שינוי סיסמה, מתן גישה.
השורה התחתונה לעסק שלכם: רמאי יכול לעטוף את האתר החי שלך בתוך מזויף ולגנוב כסף או גישה לחשבון מהלקוחות המחוברים שלך — ולאותו לקוח זה נראה כאילו האתר שלך עשה זאת. התיקון חינמי ולוקח ממפתח כ-15 דקות; השארתו כבוי היא פרצה ידועה שגם פושעים וגם קונים זהירים יכולים לאתר תוך שניות.
מה זה יכול לעלות לכם
- רמאי מסתיר את מסך הכניסה או התשלום האמיתי שלך מאחורי דף שנראה תמים ומטעה לקוח ל'אישור' העברה או שינוי הגדרה מבלי להבין זאת — הלקוח מאשים אותך, לא את התוקף.
- אזור החשבון המחובר שלך נטען בצורה בלתי נראית מעל דף 'זכית — לחץ לתביעה'; הלחיצה מאשרת למעשה שינוי אמיתי בחשבון הלקוח, ואתה מטפל בשיחת תמיכה כועסת.
- צוות ה-IT של לקוח פוטנציאלי מריץ סריקת אבטחה מהירה לפני החתימה, רואה שהאתר שלך יכול להיות מוטמע ע"י כל אחד, ומסמן אותו כסיכון שעוצר או הורג את העסקה.
- המותג שלך הופך לפתיון בקמפיין הונאה; לקוחות שנתפסים זוכרים זאת כ'החברה שהאתר שלה אפשר לזה לקרות.'
- סריקת מבטח או ביקורת סייבר רושמת הגנת clickjacking חסרה ככשל בהיגיינה בסיסית — זול לתקן, מביך שמסומן.
מדוע זה חשוב. זוהי הגדרה חינמית בשורה אחת שלוקחת דקות להוסיף, והיא סוגרת סוג שלם של תחבולות שמכוונות ללקוחות המחוברים שלך. בניקוד שלנו היא בדיקת אבטחת אינטרנט שממשה נקודות-אמיתיות ומדורגת חומרה גבוהה, כיוון שכותרת חסרה משאירה חור ידוע וניתן לבדיקה בקלות שפושעים מאוטמטים ורוכשים מחפשים.
מה זה, בשפה פשוטה
כשמישהו מבקר באתר שלך, הדפדפן שלו יכול גם להיות מונחה לטעון את האתר שלך בתוך אתר אחר — כחלון קטן שמוטמע בתוך דף גדול יותר. זה נשמע תמים, ולעתים הוא כך. אבל זהו המנגנון שמאחורי התקפה הנקראת clickjacking.
הנה התחבולה. רמאי בונה דף משלו וטוען בשקט את האתר האמיתי שלך בתוכו — באופן בלתי נראה, הופך אותו לשקוף לחלוטין. ואז הם מניחים את התוכן שלהם מעל: כפתור נוצץ, “נגן וידאו,” “תבע את הפרס שלך.” הלקוח שלך רואה את דף התוקף ולוחץ על מה שנראה כפתור תמים. אבל כיוון שהאתר האמיתי שלך יושב בצורה בלתי נראית מתחת לסמן שלהם, הלחיצה נוחתת בפועל בדף שלך — מאשרת תשלום, משנה סיסמה, מאשרת גישה, מקבלת הרשאה. הלקוח חושב שלחץ על דבר אחד; הוא לחץ בפועל על אחר, באתר שהוא סומך עליו.
הגנת Clickjacking היא הוראה קצרה ובלתי נראית שהאתר שלך שולח לכל דפדפן מבקר שאומרת, למעשה:
“אל תאפשר לאתרים אחרים לטעון אותי בתוכם. אם מישהו מנסה, תסרב.”
דפדפנים מודרניים מציתים לזאת אוטומטית. כשזה מופעל, התחבולה פשוט לא עובדת — הגרסה המוטמעת של האתר שלך מסרבת לטעון. ללא זה, האתר שלך הוא מטרה ישירה לשמשות כשכבה הנסתרת בהונאה, והלקוח שנתפס יקשר את הכל עם המותג שלך, לא עם המותג של התוקף.
מה זה יכול לעלות לך
אלה תרחישים ריאליים ויום-יומיים. לא נציין עסק אמיתי; אלה המחשות של כיצד הפרצה מנוצלת.
-
ה”אשר” הבלתי נראה. לקוח מחובר לפורטל החשבון שלך בכרטיסייה אחת. הוא נוחת בדף (מפרסומת, מייל, תוצאת חיפוש) שמבטיח משהו מפתה ומציג כפתור “המשך” גדול. מוסתר מתחת לכפתור הזה הוא הבקרה “אישור העברה” או “שנה אימייל” האמיתית שלך, טעונה מהסשן המחובר שלהם. הם לוחצים “המשך” — ומאשרים ללא ידיעתם שינוי בחשבון האמיתי שלהם אצלך. להם, ולצוות התמיכה שלך, זה נראה כאילו הם עשו זאת באתר שלך.
-
חטיפת ההגדרות. תוקף מסגר את דף הגדרות החשבון שלך ומניח עליו משחק או סקר תמים. כמה לחיצות במקומות הנכונים הופכות בשקט הגדרה — מוסיפות את האימייל של התוקף ככתובת שחזור, מעניקות הרשאת אפליקציה, או משביתות התראת אבטחה. החשבון כעת נפגע בשקט, ושום דבר לא נראה שגוי בזמן.
-
העסקה שעוצרת. לקוח גדול יותר שולח את שאלון האבטחה הסטנדרטי שלו לפני החתימה. שורה אחת שואלת האם האתר שלך מגדיר הגנה נגד הסגרה (X-Frame-Options / CSP frame-ancestors). איש ה-IT שלך צריך לענות “לא,” ורכש עוצר בזמן שאתה רץ לתקן הגדרה חינמית של 15 דקות שנראית עכשיו כדגל אדום בפני קונה.
-
קמפיין המותג-כפיתיון. כי דפים אמיתיים ומהימנים שלך ניתנים להטמעה, תוקף משתמש בכניסה או בקופה שלך כשכבה המשכנעת בקמפיין פישינג רחב יותר. הלקוחות שנתפסים לא מאשימים את התוקף הצלול — הם זוכרים שזו הפעם שהאתר “שלך” אפשר להם להיות מרומים.
-
סימון הביקורת. סריקת מבטח, או מבקר שסוקר את עמדת האבטחה שלך, רושמת הגנת clickjacking חסרה בין הממצאים. זהו פריט היגיינה בסיסי מופתי; שסומן, הוא מאותת שהגנות החינמיות הקלות לא היו במקום — מה שצובע כיצד שאר האבטחה שלך נשפטת.
החוט המשותף: הנזק נוחת על לקוח אמיתי ומחובר שעושה משהו שלא התכוון אליו — ומשא את שמך, לא את שם התוקף.
מה זה בעצם
כשדפדפן מבקש מהאתר שלך דף, השרת שלך שולח בחזרה את הדף בנוסף לכמה “כותרות” בלתי נראות — הוראות נוספות שהדפדפן קורא אבל המבקר לעולם לא רואה. הגנת Clickjacking מועברת דרך כותרות אלה. ישנן שתיים, והבדיקה שלנו עוברת אם אחת מהן קיימת:
1. הכותרת הישנה יותר — X-Frame-Options:
X-Frame-Options: SAMEORIGIN
זוהי הבקרה הוותיקה והנתמכת רחבות. היא מקבלת אחת משתי ערכים מעשיים:
SAMEORIGIN— האתר שלך עצמו עשוי להטמיע את הדפים שלו, אבל אף אתר חיצוני לא יכול. ברירת המחדל הבטוחה לכמעט כולם.DENY— אף אחד לא רשאי להטמיע את הדפים שלך, כולל אתה. השתמש בזה רק אם האתר שלך אף פעם לא מסגר את התוכן שלו עצמו.
2. הכותרת המודרנית — Content-Security-Policy frame-ancestors:
Content-Security-Policy: frame-ancestors 'self';
זוהי הבקרה החדשה יותר והגמישה יותר ואליה הסטנדרטים הנוכחיים מפנים. היא עושה את אותה עבודה אבל מאפשרת לך להיות מדויק לגבי מי רשאי להטמיע אותך:
frame-ancestors 'self'— שווה ל-SAMEORIGIN.frame-ancestors 'none'— שווה ל-DENY.frame-ancestors 'self' https://partner.example.com— האתר שלך בנוסף לשותף בודד בעל שם מהימן, ואף אחד אחר.
מה נראה “טוב”
ההגדרה החזקה ביותר משתמשת בשניהם: frame-ancestors עבור דפדפנים מודרניים (ולדיוק של שמות מטמיעים מותרים) ו-X-Frame-Options: SAMEORIGIN כגיבוי ללקוחות ישנים. הבדיקה שלנו מסתפקת בכל אחד מהם בנפרד — אבל כיוון ששניהם חינמיים ולוקחים אותן דקות ספורות, אין סיבה לא להגדיר את שניהם.
פרט חשוב אחד שהמפתח שלך צריך לדעת: כותרת Content-Security-Policy-Report-Only לא אוכפת כלום — היא רק מדווחת. אם אתה רוצה שהגנת clickjacking תיכנס לתוקף בפועל, היא חייבת להגיע מכותרת אוכפת (CSP רגיל עם frame-ancestors, או X-Frame-Options), לא כזה שדיווח-בלבד.
כיצד לתקן (חינם, ~15 דקות)
מסור חלק זה למי שמריץ את האתר שלך — איש ה-IT שלך, מפתח אינטרנט, או תמיכת אירוח. התיקון חינמי. זו כותרת תגובה אחת או שתיים, או כלל ב-CDN שלך. אין מה לקנות.
הבדיקה עוברת כשכותרת X-Frame-Options (מוגדרת ל-DENY או SAMEORIGIN) או הוראת CSP frame-ancestors קיימת. ההגדרה המומלצת עם חגורה-וחוגרות מוסיפה את שניהם.
שלב 1 — החלט עד כמה להקפיד
- רוב העסקים:
SAMEORIGIN/frame-ancestors 'self'. האתר שלך ממשיך לעבוד; חיצוניים חסומים. - אם האתר שלך אף פעם לא מטמיע את הדפים שלו:
DENY/frame-ancestors 'none'לנעילה מקסימלית. - אם שותף אמיתי חייב להטמיע דף ספציפי: ציין אותם במפורש עם
frame-ancestors 'self' https://partner.example.com;ואף אחד אחר לא נכנס.
שלב 2 — הוסף את הכותרות (בחר את הפלטפורמה שלך)
Nginx — בתוך בלוק ה-server שלך:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;
Apache — ודא שmod_headers מופעל, ואז במארח הווירטואלי שלך:
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "frame-ancestors 'self';"
Microsoft IIS — ב-web.config בתוך <customHeaders>:
<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self';" />
Cloudflare (או CDN דומה): עבור אל Rules → Transform Rules → Modify Response Header, והוסף שתי כללים שמגדירים X-Frame-Options ל-SAMEORIGIN ו-Content-Security-Policy ל-frame-ancestors 'self'; על כל התגובות. זוהי הדרך הקלה ביותר אם אין לך גישה ישירה לשרת.
כבר שולחים Content-Security-Policy מסיבות אחרות? אל תיצור כותרת CSP שנייה — הוסף frame-ancestors למדיניות הקיימת שלך. שתי כותרות CSP עלולות להתנגש.
בוני אתרים (Squarespace, Wix, Shopify ודומים): פלטפורמות אלה לעתים קרובות מגדירות הגנה נגד הסגרה עבורך, כך שייתכן שאתה כבר עובר ללא כלום לעשות. אם הבדיקה שלנו מסמנת אותה, הבקרה בדרך כלל נמצאת בהגדרות האבטחה של הפלטפורמה, או שאתה מוסיף אותה ב-CDN שיושב מול האתר. (הערה: Google Workspace ו-Microsoft 365 מניעים את האימייל שלך, לא את האתר שלך — כותרת זו נקבעת היכן שהאתר הציבורי שלך חי בפועל, לא במסוף האדמין של Workspace/365.)
שלב 3 — טען מחדש ואמת
טען מחדש את שרת האינטרנט או פרוס את כלל ה-CDN, ואז טען את האתר החי שלך ובדוק את כותרות התגובה — כלי מפתח של דפדפן → לשונית Network → לחץ על בקשת הדף → Response Headers, או כל כלי בדיקת כותרות חינמי. אשר שהכותרות מופיעות על תגובות דף אמיתיות, לא רק בדף הבית. ואז הרץ מחדש את הבדיקה.
טעויות נפוצות
- שימוש ב-CSP דיווח-בלבד ולהניח שזה מגן עליך.
Content-Security-Policy-Report-Onlyרק מדווח על הפרות — הוא לא אוכף כלום. אתה צריך כותרת אוכפת כדי שההגנה תיכנס לתוקף. - הגדרת שתי כותרות
Content-Security-Policyנפרדות. אם כבר יש לך CSP, הוסףframe-ancestorsאליה במקום לפלוט מדיניות שנייה; כותרות CSP מתנגשות עלולות לייצר התנהגות בלתי צפויה. - הגדרת
DENYכשהאתר שלך מטמיע את הדפים שלו.DENYחוסמת כל הסגרה, כולל שלך. אם חלק כלשהו מהאתר שלך משתמש ב-iframes של עצמו, השתמש ב-SAMEORIGIN/frame-ancestors 'self'במקום, או שתשבור את הדפים שלך. - הגנה רק על דף הבית. הדפים שחשובים ביותר ל-clickjacking הם המחוברים — הגדרות חשבון, אישור תשלום, אדמין. ודא שהכותרות מיושמות ברחבי האתר, לא רק לדף הקדמי.
- הנחה ש-HTTPS או המנעול כבר מכסים זאת. הצפנה והגנה נגד הסגרה אינן קשורות. תעודה מושלמת לא עושה כלום לעצור הטמעת הדפים שלך.
- הסתמכות על עקיפות ישנות. JavaScript ל”שבירת מסגרות” (סקריפטים שמנסים לצאת ממסגרות) אינו אמין ויכול להיעקף. הכותרות הן התיקון הנכון, שאוכף ע”י הדפדפן.
שאלות נפוצות
אני לא טכני — האם אני יכול לטפל בזה בעצמי?
אינך צריך לעשות את החלק הטכני. זוהי הגדרה יחידה שמוספת לשרת האינטרנט שלך או ל-CDN שלך, וכל מפתח אינטרנט או ספק IT יכול להוסיפה תוך כמה דקות. מסור להם את חלק 'כיצד לתקן' למטה — הוא אומר להם בדיוק מה להוסיף. התיקון חינמי; אנחנו גובים תשלום רק אם ברצונך שנמשיך לנטר שהוא נשאר במקום.
האם זה יעצור את האתר שלנו, או שותפים לגיטימיים, מלהציג את הדפים שלנו?
רק אם מגדיר אותו הדוק מדי. ההגדרה הנפוצה ('SAMEORIGIN', או 'frame-ancestors self') עדיין מאפשרת לאתר שלך להטמיע את הדפים שלו בעצמו כרגיל — הוא חוסם רק אתרים חיצוניים. אם שותף אמיתי צריך להטמיע עמוד ספציפי אחד שלך, המפתח שלך יכול לאפשר אותו מקור בודד תוך חסימת כל השאר.
אנחנו עסק קטן — האם מישהו באמת יטרח לכוון אלינו?
התקפות אלה רצות בבלק ע"י כלים אוטומטיים, לא נבחרות ביד. אתרים קטנים יותר נפגעים לעתים קרובות בדיוק כיוון שהם החסרים הגנות בסיסיות כמו זאת. התוקף לא צריך לדעת מי אתה — הם רק צריכים שהאתר שלך יהיה ניתן להטמעה. סגירת הפרצה לא עולה לך כלום.
מה נראה 'טוב' בפועל?
כותרת X-Frame-Options שמוגדרת ל-SAMEORIGIN (או DENY), או Content-Security-Policy עם הוראת frame-ancestors — באופן אידיאלי שניהם. הבדיקה שלנו עוברת אם אחד מהם קיים. הבקרה המודרנית והגמישה יותר היא frame-ancestors; X-Frame-Options היא הכותרת הישנה שעדיין מכסה כמה דפדפנים ישנים, כך שההגדרה עם חגורה-וחוגרות משתמשת בשניהם.
האם זה לא זהה ל-SSL padlock או ל-HTTPS?
לא — הם מגינים מפני דברים שונים לחלוטין. HTTPS מצפין את החיבור כך שאף אחד לא יכול לקרוא אותו בזמן שידור. הגנת Clickjacking עוצרת את הטעינה של הדפים שלך בתוך אתר של מישהו אחר כלל. יכולה להיות לך תעודה מושלמת ועדיין להיות חשוף לחלוטין ל-clickjacking. הן בדיקות נפרדות ואתה רוצה את שתיהן.
אם לא נתקן, האם זה מוריד את הציון שלנו?
כן. זוהי בדיקת אבטחת אינטרנט מנוקדת, לא אינפורמטיבית — כותרת חסרה עולה נקודות ומדורגת חומרה גבוהה, כיוון שהיא חושפת ישירות את לקוחות המחוברים שלך להונאה. היא גם אחת הנקודות הזולות ביותר לשחזר: כותרת חינמית יחידה, כ-15 דקות עבודת מפתח.