⚡
14-Day Mastery Roadmap

SECURE BY DESIGN DAY 01

เริ่มทำควิซ ⚡
Part 1: Introduction | Chapter 1

Why Design Matters for Security

Kickoff Milestone 🚀 Day 01
📌 TITLE ANCHOR QUESTION ทำไมบทนี้ถึงชื่อนี้?

ทำไมการออกแบบจึงสำคัญต่อความปลอดภัย? บทนี้ตั้งคำถามเพื่อกระตุกกระบวนทัศน์ดั้งเดิมว่า "เหตุใดเราจึงควรหยุดพยายามเขียนโค้ดไล่จับแฮกเกอร์ แต่หันมาตั้งหน้าตั้งตาออกแบบระบบให้ดีแทน?"

คำตอบจากบทนี้: แนวทางดั้งเดิมที่เน้นการเพิ่ม "ฟังก์ชันดักจับไวรัส/สคริปต์" มักล้มเหลวเพราะไม่มีใครคาดเดาภัยคุกคามในอนาคตได้ทั้งหมด แต่เมื่อเรา ขับเคลื่อนความปลอดภัยด้วยการออกแบบโมเดลโดเมนที่แม่นยำ ตัวโครงสร้างการออกแบบนั่นเองที่จะเป็นเกราะกำบัง และตัดช่องโหว่ออกไปตั้งแต่วินาทีแรกที่สร้างวัตถุ โดยไม่ต้องเขียนโค้ด Security เพิ่มเติมเลยแม้แต่บรรทัดเดียว!

จุดเริ่มต้น (Recap)

นี่คือจุดเริ่มต้นวันแรกของการเดินทาง 14 วัน บนเส้นทางสถาปัตยกรรมความปลอดภัยที่แท้จริง

ตำแหน่งปัจจุบัน (Where We Are)

Day 1 จาก 14 วัน — เข้าสู่ Part 1: Introduction บทที่ 1 วางรากฐานและปรับ Mindset

เป้าหมายประจำวัน (Core Mission)

รื้อถอนความคิดว่าความปลอดภัยคือภาระ มาเข้าใจว่า Security คือผลพลอยได้ธรรมชาติของการออกแบบที่ดี

02

เรื่องราวและมโนทัศน์เชิงลึก (Analogies & Narrative Scenarios)

🏦 SCENARIO 2.1 • คดีปล้นธนาคาร ÖST-GÖTHA BANK (ค.ศ. 1854) Feature vs Concern

📖 เรื่องราวจริงในประวัติศาสตร์

ย้อนกลับไปในประเทศสวีเดน ปี ค.ศ. 1854 ธนาคาร Öst-Götha Bank ต้องการสร้างความมั่นใจสูงสุดให้แก่ลูกค้าในการจัดเก็บทรัพย์สิน จึงสั่งทำ "แม่กุญแจตู้นิรภัยรุ่นพิเศษ" ที่ซับซ้อน สะเดาะยากที่สุด และผลิตด้วยเทคโนโลยีชั้นสูงในยุคนั้น

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

🧠 ถอดรหัสสู่โลกซอฟต์แวร์ (Mental Model)

🔐 Security Feature: คือแม่กุญแจราคาสูง เช่น การเพิ่มหน้า Login, ไลบรารีเข้ารหัส หรือการเขียนสคริปต์ตรวจ XSS
🎯 Security Concern: คือเป้าหมายทางธุรกิจจริง "รับประกันว่าไม่มีช่องทางใดที่โจรจะนำเงินออกไปได้" (รวมถึงบานพับประตูและตัวอาคาร)
⚡ Cross-cutting Concern: ความปลอดภัยไม่ใช่โมดูลที่ซื้อมาเสียบแล้วจบ แต่แทรกซึมตัดผ่านทุก Execution Paths หากหลุดเพียงเส้นทางเดียว ข้อกังวลนั้นจะพังทลายทันที
CIA-T TRIAD • กรอบจัดหมวดหมู่ SECURITY CONCERNS
C - Confidentiality รักษาความลับ เปิดเผยแก่ผู้มีสิทธิ์เท่านั้น
I - Integrity ความถูกต้องสมบูรณ์ ห้ามถูกแก้ไขอย่างผิดกฎ
A - Availability ความพร้อมใช้งาน ตอบสนองทันท่วงที
T - Traceability ตรวจสอบย้อนกลับได้ ว่าใครทำอะไร เมื่อใด
💻 SCENARIO 2.2 • USERNAME กับภัยคุกคาม XSS (TRADITIONAL VS. SECURE BY DESIGN) Domain Invariants
❌ แนวทางดั้งเดิม (Traditional Approach)

เมื่อเจอปัญหา <script>alert(42);</script> ใน Username นักพัฒนาจะเขียน validateForXSS(username) เพื่อไล่ลบคำอันตรายออก ซึ่งมักล้มเหลวเพราะ:

  • Explicit Security Focus: Security มักแพ้เรื่อง Deadline เสมอ
  • Everyone must be an expert: คาดหวังให้โปรแกรมเมอร์ทุกคนต้องรู้ทันทุกช่องโหว่
  • The Unknowable Threats: ป้องกันการโจมตีรูปแบบใหม่ที่ยังไม่เคยพบไม่ได้
🛡️ ขับเคลื่อนด้วยการออกแบบ (Secure by Design)

แทนที่จะถามว่าจะดักจับ XSS อย่างไร เราเปลี่ยนไปถาม Domain Expert ว่า: "ในบริบทธุรกิจเรา Username ที่ถูกต้องคืออะไร?"

[A-Za-z0-9_-] ความยาว 4-40 ตัวอักษรเท่านั้น

เมื่อสร้างคลาส Username ที่คุมกฎนี้ สคริปต์ <script> จะถูกปฏิเสธทันทีตั้งแต่ตอนสร้างวัตถุ โดยที่ไม่ต้องเขียนโค้ดตรวจ XSS เลย!

💣 SCENARIO 2.3 • XML และภัยคุกคาม BILLION LAUGHS ATTACK (DEFENSE-IN-DEPTH) 3-Layer Shield

Billion Laughs Attack: การโจมตีด้วย XML Internal Entities นิยามซ้อนกันซ้ำๆ: lol9 ขยายเป็น 10 lol8 ➔ ขยายเป็น 1,000,000,000 (หนึ่งพันล้าน) lol ทำให้ไฟล์ขนาด < 1 KB พองตัวล้นแรมหลาย Gigabytes จนระบบล่ม (DoS)

Layer 1: รั้วบ้าน Parser Configuration

ปิดการใช้งาน DTD (Doctype Declaration) และ External Entities บน XML Parser

Layer 2: กลอนประตู Lexical Content Scan

สแกนหาคำว่า <!ENTITY ในสตรีม Token สั้นๆ หากพบให้ตัดทิ้งทันทีก่อนเริ่ม Heavy Parsing

Layer 3: สุนัขเฝ้าบ้าน Operational Constraints

จำกัดทรัพยากรระดับ Operation เช่น ตั้ง Timeout และจำกัด RAM ไม่เกิน 50MB

03

แบบฝึกหัดปฏิบัติตามสถานการณ์จริง (Hands-on Refactoring)

Before: Traditional String & Filter เปราะบางต่อ Zero-day
// โค้ดเดิม: ใช้ String รับ Username และไล่ตรวจจับ XSS
public class User {
    private final Long id;
    private final String username;

    public User(Long id, String username) {
        notNull(id);
        notNull(username);
        // เสี่ยงต่อภัยคุกคามรูปแบบใหม่ที่ไม่รู้จัก!
        this.id = id;
        this.username = ValidationUtils
            .validateForXSS(username);
    }
}
⚠️ จุดอ่อน: หากแฮกเกอร์ใช้เทคนิค XSS ใหม่ๆ ที่ ValidationUtils ไม่รู้จัก สคริปต์อันตรายจะเล็ดลอดเข้าไปในระบบทันที
After: Secure by Design (Domain Primitive) Valid on Creation 100%
// โค้ดใหม่: แยก Username เป็น Domain Primitive
public final class Username {
    private final String value;

    public Username(String raw) {
        notNull(raw, "Username cannot be null");
        final String trimmed = raw.trim();
        inclusiveBetween(4, 40, trimmed.length(), 
            "Length must be 4-40 chars");
        matchesPattern(trimmed, "^[A-Za-z0-9_-]+$", 
            "Only alphanumeric, _ and - allowed");
        this.value = trimmed;
    }
    public String value() { return value; }
}

public class User {
    private final Long id;
    private final Username username; // รับประกันว่า Valid เสมอ
    public User(Long id, Username username) {
        this.id = notNull(id);
        this.username = notNull(username);
    }
}
🛡️ จุดเปลี่ยนสำคัญ: คลาส User สะอาดขึ้น ไม่ต้องพึ่งพา ValidationUtils และสคริปต์อย่าง <script> ถูกบล็อกทิ้งตั้งแต่ขั้นตอนสร้างอ็อบเจกต์โดยอัตโนมัติ
04

ชุดควิซประเมินความรู้ประจำวัน

ตอบปุ๊บ รู้ผลเฉลยทันที พร้อมคำอธิบายและเกจสะสมพลังงาน Energy Charge

Energy Charge
0 / 10
📌 CLOSING TITLE CONNECTION WRAP-UP สรุปหมุดเชื่อมโยงกลับหาหัวข้อบท

สรุปการเชื่อมโยงกลับสู่ Chapter 1 — Why design matters for security

เรื่องราวของแม่กุญแจ Öst-Götha Bank, การสร้างคลาส Username Domain Primitive, และการรับมือ Billion Laughs XML ในวันนี้ ล้วนพิสูจน์ให้เห็นอย่างชัดเจนว่า "ทำไมการออกแบบจึงสำคัญต่อความปลอดภัย" เพราะการวิ่งไล่แก้ช่องโหว่ความปลอดภัยทีหลังเปรียบเหมือนการตามเปลี่ยนแม่กุญแจโดยปล่อยให้บานพับประตูหลวม แต่ถ้าเรา ออกแบบโดเมนให้แม่นยำตั้งแต่วินาทีแรก (Driven Security through Design) โครงสร้างของโค้ดนั่นเองที่จะตัดภัยคุกคามออกไปและสร้างความปลอดภัยให้แก่ระบบอย่างยั่งยืนครับ!

พร้อมก้าวสู่ขั้นตอนต่อไปแล้วหรือยัง? Next: Day 2 — Intermission: The Anti-Hamlet (กรณีศึกษาคำสั่งซื้อติดลบ) ➔