מבוא ל- Cross-Site Scripting (XSS) ו- JavaScript Defenses

תסריטים באתר Cross-site (XSS) הוא אחד פרצות האבטחה הנפוצות ביותר באינטרנט, דירוג עקבי ב- OWASP Top 10.A XSS התקפה מאפשר תוקף להזריק תסריטים זדוניים של הלקוח לתוך דפי אינטרנט שנצפו על ידי משתמשים אחרים.תסריטים אלה יכולים לגנוב אסימונים ישיבה, הפניית משתמשים ל-phishing אתרים, דפי דה פניות, או להתקין קוד זדוני בעוד ש-Sice-Sing Server-S, הוא משימה קריטית, למנוע את הפונקציה הקריטית של Skype, כדי לזהות את ה-JavaScriptaming זה, כדי להגן על גבי ה-JavaScripticedicedice-S.SS, כדי להגן על גבי קובץ קריטי על גבי ה-JavaScriptice-S.

הבנת שלושת סוגי ה- XSS

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

חנות XSS

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

עקבו אחרי XSS

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

DOM-based XSS

XSS מבוסס DOM הוא פגיעת לקוח בלבד.ההתקפה מקנה את סביבת ה-DOM בדפדפן של הקורבן.הקוד הזדוני לעולם אינו נוגע לשרת; הוא מקורו מ- JavaScript בצד הלקוח אשר מטפל באופן לא בטוח בקלט של משתמשים (למשל, קריאה מ-FLT:0,FLT:1, או FLT2).

התקפות XSS עם JavaScript

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

המונחים: Sanitization

תמיד לאמת ולהעריך את הקלטים של המשתמשים בצד הלקוח לפני עיבוד.שימוש ב-FLT:3 במקום LT:4 כדי למנוע ביצוע תסריט.התפקיד הבא מדביק דמויות מסוכנות ממחרוזת:

function sanitizeInput(input) {
 const div = document.createElement('div');
 div.textContent = input;
 return div.innerHTML;
}

זה עובד כי הגדרת ההרחבה 6 אינה מפרה תגי HTML; היא מתייחסת לכל דבר כטקסט רגיל.ה-FLT 7 (התוצאה היא גירסאות נמלטות של כל דמות מיוחדת ב-HTML (למשל, FLT:8, FLT:9, FLT:9, ).

עקבו אחרי DOM Mutations for Suspicious Elements

תוקפים לעתים קרובות מזריקים את תגי או מטפלים באירוע (ראהים: 12:12), לתוך DOM.שימוש ב-APIFLT:14, אתה יכול לצפות עבור שילובים בלתי צפויים.

const observer = new MutationObserver((mutations) => {
 mutations.forEach((mutation) => {
 mutation.addedNodes.forEach((node) => {
 if (node.nodeType === 1) { // element node
 if (node.tagName === 'SCRIPT') {
 console.warn('Potential XSS: a script element was injected via DOM.');
 node.remove(); // or log and analyze
 }
 // Check for dangerous attributes
 if (node.hasAttribute('onerror') || node.hasAttribute('onload')) {
 console.warn('Suspicious event handler attribute detected.');
 }
 }
 });
 });
});
observer.observe(document.body, { childList: true, subtree: true });

(ב) ⁇ :0) ⁇ :0(Caution:FLT:1) חסימות תסריטים באמצעות FPLT:16 ניתן לעקוף על ידי תוקפים חכמים ועשויה לשבור פונקציונליות לגיטימית.

אימות כתובת URL ו-Hash Parameters

עבור XSS מבוסס DOM, קרא רכיבי כתובת URL בבטחה באמצעות FLT:17 ולהימנע מכניסה ישירות ערכים ל- HTML. Detect מנסה להעביר קוד מתואם:

const params = new URLSearchParams(window.location.search);
const userParam = params.get('name');
if (userParam && /[<>"'\/]/.test(userParam)) {
 console.warn('Potential XSS in parameter: ' + userParam);
 // Do not use this value in the DOM without encoding
}

מניעת התקפות XSS עם JavaScript

מניעת דורשת גישה רב שכבתית בלבד, JavaScript לבדה לא יכולה להבטיח יישום מלא, אך בשילוב עם סנקציות חוזרות ואימות נאותות (FLT:0Content Security Policy) ReductionFLT:1, היא מפחיתה באופן דרמטי את הסיכון.

קוד כל הנתונים של המשתמש לפני הכנס לתוך DOM

כלל הזהב: לעולם אל תכניס נתונים לא בוטחים ישירות לתוך DOM. השתמש בשיטות DOM בטוחות במקום HTML פנימי.

(ב) , (ב) ,(ב) ,

const userInput = getUserInput();
const safeText = document.createTextNode(userInput);
document.getElementById('output').appendChild(safeText);

כאשר אתה צריך להשתמש ב- 22, ספרתי

אם אתה צריך לעשות HTML (למשל, מעורך טקסט עשיר), לסמוך על ספריית סניטריזציה אמינה כמו FLT:0DOMPurify (FLT:1 DOMPurify) הוא ספריית שימוש נרחב, עדות קרבית כי מסיר קוד זדוני תוך שמירה על HTML בטוח.

// Example with DOMPurify (install via npm or CDN)
const dirty = '<img src=x onerror="alert(1)">';
const clean = DOMPurify.sanitize(dirty);
document.getElementById('content').innerHTML = clean;

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

להימנע מתפקודי JavaScript מסוכנים

כמה שיטות ונכסים של JavaScript ידועים לשמצה על מנת לאפשר XSS להימנע או לשלוט לחלוטין:

  • (ב) ויקרא י"ד: "אֱמֶת נָא עַמֶר נָא" (בראשית כ"ד, כ"ד).
  • (ב) ויקרא י"א: "וַיָּבְהִיא הוּא הוּא הוּא הוּא הוּא הוּא הוּא" (בראשית כ"ד, ט).
  • (ב) ויקרא יא"ד: "לא נעשה שימוש בתוכן" (שם כ"ד).
  • (ב) ניתן לנצל את ה[[המאה ה-20]], אם יש צורך ב[[המאה ה-20]].
  • (ב) ,0) ,(ב) ,(ב) ,ב) , (ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) ויקרא י"ד: "ה' ויקרא י'" (בראשית כ"ד, ט).

יישום מדיניות אבטחת תוכן (CSP) באמצעות JavaScript?

CSP הוא מנגנון דפדפן המגביל את התסריטים יכול לרוץ.זה בדרך כלל מוגדר באמצעות ראשי HTTP, אבל אתה יכול גם להגדיר אותו באמצעות תג FLT:34 או באמצעות JavaScript על ידי יצירת באופן דינמי אלמנט FLT:35 עם זאת, הגדרת CSP ב JavaScript הוא פחות בטוח כי תוקף שכבר יש כמה שליטה יכול להיות בלתי אפשרי.

const meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
meta.content = "default-src 'self'; script-src 'self' 'unsafe-inline'"; // Be very careful with 'unsafe-inline'
document.head.appendChild(meta);

לצורך ייצור, הגדרת CSP בשרת האינטרנט שלך או ה- Proxy הפוך:0 MDN CSP DocumentsFLT:1 מספקת הדרכה מקיפה.

אמצעי אבטחה נוספים

מעבר לטקטיקות ספציפיות של JavaScript, אסטרטגיית מניעת XSS כוללת את האמצעים הקריטיים הללו:

  • (FLT:0) תמיד לאמת בצד השרת.FLT:1) אימות בצד הלקוח ניתן לעקוף.
  • (ב) ויקרא י"א: "וַיָּבְתָּבְתָּבְתָּבְתָּבָר" (בראשית כ"ד, ט).
  • (FLT:0Output קודקוד בכל פעם שאתה הופך את נתוני המשתמש.BuildFLT) 1 קונטקסט נושאים: קוד עבור ישויות HTML, כתובת URL ⁇ , JavaScript מחרוזת ⁇ וכו '.
  • (FLT:0) לשמור על התלויות מעודכנים.FLT:1 Vulnerable JavaScript (למשל, גרסאות ישנות יותר של JQuery) הם וקטור XSS נפוץ. השתמש ב- npm או כלים דומים.
  • (ב) ,0) ,Use מסגרות עם הגנה מבוססת XSS.FLT (התגובה: 1), Angular ו-Vue באופן אוטומטי לברוח מפלט כברירת מחדל, להיות זהירים עם FLT:40 או FLT:41.
  • (ב) ,0) ,התעלל ב-[[1924]] ו[[1924]], [[1924]] ו[[1924]], [[1924]]

דוגמה אמיתית לעולם: תגובה מהירה

שקול מערכת תגובה בלוג שבו משתמשים להגיש הודעות המוצגות לאחרים. תוקף עשוי לנסות להוסיף (FLT:44 ).כאן גישה JavaScript המשלבת עם ה backend:

  1. (ב) ויקרא י"א: "ה' י' י' י' י' י' י' י', ב' ויקרא י' (ב"ב)
  2. (ב) עיין ב-[[1924]] ב[[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]
  3. (ב) ,0) , קלפיד: 1FLT (FLT: 9) השתמש במנוע תבנית בטוח.
function renderComment(comment) {
 const item = document.createElement('div');
 item.className = 'comment';
 const body = document.createElement('p');
 body.textContent = comment.body; // escaped by browser
 item.appendChild(body);
 document.getElementById('comments').appendChild(item);
}

בדיקות ההגנה שלך

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

  • (ב) .
  • (ב) .
  • (ב) .

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

מסקנה

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

(ב) עיין בפרשת ה' (ב"ה) ב'[[1924]] וב[[1924]] וב[[1924]]]] וב[[1924]]]]