ช่องโหว่ประเภทหนึ่งที่พบบ่อยที่สุดในเว็บไซต์เรียกว่า "Cross-Site Scripting" หรือ "XSS" ช่องโหว่ XSS เป็นที่ที่ผู้ใช้สามารถทำให้ JavaScript ทำงาน มีช่องโหว่ XSS หลากหลายรูปแบบ โดยมีระดับความรุนแรงต่างกันไป
ปัญหาที่ผู้โจมตีสามารถเรียกใช้ JavaScript ในเซสชันของผู้ใช้รายอื่นคือ ผู้โจมตีสามารถทำอะไรก็ได้กับเว็บไซต์ที่เหยื่อเห็น ซึ่งรวมถึงการเปลี่ยนเส้นทางเหยื่อไปยังเว็บไซต์ภายนอก การขโมยโทเค็นการตรวจสอบสิทธิ์ และการตรวจสอบรายละเอียดการชำระเงิน
รูปแบบที่ร้ายแรงที่สุดของช่องโหว่ XSS คือ "Stored" หรือ "Persistent" Cross-Site Scripting ซึ่งเป็นที่ที่ผู้โจมตีสามารถสร้างเพย์โหลด XSS และส่งมันได้ ดังนั้นมันจึงถูกบันทึกไว้ในฐานข้อมูล ด้วยการบันทึกช่องโหว่ XSS ในฐานข้อมูล จึงเป็นไปได้ที่มันจะส่งผลกระทบต่อผู้ใช้รายอื่นในช่วงเวลากว้างๆ
อีกรูปแบบหนึ่งของ Cross-Site Scripting คือ “Reflected” ซึ่งประเภทนี้จะไม่ถูกบันทึก ณ จุดใด ๆ แต่เพย์โหลดจะรวมอยู่ในเบราว์เซอร์แทน โดยทั่วไปแล้ว XSS ประเภทนี้เป็นส่วนหนึ่งของการโจมตีแบบฟิชชิ่ง ซึ่งผู้โจมตีพยายามหลอกล่อเหยื่อให้คลิกลิงก์ที่เป็นอันตราย
โดยทั่วไป การโจมตี XSS ส่วนใหญ่จะมีเพย์โหลดที่ส่งไปยังเซิร์ฟเวอร์ในบางจุด แต่การโจมตีบางอย่างเป็นฝั่งไคลเอ็นต์ล้วนๆ ไม่เคยถูกส่งไปยังเซิร์ฟเวอร์ แต่จะส่งผลต่อ JavaScript ฝั่งไคลเอ็นต์เท่านั้น สิ่งนี้เรียกว่า XSS แบบ DOM เนื่องจากอยู่ใน JavaScript Document Object Model หรือ DOM ช่องโหว่ประเภทนี้ยากต่อการระบุและแก้ไขเป็นพิเศษ เนื่องจากเซิร์ฟเวอร์ไม่เคยเห็นช่องโหว่นี้ ดังนั้นจึงไม่สามารถบันทึกได้
ในอดีต เทคนิคการป้องกันช่องโหว่ XSS คือการกรองข้อมูลที่ผู้ใช้ส่งมาทั้งหมด โดยใช้รายการบล็อกเพื่อปฏิเสธข้อความใดๆ ที่มีอักขระหรือคำที่มีความหมายใน JavaScript สิ่งนี้มีแนวโน้มที่จะนำไปสู่การแข่งขันทางอาวุธในการค้นหาบายพาสสำหรับตัวกรองในขณะเดียวกันก็ป้องกันไม่ให้ผู้ใช้ส่งอย่างถูกกฎหมาย วิธีแก้ไขที่ถูกต้องคือการใช้เอนทิตี HTML เพื่อเข้ารหัสข้อมูลที่ผู้ใช้ส่งมา เมื่อเปิดใช้งานโมดูลเอนทิตี HTML อักขระจะถูกเข้ารหัสโดยอัตโนมัติในรูปแบบที่เบราว์เซอร์รู้ว่าจะแสดงอักขระเหล่านี้เป็นสัญลักษณ์ที่ถูกต้องแต่ไม่ถือเป็นรหัส