מבוא
אחד המאפיינים של פרוטוקול HTTP הוא Headers שנשלח כבקשה מהדפדפן ומתקבל כתשובה מהשרת. HTTP Headers הם חלק חשוב מאוד בתקשורת בין הדפים באתר אינטרנט והשרת. הם מכילים מידע והוראות יסודיות המשפיעות על הדרך שבה הדפים נטענים.
נתמקד בנושא ה-HTTP Headers, נסביר את השימושים השונים שלהם, כידת לנהל אותם ולאבטח את האתר בעזרת HTTP Headers.
המבנה של HTTP Headers:
HTTP Headers הם מידע המועבר בין הדפים והשרת כחלק מבקשות ותגובות ה-HTTP. הם מתחלקים לשני חלקים עיקריים: השורה הראשונה (Status Line או Request Line) והשורות התחתונות. השורה הראשונה מכילה את הקוד המציין את המצב של הבקשה או התגובה, כמו 200 OK לדוגמה.
שימושים נפוצים ב-HTTP Headers
- Cache Control: על ידי הגדרת ערכים ב-headers כמו Cache-Control ו-Expires, ניתן לשלוט על המטמון בדפים ולהפגיש בין ביצועיות לסיכוניות עדכונים.
- User-Agent: ה-User-Agent הוא ערך ב-header המזהה את הדפדפן או היישום שמבקש את הדף. בהשוואה ל-User-Agent ניתן להציב תנאים שונים לטעינת תוכן או לפעולות באתר, לפי התכנים הספציפיים לכל סוג דפדפן.
- Location: במידה ונרצה להפנות את הלקוח לכתובת אחרת, ניתן להשתמש ב-header בשם "Location" בתגובה עם קוד מצב 3xx.
- Content-Type: ה-header Content-Type מציין את סוג המידע שנשלח בגוף הבקשה או התגובה, כמו טקסט, תמונות, או וידאו. זה מסייע לדפדפנים להבין כיצד להציג את התוכן המקושר.
החשיבות של אבטחת ה-HTTP Headers:
- זיהוי ומניעת התקפות: נכון הגדרות ב-HTTP Headers יכולות למנוע התקפות כמו חסימת קריצת ערך (Cross-Site Scripting, XSS) וגניבת זהות (Cross-Site Request Forgery, CSRF), הניצחו בפופולריותם בפלטפורמות הרשת.
- הגנה מהפרטיות והצפנת מידע: הגדרות ב-HTTP Headers כמו ניהול של ספריות מטמון והחלפת ה-HTTP ל-HTTPS יכולות להגן על המידע הרגיש הנשלח בין הלקוח לשרת מפני גניבה או גילוי.
- תקשורת בטוחה: בצורה כמו הגדרת Strict-Transport-Security, ניתן לוודא שהגולשים מתקשרים עם השרת באמצעות חיבור מאובטח (SSL/TLS), מונע כך תקשורת מותקפת ופרטים הנשלחים לא יוכלו להיגנב.
בדיקות אבטחה של HTTP Headers
בדיקת אבטחה של Headers מתבצעת בעזרת כלים השונים. אחת מהכלים הנפוצים היא Mozilla Observatory, שמספקת דירוג והמלצות לשיפור בכל הנוגע לאבטחת האתר. הכלי השני שנתשתמש בו הינו אתר Security Headers שבודק את האבטחה ומדרג את התוצאות.
נקודת מוצא – תוצאות
Content Security Policy (CSP)
הרעיון המרכזי של CSP הוא להגביל את המקורות שמהם הדפדפנים יטענו תוכן (כמו תמונות, סקריפטים וסגנונות) באתר. זאת משמעה שאם אתר מציין CSP מסוים, הדפדפן יסרב לטעון תוכן ממקורות שאינם מוגדרים במדיניות זו. זה יכול להפחית את הסיכון לפריצה דרך תוכן מזויף, כמו סקריפטים זדוניים שניתן להטמיע באתר.
פרטי המדיניות מגוונים וניתנים להתאמה אישית לפי צרכי האתר. ניתן להגדיר כללים ברורים להגבלת טעינה של משאבים השונים. בין הייתרונות היא הקטנת הסיכון לפריצה או תקיפות סייבר ופישינג, ושיפור בביצועי האתר על ידי מניעת טעינה של תוכן מיותר.
במילים אחרות ניתן להגביל את הטעינה של משאבים רק ממקומות מורשים ורק ע״י הגבלת צורת קוד מורשה. למשל להגדיר דומיינים ספציפיים שמהם ניתן לטעון את המשאבים או הגבלה של eval בתוך הJavaScript שרוב בשימוש של הצפנ קוד.
הגדרת CSP היה תהליך הכי מאתר בכל ההגדרות, בגלל שאתר מתבסס על סקריפטים חיצוניים או קוד שהוא inline. והגדרה של source ברירת מחדש default-src 'self'
היפילה את האתר ברמת התמונות ואינטאקטיביות.
התחלתי להגדיר את המדיניות הפרטית שלי, שמתאימה לאתר שלי באופן מלא על בסיס ההגדרות שמצאת בMDN.
- תמונות (img-src) – רוב התמונות שלי מתבססות על שרת עצמי, למעט כמה שמתבססות על data.
- עיצובים (style-src) – הגדרות יחסית פשוטות, עיצובים נטענים בעיקר בקובץ css או כחלק מHTML.
- סקריפטים (script-src) – כנ״ל, לא מדובר במשהו מורכב ומתבצע באותם שורות, קוד אינליין וקבצים על אותה הכתובת של האתר.
סיימתי עם זה ועברתי את הבדיקה של CSP בהצלחה. אבל אז גיליתי שחצי מאתר שוב לא עובד ובקונסול יש מלא שגיאות הקשורות לגוגל כמו פונטים, אנליטיקס שמגיע מתג מנגר וכו…
לאחר הרבה מאוד בדיקות, חפירות והתעסקות עם האיתור של כל הדומיינים שבאים לידי ביטוי בכלים השונים של גוגל קיבלתי את הקוד הסופי
יש לשים לב להגדרות CSP בקפידה, כי כל דבר יכול לשבש את פעילות האתר או תצוגה של תוכן ברמות שונות. אני התמודדתי עם Font Face, Tag Manager ועוד כמה דברים קטנים, לכל משאב פנימי וחיצוני צריך להגדיר את ההגדרות הקטנות. לדוגמה הטמעה של וידאו, טעינה של וידאו מיוטיוב וכו…
X-Content-Type-Options
כתיבת HTML בעיקרה מתבססת על כתיבה של קוד באותו מסמך, אך אנחנו טוענים קבצים חיצוניים במידת הצורך, אלה בעיקר קבצי CSS וקבצי JS. תגית HTML לטעינה חיצונית מחייבת הגדרת סוג תוכן.
דפדפנים חדשים מספיק חכמים כדי לנתח ולאבד קבצים ולשייך אוטומטית את הסוג של קובץ, אך זה פתח לצרות, לכן עדיף להגדיר את זה בצורה הנכונה תוך כדי הפיתוח ולסגור את הנשוא בהגדרה של X-Contnent-Type-Options.
X-Frame-Options
שימוש ב-X-Frame-Options נכון יכול להגן על האתר מפריצות Clickjacking ולמנוע חשיפה לתכנים מזיקים או פרטיים דרך מסגרות או iFrames שנשלטו על ידי אתרים מזוייפים או רעות.
קיימות שתי אפשרויות: חסימה מלאה, או חסימה חלקית שמאפשרת להציג רק באתר עצמו.
Strict-Transport-Security (HSTS)
יצירת תקשורת מאובטחת ומוצפנת בין הדפדפן לשרת והגבלה לHTTPS בלבד. HSTS מונע גניבה מידה או שימוש בנתונים במהלך התקשורת בין דפדפן לשרת. אינו מאפשר לצד שלישי לקבל גישה לנתונים השונים ומגביל את אפשרות פריצה או חדירה. מונע ממשתמשים לגשת לHTTP ומסרב לקבל בקשות מסוג כלשהו.
הגדרות מכילות פרק זמן בשניות שבו ישנה חסימה, האם זה חל על תת-דומיינים, והמאצות שלו ברשימות לבנות.
Referrer Policy
באתרים השונים משתמשים בקישורים חיצוניים ומעבירים גולשים לצד שלישי. מדיניות הפניות מגדירה לדפדפן איך להעביר מידע על האתר המקורי (referrer) בזמן שהגולש עובר לאתר צד שלישי. הסיבה העיקרית לשימוש בו היא הגנה על פרטיות המשתמשים והניסיון למנוע חשיפת מידע רגיש.
ישנו מגוון רחב של אתפשרויות: החל מלהעביר את הכול ועד לא להעביר כלום. אני בחרתי חסימה רק למעבר של HTTP.
Permissions Policy
מדיניות גישה לAPI מובנה בדפדפן, גישה לשירותים השונים של המכשיר ממנו גולשים. בד״כ לדפדפן יש גישה למיקום, מצלמה, מיקרופון ועוד דברים רבים. על מנת לשמור על אבטחה רצוי לחסום את כל הגדרות שאינם בשימוש באתר או להגדיר בצורה נכונה.
X-XSS-Protection
הגנה על הדפדפן של המשתמש מהתקפות חריגות מסוג "Cross-Site Scripting" (XSS). התקפות XSS הן סוג של התקפות אבטחה שבהן פוגעים באתר על ידי הטמעת קוד זר בקלט שנשלח מהמשתמש, וכאשר הקוד הזר נכנס לאתר ומוצג למשתמש כחלק מהתוכן, ומאפשר לפוגעים לגשת לנתונים רגישים או לבצע פעולות לא רצויות בשם המשתמש.
תוצאות סופיות
לאחר סיום כל האופטימיזציה, הגעתי לתוצאות טובות ועברתי את כל הבדיקות למעט CSP במוזילה. הבעיה המרכזית מבחינת אבטחה שלהם כל משאבים שמשפיעים על האתר צריכים להיות בקבצים החיצוניים (ללא inline code) אז ההורידו לי 20 נקודות על זה.
קוד סופי
קוד מלא htaccess
קוד מלא ngnix
קוד לוורדרפס
סיכום ומסכנות
ללא ספק נושא של אבטחה תמיד מצריך שיפור ותחזוקה תמידית, יחד עם את זאת לא כל הדרישות של אבטחה ניתנות ליישום באתרים תדמיתיים שלא מחזיקים מידע נוסף אתר על משתמשים. בדיקות של Observatory פסלו את כל הטיפול בקאשינג של LiteSpeed ואת הדחיסה של CSS, מבחינת הכלי, כל inline code הוא פתח לפריצה. זה מתנגד לטפיסה של טעינת Critical CSS.
תפקידנו להחליט מה עדיף, פסילה של כלי אבטחה (בדברים מינוריים) או פסילה של זמני טעינה.
יש לא מעט פלאגינים שאחראים על ביצוע הגנה על headers, אני העדפתי לכתוב את זה ישירות לתוך הhtaccess או בעזרת פונקציה של php במקרה של וורדרפס.
כל אחד מוזמן להציע פתרונות נוספים בתגובות