[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-golang-websocket-ddos-protection-all--*":3,"academy-blog-translations-oyj7gdmlu3pfaf3":79},{"data":4,"page":67,"perPage":67,"totalItems":67,"totalPages":67},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":73,"keywords":74,"locale":49,"published_at":75,"scheduled_at":13,"school_blog":71,"short_description":76,"slug":77,"status":69,"title":6,"updated":78,"updated_by":13,"views":72},"EP.87 การเพิ่มฟีเจอร์การป้องกันการโจมตี DDoS ใน WebSocket Server","sclblg987654321","school_blog_translations","\u003Cp>WebSocket Server คือหัวใจสำคัญของแอปพลิเคชันแบบเรียลไทม์ เช่น ระบบแชท, เกมออนไลน์ หรือการแจ้งเตือนทันที แต่เมื่อระบบเปิดให้เชื่อมต่อจากผู้ใช้จำนวนมาก ก็มีความเสี่ยงต่อการถูกโจมตี เช่น:\u003C\u002Fp>\u003Cul>\u003Cli>DDoS (Distributed Denial-of-Service)\u003C\u002Fli>\u003Cli>Connection Flood\u003C\u002Fli>\u003Cli>Malformed Frame Attack\u003C\u002Fli>\u003C\u002Ful>\u003Cp>บทความนี้จะพาคุณเรียนรู้ เทคนิคการป้องกัน WebSocket Server ให้แข็งแกร่งและพร้อมสำหรับใช้งานจริงใน production 🌐\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>☠️ ประเภทของการโจมตีที่พบบ่อยใน WebSocket\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>ประเภทการโจมตี\u003C\u002Fth>\u003Cth>คำอธิบาย\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>DDoS (Distributed Denial-of-Service)\u003C\u002Ftd>\u003Ctd>การส่งคำขอจำนวนมากจากหลายแหล่งพร้อมกัน เพื่อทำให้เซิร์ฟเวอร์ล่ม\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Connection Flood\u003C\u002Ftd>\u003Ctd>การเปิด WebSocket connection จำนวนมากจาก IP เดียว (หรือหลาย IP) จนใช้ทรัพยากรเกินกำลัง\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Malformed Frame Attack\u003C\u002Ftd>\u003Ctd>การส่งข้อมูลที่ไม่เป็นไปตามมาตรฐาน WebSocket เพื่อให้ server crash หรือค้าง\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🔒 วิธีป้องกัน WebSocket Server\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>1. จำกัดจำนวน Connection ต่อ IP\u003C\u002Fh3>\u003Cp>ใช้ Rate Limiting หรือ Connection Throttling เพื่อควบคุมไม่ให้ client เชื่อมต่อมากเกินไป\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch4>✅ ตัวอย่าง Go Code (Fiber + WebSocket):\u003C\u002Fh4>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"github.com\u002Fgofiber\u002Ffiber\u002Fv2\"\n    \"github.com\u002Fgofiber\u002Fwebsocket\u002Fv2\"\n    \"sync\"\n)\n\nvar connections = make(map[string]int)\nvar mu sync.Mutex\nconst maxConnectionsPerIP = 5\n\nfunc main() {\n    app := fiber.New()\n\n    app.Get(\"\u002Fws\", websocket.New(func(c *websocket.Conn) {\n        ip := c.RemoteAddr().String()\n        mu.Lock()\n        connections[ip]++\n        if connections[ip] &gt; maxConnectionsPerIP {\n            mu.Unlock()\n            c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.ClosePolicyViolation, \"Too many connections\"))\n            c.Close()\n            return\n        }\n        mu.Unlock()\n\n        defer func() {\n            mu.Lock()\n            connections[ip]--\n            mu.Unlock()\n            c.Close()\n        }()\n\n        for {\n            _, msg, err := c.ReadMessage()\n            if err != nil {\n                break\n            }\n            c.WriteMessage(websocket.TextMessage, msg)\n        }\n    }))\n\n    app.Listen(\":8080\")\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cblockquote>\u003Cp>🔍 \u003Ci>อธิบาย\u003C\u002Fi>: ใช้ map เก็บจำนวน connection ต่อ IP และปฏิเสธทันทีเมื่อเกินลิมิต\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>2. ตรวจจับ Malformed Frames\u003C\u002Fh3>\u003Cp>โค้ด WebSocket ควรจับ error ที่เกิดจาก frame ที่ไม่ถูกต้อง เพื่อป้องกันไม่ให้ server ค้าง\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch4>✅ ตัวอย่างโค้ด:\u003C\u002Fh4>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">for {\n    messageType, msg, err := c.ReadMessage()\n    if err != nil {\n        if websocket.IsCloseError(err, websocket.CloseProtocolError) {\n            fmt.Println(\"Malformed frame detected from:\", c.RemoteAddr())\n        }\n        break\n    }\n    fmt.Println(\"Received message:\", string(msg))\n    c.WriteMessage(messageType, msg)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cblockquote>\u003Cp>🔍 \u003Ci>อธิบาย\u003C\u002Fi>: ตรวจสอบ error ว่าเป็น protocol error หรือไม่ เพื่อ logging และ block client ได้หากจำเป็น\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>3. ใช้ Firewall หรือ Reverse Proxy ป้องกันภายนอก\u003C\u002Fh3>\u003Cp>นอกจากโค้ดแล้ว ควรใช้ระบบหน้าด่านเพื่อกรอง traffic ที่ผิดปกติ เช่น:\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>เครื่องมือ\u003C\u002Fth>\u003Cth>การใช้งาน\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>NGINX \u002F Cloudflare\u003C\u002Ftd>\u003Ctd>Rate limiting, IP block, DoS mitigation\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>iptables\u003C\u002Ftd>\u003Ctd>Limit connection ต่อ IP\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Cloud WAF\u003C\u002Ftd>\u003Ctd>ป้องกัน DDoS และ WebSocket attack โดยเฉพาะ\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch4>✅ ตัวอย่าง Config NGINX:\u003C\u002Fh4>\u003Cpre>\u003Ccode class=\"language-plaintext language-nginx\">limit_conn_zone $binary_remote_addr zone=addr:10m;\n\nserver {\n    listen 80;\n\n    location \u002Fws {\n        proxy_pass http:\u002F\u002F127.0.0.1:8080;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n\n        limit_conn addr 5; # จำกัด connection ต่อ IP\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🧠 สรุปสิ่งที่ได้เรียนรู้\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cul>\u003Cli>WebSocket Server ต้องเผชิญความเสี่ยงจาก DDoS และ malformed traffic\u003C\u002Fli>\u003Cli>ควรจำกัดการเชื่อมต่อต่อ IP และตรวจจับ frame ที่ไม่ถูกต้อง\u003C\u002Fli>\u003Cli>ใช้ firewall หรือ reverse proxy ร่วมด้วยเพื่อป้องกันระดับ network\u003C\u002Fli>\u003C\u002Ful>\u003Cblockquote>\u003Cp>✅ เมื่อป้องกันครบทั้งในระดับโค้ดและโครงสร้างระบบ — WebSocket Server ของคุณจะ พร้อมใช้งานจริง ปลอดภัย และรับโหลดหนักได้\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🚀 ท้าให้ลอง\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cul>\u003Cli>ทดลองรัน WebSocket Server พร้อม limit IP\u003C\u002Fli>\u003Cli>ส่ง frame ผิดรูปแบบเพื่อทดสอบระบบ\u003C\u002Fli>\u003Cli>ลอง deploy ระบบผ่าน Cloudflare และทดสอบ rate limit\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>🔜 อีพีต่อไป\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>EP.88: การสร้างระบบแชทรองรับหลายห้อง (Multi-room Chat Management)\u003C\u002Fp>\u003Cp>เรียนรู้วิธีสร้างแชทหลายห้องแยกกัน พร้อมจัดการสมาชิกในแต่ละห้อง และรองรับ real-time communication อย่างมีประสิทธิภาพ!\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>อ่านบทความ Series อื่นๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FGolang\">\u003Cstrong>Golang The Series\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FJS2GO\">\u003Cstrong>JS2GO\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FTailwind%20CSS\">\u003Cstrong>10 Ep ที่จะให้คุณเป็นมือโปร Tailwind CSS ในชั่วข้ามคืน\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🔴 YouTube : \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUC2eI2RxcA2zbTqZyHyWIfRg\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002F\">\u003Cstrong>https:\u002F\u002Fwww.superdevacademy.com\u002F\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong>&nbsp;\u003C\u002Fstrong>\u003C\u002Fp>","145_11zon_ewwox02uy5.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fi9meb8bj9ncr3l3\u002F145_11zon_ewwox02uy5.webp","2026-03-04 08:46:52.447Z","",{"keywords":15,"locale":43,"school_blog":53},[16,23,28,33,38],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:34:00.920Z","ecac9y661or1xka","WebSocket","2026-04-10 16:08:05.227Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:46:51.907Z","v1tplgh0j9i68pq","DDoS","2026-04-10 16:13:20.156Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:34:03.189Z","yqlfsj6oely2c95","ความปลอดภัย","2026-04-10 16:08:06.027Z",{"code":44,"collectionId":45,"collectionName":46,"created":47,"flag":48,"id":49,"is_default":50,"label":51,"updated":52},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":54,"collectionId":55,"collectionName":56,"expand":57,"id":71,"views":72},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":58},{"blogIds":59,"collectionId":60,"collectionName":61,"created":62,"created_by":13,"id":54,"image":63,"image_alt":13,"image_path":64,"label":65,"name":66,"priority":67,"publish_at":68,"scheduled_at":13,"status":69,"updated":70,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":66,"th":66},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","oyj7gdmlu3pfaf3",221,"i9meb8bj9ncr3l3",[20,25,30,35,40],"2025-09-08 02:11:35.963Z","เมื่อ WebSocket Server ต้องเปิดให้ผู้ใช้งานจำนวนมากเชื่อมต่อแบบเรียลไทม์ ก็ต้องเตรียมรับมือกับ DDoS, Connection Flood และ Malformed Frame! บทความนี้จะพาคุณเรียนรู้วิธีการป้องกันในระดับโค้ดและระบบ เพื่อให้ WebSocket ของคุณปลอดภัยและพร้อมใช้งานจริง","golang-websocket-ddos-protection","2026-04-25 02:48:09.369Z",{"th":77}]