מנע סקריפטים חוצי אתרים (XSS) באתחול אביב עם מדיניות אבטחת תוכן (CSPs)

מבוא

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

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

במדריך הקצר הזה, נסקור מה זה Scripting Cross-Site (XSS), כיצד מישהו יכול לבצע את ההתקפה הזו על האפליקציה שלך, וכיצד תוכל למנוע זאת בקלות עם Spring Boot.

מהו סקריפטים חוצי אתרים (XSS)?

Cross-Site Scripting הוא ניצול ידוע, נפוץ, שבו שחקן גרוע מחדיר תסריט ליישום אינטרנט.

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

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

רב אתרי אינטרנט רגישים להתקפות Cross-Site Scripting, והיא נותרה מתקפה נפוצה כיום, למרות שסוג זה של ניצול ידוע מאז שנות ה-90.

מניעת XSS ביישום Spring Boot עם מדיניות אבטחת תוכן (CSP)

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

כברירת מחדל, Spring Boot מיישמת מספר כותרות אבטחה:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

X-XSS-Protection כלולה כברירת מחדל! כותרת אבטחה זו מנסה לאתר XSS מנסה וחוסם אותם. עם זאת, זהו אינו תהליך חסין כשל, ולדפדפנים יש יישומים שונים של גלאים. לדפדפנים מסוימים, כמו Chrome, יש אפילו הסיר את ה-XSS Auditor שלהם. בנוסף, הזיהוי האוטומטי פועל עבור התקפות XSS משתקפות, בעוד שקיימים גם סוגים אחרים של התקפות.

אלטרנטיבה מודרנית יותר ל-X-XSS-Protection היא מדיניות תוכן-אבטחה (CSP), העוסקים בעיקר במדיניות שלפיהן ניתן לטעון משאבים, מאילו מקורות ובאילו נקודות קצה. נכון לשנת 2022, CSP הוא אמצעי המניעה הטוב ביותר נגד XSS, Clickjacking וסוגים אחרים של התקפות. לא כל הדפדפנים מיישמים CSP, וזו הסיבה שהוא לא כלול בכותרות האבטחה כברירת מחדל.

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

ב-Spring Boot - כדי להגדיר אמצעי אבטחת אינטרנט מותאמים אישית, בדרך כלל תרחיב את WebSecurityConfigurerAdapter מחלקה, ודרוס את configure() שיטה:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("csp-directives");
    }
}

כאשר הנחיות מדיניות אבטחת התוכן (מסופקות כ ;-מחרוזת מופרדת) תלויים במקרה השימוש שלך ובאילו מקורות אתה רוצה לסמוך:

Content-Security Policy: directive1; directive2; directive3; ... directiveN;

לדוגמה, יישום אינטרנט יכול לרשום אתרים מהימנים שמהם ניתן לטעון סקריפטים עם:

script-src https://trusted.com;

או שאתה יכול לדלג על אמון בכל אתר של צד שלישי:

script-src self;

באופן דומה, אפליקציה יכולה לסמוך על תוספים:

object-src https://trusted.com

יש מגוון רחב של הנחיות שאתה יכול לספק, כולל:

  • default-src – ברירת מחדל לחזרה
  • child-src – מקורות עובדי אינטרנט חוקיים
  • frame-src – מקורות תקפים עבור ים ו s
  • img-src - מקורות תקפים לתמונות
  • media-src – מקורות תקפים עבור , ו תיוגים
  • script-src - מקורות סקריפט חוקיים (עוזר למנוע XSS)
  • style-src – מקורות תקפים עבור אלמנטים
  • base-uri – מגביל משאבים הנגישים מה- אלמנט
  • frame-ancestors – הורים תקפים של , , וכו' אלמנטים
  • וכו '

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

לדוגמה, הנה קבוצה בטוחה של הנחיות מדיניות:

script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
report-uri https://csp.example.com;

בואו נוסיף את אלה לאפליקציית Spring Boot שלנו:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:; object-src 'none'; base-uri 'none'; require-trusted-types-for 'script'; report-uri https://csp.example.com;");
    }
}

אתה יכול להשתמש ב CSP-Evaluator כדי להעריך אם הנחיות ה-CSP שלך תקפות ו בטוח, והוא יציין אילו הנחיות ניתנות לניצול בקלות. להלן הנחיית CSP המאפשרת ממשקי API של Google:

default-src 'self';
object-src 'none';
frame-src 'self' data:; 
script-src 'self' 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' https://storage.googleapis.com; 
style-src 'self' 'unsafe-inline'; 
img-src 'self' data:; 
font-src 'self' data:;
base-uri 'self'

סיכום

במדריך הקצר הזה, בדקנו מה זה Scripting Cross-Site (XSS), וכיצד זה עובד ברמה הוליסטית. לאחר מכן, בדקנו כמה אמצעי מניעה של XSS שניתן ליישם בקלות עם Spring Boot כדי להפוך את היישומים שלך לבטוחים, והגדרנו מדיניות תוכן-אבטחה (CSP).

לבסוף, בדקנו את הנחיות ה-CSP והסתכלנו על כמה מדיניות בטוחה שונה.

בול זמן:

עוד מ Stackabuse