Defaults.Exposed

Defaults.Exposedתיקונים › Content-Security-Policy (CSP)

כיצד לתקן Content-Security-Policy (CSP)

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

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

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

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

מה זה, בשפה פשוטה

כשמישהו מבקר באתר שלך, הדפדפן שלו מוריד את הדף שלך ומריץ כל קוד שיש בו — הסקריפטים שגורמים לתפריטים לרדת, כפתורים לעבוד, טפסי תשלום להגיש, וכן הלאה. כברירת מחדל, הדפדפן סומך על כולם. אין לו דרך לדעת איזה קוד הוא שלך באמת ואיזה הוחדר ע”י מישהו אחר.

מדיניות אבטחת תוכן (מקוצר לרוב CSP) היא רשימת כללים קצרה שהאתר שלך מצרף לכל דף, שאומרת לדפדפן: “הרץ רק קוד ממקורות אלה שאישרתי, ותסרב לכל השאר.” זוהי ההבדל בין מועדון שנותן לכל אחד להיכנס לבין אחד עם רשימת אורחים בדלת.

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

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

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

מה זה בעצם (הפרטים)

מדיניות אבטחת תוכן מועברת ככותרת תגובת HTTP יחידה — שורה ששרת האינטרנט שלך שולח עם כל דף. ערכה הוא קבוצה של הוראות, כל אחת שמות סוג תוכן ומקורות המותרים לו. לדוגמה:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'

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

מה נראה “טוב”. הבדיקה שלנו לא מחפשת רק את נוכחות הכותרת — היא קוראת את המדיניות הוראה אחר הוראה ומנקדת עד כמה היא חזקה בפועל, בדרך שסוקר אבטחה היה עושה. מדיניות חזקה:

מדיניות שקיימת אך נשענת על 'unsafe-inline', 'unsafe-eval', או wildcards עדיין תנקד נמוך — כיוון שבפועל היא מספקת מעט הגנה אמיתית. המטרה היא מדיניות הדוקה, לא סתם מדיניות כלשהי.

כיצד לתקן (חינם, ~1–2 שעות)

מסור זאת לאיש ה-IT שלך או למי שמריץ את האתר שלך — התיקון עצמו חינמי לחלוטין. אנחנו גובים תשלום רק לניטור שהוא נשאר במקום ונכון לאורך זמן; הפעלתו לא עולה כלום. הסיבה שזה לוקח שעה-שתיים ולא דקות היא שלב הניסיון הזהיר שעוצר אותו מחסום בטעות חלקים מהאתר שלך.

  1. התחל במצב דיווח-בלבד — אל תאכוף עדיין. הוסף כותרת תגובת Content-Security-Policy-Report-Only. זה צופה ורושם מה היה נחסם ללא חסימה בפועל, כך שהאתר החי ממשיך לעבוד בזמן שאתה לומד על מה כל דף תלוי באמת. (חשוב: דיווח-בלבד בפני עצמו אינו מספק למבקרים הגנה — זה רק הצעד הראשון הבטוח.)

  2. בנה את המדיניות ממה שהאתר שלך באמת משתמש בו. סקור את הדיווחים כדי למצוא כל מקור לגיטימי של סקריפטים, סגנונות, גופנים, ותמונות — הדומיין שלך, האנליטיקה שלך, ספק התשלומים שלך, מארח הגופנים שלך, ווידג’ט הצ’אט שלך — ורשום אותם כמקורות מותרים. נקודת פתיחה מוצקה היא default-src 'self' בנוסף לרשומות מפורשות לגורמי הצד השלישי המהימנים שאתה באמת משתמש בהם.

  3. הימנע מהפרצות שמבטלות את כל המטרה. התרחק מ-'unsafe-inline' ו-'unsafe-eval' עבור סקריפטים, והימנע ממקורות wildcard כמו * ו-schemes בלבד כמו https: עבור סקריפטים — אלה פותחים מחדש בדיוק את הפרצה שהמדיניות אמורה לסגור. כשסקריפטים inline בלתי נמנעים, השתמש בנוס (nonce) או עיכול (hash) כדי שרק הקוד המאושר הספציפי שלך ירוץ.

  4. נעל הסגרה ותוספים. הוסף frame-ancestors 'self' (זה גם עוצר אתרים אחרים מהטמעת שלך כדי להטעות את לקוחותיך, ומספק את בדיקת ה-clickjacking הקשורה) ו-object-src 'none' לחסימת התקפות מבוססות תוסף ישנות.

  5. עבור מדיווח-בלבד לאכיפה. לאחר שהדיווחים נקיים והאתר עובד, שנה את שם הכותרת מ-Content-Security-Policy-Report-Only ל-Content-Security-Policy. זה הצעד שמספק הגנה בפועל — מדיניות דיווח-בלבד לבדה לא, ולא תעבור את הבדיקה.

    היכן שאתה מגדיר את הכותרת תלוי בפלטפורמה שלך:

    • Cloudflare: Rules → Transform Rules → Modify Response Header → הגדר Content-Security-Policy. (אתה יכול להשתמש ב-Cloudflare גם לניסיון הדיווח-בלבד.)
    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';" always;
    • Apache: Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';"
    • IIS (web.config): הוסף כותרת תגובת HTTP מותאמת בשם Content-Security-Policy עם המדיניות כערכה.
    • Google Workspace / Microsoft 365: אלה מריצים את האימייל שלך, לא את האתר הציבורי שלך, אז המדיניות נקבעת היכן שהאתר שלך מתארח בפועל (Cloudflare או מארח האינטרנט שלך למעלה), לא במסוף האדמין לאימייל שלך.
  6. בדוק מחדש את הדומיין שלך כדי לאשר שהמדיניות מוצגת כעת כמופעלת ואוכפת, ללא פרצות מחלישות.

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

שאלות נפוצות

אני לא טכני — האם אני יכול לטפל בזה בעצמי?

אתה לא צריך להבין את הפרטים. זוהי הגדרה שמוסיף מי שמריץ את האתר שלך או האירוח שלך, ובשירותים כמו Cloudflare היא מונחית ברובה. מסור להם את חלק 'כיצד לתקן' למטה. זה חינם; הזהירות האחת היא שצריך לפרוס אותה בזהירות במצב ניסיון-צפייה-בלבד תחילה כדי שלא תחסום בטעות חלקים מהאתר שלך — וזה בדיוק מה שהשלבים מכסים.

כבר יש לי את המנעול ותעודת SSL — האם האתר שלי לא מאובטח?

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

האם הפעלת זה יכולה לשבור את האתר שלי?

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

הכנסנו אותו למצב 'דיווח-בלבד' כבר — האם אנחנו מכוסים?

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

האם זה משפיע על הציון שלנו, או שזה רק ייעוצי?

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

המפתח שלנו הוסיף מדיניות אבל הציון עדיין נמוך — למה?

מדיניות יכולה להתקיים ועדיין להיות חלשה. הפרצות הנפוצות ביותר הן פרצות כמו 'unsafe-inline' ו-'unsafe-eval' עבור סקריפטים, או מקורות wildcard (כוכבית בלבד *), שפותחות מחדש בדיוק את הפרצה שהמדיניות אמורה לסגור. הבדיקה שלנו קוראת את המדיניות הוראה אחר הוראה ומנכה נקודות עבור חולשות אלה — מדיניות שמאפשרת כל דבר מנקדת מעט יותר מאשר אין מדיניות. התיקון הוא הידוק כללי הסקריפטים תוך שימוש בנוסים (nonces) או עיכולים (hashes) במקום אותם פרצות.