Table of Contents

แนะนําการเรียกตัวเขียนแบบครอสไซต์ (XSS) และการป้องกันจาวาสคริปต์

การทําสคริปต์แบบครอสไซต์ (XSSS) เป็นตัวแสดงความปลอดภัยแบบเว็บที่แพร่หลายมากที่สุด โดยจัดอันดับให้อยู่ใน OWASP ท็อป 10 เสมอ การโจมตีของ XSS อนุญาตให้ผู้โจมตีสามารถฉีดตัวเข้ารหัสแบบมุ่งร้ายไปยังหน้าเว็บที่ผู้ใช้อื่นดูได้ สคริปต์เหล่านี้สามารถขโมยเครื่องหมายของวาระงาน, เปลี่ยนเส้นทางไปยังเว็บไซต์, defaceing, หรือติดตั้งมัลแวร์ ในขณะที่ service language plainct จะมีบทบาทสําคัญในการป้องกันการก่อการ ร้ายนี้ ซึ่งเป็นการเตรียมการทําการผลิตเพื่อป้องกันโปรแกรมของคุณจาก XS

การ เข้าใจ ภาษา เอก ซ์ สาม ประเภท

ก่อนจะดําน้ําเข้าไปในการป้องกัน จําเป็นต้องเข้าใจ 3 ประเภทหลักของ XSS: เก็บ, สะท้อน, และใช้ DOM แต่ละต้องใช้วิธีการตรวจจับและการป้องกันที่แตกต่างกันเล็กน้อย

จัดเก็บ XSS

เก็บ (Peristent) เกิดขึ้นเมื่อมีการจัดเก็บข้อมูลลับบนเซิร์ฟเวอร์ (เช่น ในฐานข้อมูล, forum Post หรือคําอธิบาย) และให้บริการกับผู้ใช้ในภายหลังโดยไม่มีการให้ค่าชดเชยแต่อย่างใด การโหลดสิ่งอํานวยความสะดวกที่ตั้งไว้ จะเป็นการเรียกใช้งานสําหรับเบราว์เซอร์ของใครก็ตามที่ดูเนื้อหาที่เก็บไว้

สะท้อน XSS

สะท้อน XSS เกิดขึ้นเมื่อสคริปต์ที่มุ่งร้ายถูกสะท้อนออกจากเซิร์ฟเวอร์ โดยปกติจะเป็นผ่านพารามิเตอร์ URL หรือรูปแบบ การส่งข้อมูล ผู้กระทําผิดจะหลอกให้เหยื่อคลิกลิงก์ที่ถูกสร้างมา และรหัสการฉีดจะประมวลผลทันที ไม่เหมือนกับค่า XSS ที่เก็บ, การโหลดจะไม่คงรุ่น

ฟิล์ม XSS แบบ DOM

DOM- Official XSS เป็นโปรแกรมที่มีความเสี่ยงสูงสุดของไคลเอนต์ด้านข้าง ค่าใช้จ่ายที่เรียกใช้งานแบบ OSM ทําหน้าที่เพิ่มข้อมูลสภาพแวดล้อมของ DOM ในเว็บเบราว์เซอร์ของผู้ใช้ โค้ดที่มุ่งร้ายไม่เคยแตะต้องเซิร์ฟเวอร์ จาวาสคริปต์แบบลูกข่าย ซึ่งจัดการการป้อนข้อมูลผู้ใช้อย่างไม่ปลอดภัย (เช่น อ่านจาก [FLT: 0] [FLT: 1] หรือ [FLTT: 2] เป็นต้นมา

ตรวจพบการจู่โจมของ XSS ด้วยจาวาสคริปต์

การตรวจสอบ เกี่ยวข้องกับกิจกรรมที่น่าสงสัยก่อนที่จะเกิดความเสียหาย จาวาสคริปต์สามารถติดตามการป้อนข้อมูลเข้าของผู้ใช้, แทร็ก DOM, และตรวจความถูกต้องของข้อมูล ณ จุดเข้า ในขณะที่การตรวจสอบจากไคลเอนต์ด้านข้างไม่สามารถจับการ โจมตีได้ทั้งหมด (โดยเฉพาะอย่างยิ่ง ถ้าตัวโจมตีที่ต้องการโดยตรงไปยังเซิร์ฟเวอร์) มันจะให้ข้อมูลแรกที่มีประโยชน์กับการป้องกัน

การตรวจสอบความถูกต้องและการซานิตี

การตรวจสอบและลดค่าข้อมูลผู้ใช้งานทางด้านข้างของไคลเอนต์เสมอ ใช้ [FLT: 3] แทน [FLT: 4] เพื่อป้องกันการประมวลผลของสคริปต์ ฟังก์ชันต่อไปนี้จะถอดอักขระอันตรายออกจากสตริง:

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

มันใช้ได้เพราะการตั้งค่า [FLT: 6] ไม่ได้แปลแท็ก HTML; มันใช้ทุกอย่างเป็นข้อความธรรมดา ผลที่ได้ [FLT: 7] มีอักขระพิเศษแบบ HTML ใด ๆ หลบหนี (เช่น [FLT: 8], [FLT: 9], [FLT: ⁇ , [FLLT:10].

ติดตามดูข้อมูลการพึมพําของ DOM สําหรับธาตุที่น่าสงสัย

Aprilers มักจะฉีด [FLT: 11] แท็กหรือตัวจัดการเหตุการณ์ ([FLT: 12]]] [FLT: 13] เข้าที่ DM ใช้ API, คุณสามารถดูองค์ประกอบที่ไม่คาดคิดได้โดยเพิ่มข้อมูล ดูเพิ่มที่:

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 });

[FLT: 0]. การติดตาม: บล็อกสคริปต์ผ่านทาง สามารถข้ามได้โดยผู้โจมตีที่ฉลาดและอาจทําลายระบบติดตามที่ถูกต้อง ใช้นี่เป็นเครื่องมือติดตามแทนกลไกการป้องกันหลัก

ตรวจสอบที่อยู่ URL และพารามิเตอร์ของแฮช

สําหรับ XSS ที่อยู่บนระบบ DOM ให้อ่านส่วนประกอบ URL ได้อย่างปลอดภัย โดยใช้ [FLT: 17] และหลีกเลี่ยงการแทรกค่าโดยตรงไปยัง HTML. ตรวจสอบว่าพยายามป้อนรหัสการประมวลผล:

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 จู่โจมด้วยจาวาสคริปต์

การป้องกันต้องการวิธีหลายแบบ จาวาสคริปต์อย่างเดียว ไม่สามารถรักษาความปลอดภัยโปรแกรมได้อย่างเต็มที่ แต่เมื่อรวมกับการจัดการจัดการจัดการโปรแกรมเบื้องหลังที่เหมาะสม และ[FLT: 0] ข้อกําหนดความปลอดภัย (CPS) (FT: 1) การลดความเสี่ยงอย่างน่าประหลาด

เข้ารหัสข้อมูลการรับส่งข้อมูลทั้งหมดของผู้ใช้ ก่อนแทรกเข้า DOM

กฎทอง: อย่าใส่ข้อมูลที่ยังไม่ได้รับความเชื่อถือเข้าไปใน DOM ใช้วิธีการ DOM อย่างปลอดภัยแทนส่วนใน HTML

ใช้ หรือ [FLT: 20]

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

เมื่อ คุณ ต้อง ใช้ [FLT: 22], จัด ห้อง สมุด ให้ เป็น ที่ ประชุม

หากคุณต้องการแสดงผล HTML (เช่น จากเครื่องมือแก้ไขข้อความแบบอุดม) โดยจะขึ้นอยู่กับไลบรารีการจัดเก็บข้อมูลแบบเต็มที่เชื่อถือได้ เช่น [FLT: 0] FOPPUMPURRED . ดอปเปรูซิชันเป็นไลบรารีที่ใช้อย่างแพร่หลาย, เชื่อมต่อแบบใช้ร่วมกันเพื่อลบรหัสร้ายที่เก็บไว้ขณะรักษา 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;

DomPurific ทํางานได้โดยการจัดวางแท็กและคุณสมบัติอันตราย และผลตอบแทนเฉพาะองค์ประกอบเท่านั้น [FLT: 0]View Dompuerify on Githob.

หลีก เลี่ยง การ ใช้ จาวาสคริปต์ ใน ทาง ที่ เป็น อันตราย

ลูกเล่นและคุณสมบัติของจาวาสคริปต์บางแบบ มีชื่อเสียงจากการเปิดระบบ XSS

  • [FLT: 0][FLT: 24] — ใช้ หรือแบบเรียบเรียงอย่างถูกต้อง
  • [FLT: 0] [FLT: 27][FLT: 27] — กฎเดียวกัน (FLT:1].
  • [FLT: 0][FLT: 28] — ไม่เคยใช้กับผู้ใช้ที่ป้อนข้อมูลเข้ามา
  • [FLT: 0] สามารถใช้ประโยชน์ได้ถ้าค่าใด ๆ ถูกวัดค่า
  • [FLT: 0] / มีรหัสสตริง — หลีก; ใช้ฟังก์ชันอ้างอิงแทน.
  • [FLT: 0] ก่อสร้าง — คล้ายคลึง .

ข้อกําหนดความปลอดภัยในเนื้อหา (CP) ผ่านจาวาสคริปต์หรือไม่? ไม่แนะนําให้ใช้

CPP เป็นกลไกของเบราว์เซอร์ที่จํากัดให้สคริปต์สามารถทํางานได้ โดยปกติจะเป็นการตั้งค่าผ่านทาง headers แต่คุณสามารถตั้งค่ามันได้โดยการใช้ป้าย [FLT: 34] หรือผ่านทางจาวาสคริปต์โดยการสร้างองค์ประกอบ [FT: 35] แบบไม่ตายตัว อย่างไรก็ตาม การตั้งค่า PDF ในจาวาสคริปต์นั้นจะปลอดภัยน้อยลง เนื่องจากตัวโจมตีที่ควบคุมได้อยู่แล้ว จะใช้ส่วนหัว HTTP ได้เสมอ หากคุณต้องการใช้จาวาสคริปต์ในการบังคับ CPPS (เช่น) ให้ทํางานในช่วงต้น ๆ: pril, pril, pril, pril: pril, prilter pril pril, pril, prilter prilter pril, prilter pril, prilter, prilter, pril, pril, pril, pril, pril, pril.

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);

สําหรับการผลิต, การปรับแต่ง CPP ในเว็บไซต์ของคุณ หรือย้อนกลับพร็อกซี [FLT: 0] MDN CPP Magazine ให้คําแนะนําอย่างครอบคลุม

วัดความปลอดภัยเพิ่มเติม

นอกจากกลยุทธ์เฉพาะของจาวาสคริปต์แล้ว กลยุทธ์การป้องกัน XSS ทั้งหมดรวมถึงมาตรการที่สําคัญเหล่านี้ด้วย

  • [FLT: 0] การตรวจสอบตําแหน่งทางฝั่งเซิร์ฟเวอร์เสมอ [[FLT: 1) การตรวจสอบสิทธิ์ลูกค้า-ด้านข้างสามารถข้ามได้ ไม่ต้องไว้วางใจข้อมูลไคลเอนต์
  • [FLT: 0] ใช้ส่วนหัวตอบรับแบบ HTTP ที่เหมาะสม โดยเฉพาะอย่างยิ่ง และโดยเฉพาะ.
  • [FLT: 0] เข้ารหัสทุกครั้งที่คุณเขียนข้อมูลผู้ใช้ [[FLT: 1) บริบทสําคัญ: การเข้ารหัสสําหรับระบบ HTML, การเข้ารหัส URL, การเข้ารหัสอักขระจาวาสคริปต์ เป็นต้น
  • [FLT: 0] โปรดติดตามข้อมูลการขึ้นต่อกันของแพกเกจ ไลบรารีจาวาสคริปต์แบบถอดได้ (เช่น รุ่นเก่าของ j. สืบค้น) เป็นเวกเตอร์ XSS ใช้ npm ตรวจสอบหรือเครื่องมือที่คล้ายกัน
  • [FLT: 0] ใช้เฟรมเวิร์กที่มีการป้องกันแบบ XSS ภายใน [FLT: 1) React, Angular, และ Vue หลบหนีโดยอัตโนมัติ โดยโดยปริยาย แต่ต้องระวังด้วย หรือ.
  • [FLT: 0]. สืบค้น CPS ที่เข้มงวด หลีกเลี่ยง [FLT: ⁇ ถ้าเป็นไปได้ ใช้ Noncs หรือ his for inline spil.

ตัวอย่างโลกจริง: การแสดงผลแบบปลอดภัย

พิจารณาระบบหมายเหตุของบล็อก ที่ผู้ใช้จะส่งจดหมายที่แสดงไปยังผู้อื่น การโจมตีอาจจะพยายามแทรก [FLT: 44] นี่เป็นวิธีแสดงจาวาสคริปต์ที่ผนวกเข้ากับแบ็คเอนต์:

  1. [FLT: 0]. การส่งข้อมูล: การหยุดชั่วคราวโดยใช้ [FLT: 45] ก่อนส่งไปยังเซิร์ฟเวอร์ (แต่เซิร์ฟเวอร์ยังคงต้องส่ง).
  2. [[FLT: 0] server จะส่งข้อมูลกลับมา:[[FLT: 1) แบ็คเอนต์เอกสารควรจะเข้ารหัสข้อความแบบ HTML-en accessent
  3. [FLT: 0] การแปลแบบฉลาด: ใช้ หรือกลไกแม่แบบที่ปลอดภัย อย่าใช้[FLT: 47] กับข้อมูลผู้ใช้ดิบ
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);
}

การ ทดสอบ ความ ปลอด ภัย ของ คุณ

หลังจากใช้การป้องกันแล้ว ให้ทดสอบโปรแกรมของคุณโดยใช้เครื่องสแกนอัตโนมัติ และโหลดด้วยตนเองด้วย

  • [FLT: 50]

ใช้เครื่องมือนักพัฒนาเบราว์เซอร์ เพื่อตรวจสอบ DOM และแน่ใจว่าโหลดค่าธรรมเนียมหลบหนีแล้ว นอกจากนี้ ยังทําการตรวจสอบ CPP เพื่อตรวจสอบการฝ่าฝืนของคอนโซลด้วย

รูปแบบการวน

การทําสคริปต์แบบข้ามสียังคงเป็นภัยคุกคามร้ายแรง แต่จาวาสคริปต์นั้นให้เครื่องมือที่มีประสิทธิภาพทั้งสําหรับการตรวจสอบและป้องกัน การตรวจสอบข้อมูล DOM, การตรวจสอบการเปลี่ยนแปลงของ DOM, การหลบหนี, และการทํางานร่วมกับไลบรารีที่แน่นหนาเช่น DOMPURurererf คุณสามารถช่วยความปลอดภัยของไคลเอนต์ของคุณได้อย่างมาก จําไว้ว่า มาตรการของไคลเอนต์ข้าง ๆ ไม่ใช่ลูกไฟเงิน; พวกมันจะรวมแผนป้องกันการเข้าโจมตีแบบเซิร์ฟเวอร์, CPP, และการตรวจสอบความปลอดภัยตามปกติ ให้อยู่, ทดสอบและรักษาวันที่ของคุณไว้ และต้องรักษาวันที่ของคุณไว้

สําหรับการอ่านเพิ่มเติม สืบค้น [FLT: 0] WHOASS XSSS หน้า และ VOP XSS ป้องกันแผ่นเสียง .