22/04/2026 07:10น.

EP.68 การเพิ่มฟีเจอร์การตรวจสอบและป้องกันการโจมตีใน WebSocket Chat
#ป้องกัน DoS attack
#JWT Authentication
#Cross-Site WebSocket Hijacking
#ป้องกันการโจมตี WebSocket
ใน EP.68 นี้เราจะมาพูดถึง การเพิ่มฟีเจอร์การตรวจสอบและป้องกันการโจมตี (Security Enhancements) ใน WebSocket Chat เพื่อเพิ่มความปลอดภัยให้กับผู้ใช้งานในห้องแชทออนไลน์และป้องกันการโจมตีที่อาจเกิดขึ้น เช่น Cross-Site WebSocket Hijacking (CSWSH), Denial of Service (DoS) และ Cross-Site Scripting (XSS)
ในขณะที่ WebSocket เป็นโปรโตคอลที่มีประสิทธิภาพสูงในการสื่อสารแบบเรียลไทม์ แต่มันก็สามารถเป็นช่องทางที่โจมตีได้หากไม่ถูกป้องกันอย่างเหมาะสม การเพิ่มฟีเจอร์การตรวจสอบและป้องกันการโจมตีจึงเป็นสิ่งสำคัญเพื่อให้ระบบ WebSocket Chat ของเราได้รับความปลอดภัยจากภัยคุกคามต่างๆ
ทำไมต้องมีการตรวจสอบและป้องกันการโจมตีใน WebSocket Chat?
หากระบบ WebSocket Chat ไม่มีการป้องกันการโจมตีที่เหมาะสม จะทำให้เกิดปัญหาหลายประการ เช่น การเข้าถึงข้อมูลที่ไม่ได้รับอนุญาต การขโมยข้อมูล และการทำลายบริการ การเพิ่มฟีเจอร์การตรวจสอบและป้องกันการโจมตีจะช่วยให้:
- ปกป้องข้อมูล: ทำให้ข้อมูลการสนทนาและข้อมูลส่วนตัวของผู้ใช้ไม่ถูกดักฟังหรือถูกขโมย
- ลดช่องทางการโจมตี: ป้องกันไม่ให้แฮกเกอร์สามารถใช้ช่องโหว่ใน WebSocket เพื่อโจมตีระบบ
- เพิ่มความปลอดภัยในระบบ: ลดความเสี่ยงจากการโจมตีต่างๆ ที่อาจเกิดขึ้นในแอปพลิเคชัน
ข้อดีของการเพิ่มฟีเจอร์การตรวจสอบและป้องกันการโจมตีใน WebSocket Chat
- ป้องกันการเข้าถึงที่ไม่ได้รับอนุญาต: การเพิ่มฟีเจอร์การตรวจสอบและยืนยันตัวตนช่วยให้เฉพาะผู้ใช้ที่ได้รับอนุญาตเท่านั้นที่สามารถเข้าถึงระบบ WebSocket Chat
- ปกป้องข้อมูลที่สำคัญ: การเข้ารหัส (SSL/TLS) ช่วยป้องกันการดักฟังข้อมูลที่ส่งผ่านระหว่างเซิร์ฟเวอร์และลูกค้า
- เพิ่มความสามารถในการรองรับการโจมตี: การป้องกัน Denial of Service (DoS) ช่วยรักษาความพร้อมใช้งานของระบบและป้องกันไม่ให้บริการหยุดทำงาน
- ป้องกันการโจมตี XSS: การกรองข้อมูลที่ผู้ใช้ส่งมาช่วยป้องกันไม่ให้มีการฝังสคริปต์ที่เป็นอันตรายในระบบ
ฟีเจอร์ที่ต้องเพิ่มใน WebSocket Chat
ในส่วนนี้เราจะพูดถึงฟีเจอร์ที่จำเป็นต้องเพิ่มในการตรวจสอบและป้องกันการโจมตีใน WebSocket Chat เพื่อให้ระบบของเรามีความปลอดภัยมากยิ่งขึ้น
1. การใช้การเข้ารหัส SSL/TLS
การเข้ารหัส SSL/TLS ทำให้ข้อมูลระหว่าง WebSocket Client และ Server ถูกเข้ารหัสและไม่สามารถถูกดักฟังหรือแก้ไขได้
- ทำไม SSL/TLS ถึงสำคัญ:
SSL/TLS ช่วยปกป้องข้อมูลที่ส่งระหว่างลูกค้าและเซิร์ฟเวอร์ให้ไม่ถูกดักฟังหรือแก้ไขได้
ตัวอย่างโค้ด:
เพื่อเปิดใช้งาน SSL/TLS บน WebSocket Server เราสามารถปรับการเชื่อมต่อให้ใช้การเข้ารหัส wss:// ได้:
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
"crypto/tls"
)
func main() {
// สร้าง WebSocket server ที่มีการเข้ารหัส
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Error upgrading connection:", err)
return
}
defer conn.Close()
// Handle connection
})
// โหลด SSL certificate และ private key
certFile := "server.crt"
keyFile := "server.key"
// เริ่มต้นเซิร์ฟเวอร์ที่ใช้ TLS
log.Fatal(http.ListenAndServeTLS(":443", certFile, keyFile, nil))
}
2. การป้องกัน Cross-Site WebSocket Hijacking (CSWSH)
CSWSH เกิดขึ้นเมื่อแฮกเกอร์สามารถทำการเชื่อมต่อ WebSocket ไปยังเซิร์ฟเวอร์ของผู้ใช้ที่ไม่ต้องการได้ เราสามารถป้องกันการโจมตีนี้โดยการตรวจสอบ Origin Header ของการเชื่อมต่อ
- ทำไมต้องป้องกัน CSWSH:
การตรวจสอบ Origin Header ทำให้แน่ใจว่าการเชื่อมต่อมาจากแหล่งที่เชื่อถือได้
ตัวอย่างโค้ด:
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
origin := r.Header.Get("Origin")
if origin == "https://trusted-site.com" {
return true
}
return false
},
}
3. การใช้ JSON Web Tokens (JWT)
การใช้ JWT สำหรับการยืนยันตัวตนช่วยให้การสื่อสารระหว่าง WebSocket Client และ Server มีความปลอดภัยมากขึ้น โดยไม่ให้ผู้ใช้ที่ไม่ได้รับอนุญาตสามารถเชื่อมต่อได้
ตัวอย่างโค้ด:
package main
import (
"fmt"
"log"
"github.com/dgrijalva/jwt-go"
"time"
)
var mySigningKey = []byte("secret")
func GenerateJWT(userID string) (string, error) {
claims := jwt.MapClaims{
"user_id": userID,
"exp": time.Now().Add(time.Hour * 72).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(mySigningKey)
if err != nil {
return "", err
}
return tokenString, nil
}
func main() {
token, err := GenerateJWT("user123")
if err != nil {
log.Fatal("Error generating JWT:", err)
}
fmt.Println("Generated JWT:", token)
}
4. การป้องกัน Denial of Service (DoS)
การจำกัดจำนวนการเชื่อมต่อจาก IP เดียวกัน และการจำกัดจำนวนการขอที่ส่งไปยังเซิร์ฟเวอร์จะช่วยป้องกันการโจมตี DoS ที่อาจทำให้เซิร์ฟเวอร์ล่ม
- ทำไมต้องป้องกัน DoS:
ป้องกันการโจมตีที่ทำให้บริการหยุดทำงาน และป้องกันไม่ให้เซิร์ฟเวอร์รับโหลดเกินไป
ตัวอย่างโค้ด:
package main
import (
"sync"
)
var connectionCount = make(map[string]int)
var lock = sync.Mutex{}
func checkDoSProtection(ip string) bool {
lock.Lock()
defer lock.Unlock()
if connectionCount[ip] > 5 { // จำกัดการเชื่อมต่อที่ 5 ครั้งต่อ IP
return false
}
connectionCount[ip]++
return true
}
การทดสอบฟีเจอร์การตรวจสอบและป้องกันการโจมตี
หลังจากที่เราเพิ่มฟีเจอร์การป้องกันการโจมตีแล้ว จำเป็นต้องทดสอบการทำงานเพื่อให้มั่นใจว่าแต่ละฟีเจอร์ทำงานได้อย่างถูกต้อง
การทดสอบที่ควรทำ:
- ทดสอบการตรวจสอบ Origin Header และ JWT Token
- ทดสอบการป้องกัน Cross-Site WebSocket Hijacking และ DoS
- ทดสอบการส่งข้อมูลผ่านการเชื่อมต่อ SSL/TLS
ท้าให้ลอง!
ลองเพิ่ม ฟีเจอร์การตั้งค่าระดับสิทธิ์การเข้าถึง เพื่อให้ผู้ใช้สามารถตั้งค่าการเข้าถึงห้องแชทตามระดับสิทธิ์ของตนเอง
EP ถัดไป:
ใน EP.69 เราจะมาดู การใช้ gRPC ในการพัฒนา API สำหรับ WebSocket Chat เพื่อเพิ่มประสิทธิภาพในการส่งข้อมูลระหว่างเซิร์ฟเวอร์และลูกค้า โดยใช้ gRPC ที่สามารถให้ความเร็วและการสื่อสารที่มีประสิทธิภาพในระบบ WebSocket Chat!