אחד מדרגות הפגיעות הנפוצות ביותר באתרי אינטרנט נקרא "Cross-Site Scripting" או "XSS". פגיעויות XSS הן המקום שבו משתמש יכול לגרום ל-JavaScript להתבצע. ישנן מספר גרסאות שונות של פגיעות XSS, בדרגות חומרה שונות.
הבעיה של תוקף שיכול להפעיל JavaScript בפגישות של משתמשים אחרים היא שלאחר מכן ניתן לתוקף לעשות כל דבר לאתר שהקורבנות רואים. זה כולל הפניית קורבנות לאתרים חיצוניים, גניבת אסימוני אימות ומעקב אחר פרטי תשלום.
הצורה החמורה ביותר של פגיעות XSS היא סקריפטים חוצי אתרים "מאוחסנים" או "מתמשכים", זה המקום שבו זה אפשרי עבור תוקף ליצור מטען XSS ולאחר מכן לשלוח אותו, כך שהוא נשמר במסד הנתונים. עם ניצול XSS שנשמר במסד הנתונים, אז זה אפשרי שהוא ישפיע על משתמשים אחרים לאורך פרק זמן רחב.
צורה נוספת של Scripting Cross-Site היא "Reflected", סוג זה לא נשמר בשום שלב, במקום זאת, המטען כלול בדפדפן. בדרך כלל, סוג זה של XSS הוא חלק מהתקפות פישינג, שבהן תוקף מנסה להערים על קורבן ללחוץ על קישור זדוני.
בדרך כלל, לרוב מתקפות XSS יש את המטען שנשלח לשרת בשלב מסוים, אבל חלק מהתקפות כן צד הלקוח בלבד, לעולם לא נשלח לשרת ובמקום זאת משפיע רק על צד הלקוח JavaScript. זה נקרא XSS מבוסס DOM כפי שהוא נשאר במודל JavaScript Document Object Model, או DOM. סוג זה של פגיעות קשה במיוחד לזהות ולפתור מכיוון שהניצול לעולם לא נראה על ידי השרת ולכן לא ניתן לרשום אותם.
מבחינה היסטורית, טכניקת המניעה מפני פגיעויות XSS היא לסנן את כל הנתונים שנשלחו על ידי המשתמש, תוך שימוש ברשימות חסימה כדי לדחות הודעות עם תווים או מילים משמעותיות ב-JavaScript. זה נוטה להוביל למירוץ חימוש של מציאת מעקפים למסנן, תוך מניעת הגשות לגיטימיות של משתמשים. הפתרון הנכון הוא להשתמש בישויות HTML כדי לקודד נתונים שנשלחו על ידי המשתמש. כאשר מודולי ישויות HTML מופעלים, התווים מקודדים אוטומטית לפורמט שבו הדפדפן יודע להציג אותם כסמלים הנכונים אך לא להתייחס אליהם כאל קוד.