ตั้งค่า HTTP Security Headers สำหรับ WordPress บน Cloud VPS

HTTP Security Headers คืออะไร?

HTTP Security Headers เป็นส่วนหัวของ HTTP Response ที่บอกเบราว์เซอร์ว่าควรจัดการกับเนื้อหาอย่างไร ช่วยป้องกันการโจมตีหลายรูปแบบ เช่น Cross-Site Scripting (XSS), Clickjacking, MIME Sniffing และอื่นๆ การตั้งค่า Security Headers ที่ถูกต้องบน Cloud VPS ของ de.co.th จะเพิ่มความปลอดภัยให้ WordPress อย่างมาก

ตั้งค่า Security Headers บน Nginx

# เพิ่มใน server block ของ Nginx
server {
    # ป้องกัน Clickjacking
    add_header X-Frame-Options "SAMEORIGIN" always;
    
    # ป้องกัน XSS
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    
    # บังคับใช้ HTTPS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    
    # ควบคุม Referrer
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    
    # ควบคุม Permission
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    
    # Content Security Policy
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.googleapis.com *.gstatic.com; style-src 'self' 'unsafe-inline' *.googleapis.com; img-src 'self' data: *.gravatar.com; font-src 'self' *.googleapis.com *.gstatic.com;" always;
}

ตั้งค่า Security Headers บน Apache

# เพิ่มใน .htaccess หรือ Apache config
<IfModule mod_headers.c>
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>

อธิบาย Security Headers แต่ละตัว

X-Frame-Options ป้องกันเว็บถูกนำไปแสดงใน iframe ของเว็บอื่น ป้องกัน Clickjacking X-Content-Type-Options ป้องกัน MIME Type Sniffing ไม่ให้เบราว์เซอร์เดาประเภทไฟล์เอง Strict-Transport-Security (HSTS) บังคับให้เบราว์เซอร์ใช้ HTTPS เสมอ Content-Security-Policy (CSP) กำหนดว่า Resource ใดบ้างที่อนุญาตให้โหลดในเว็บ เป็น Header ที่ทรงพลังที่สุดแต่ต้องตั้งค่าอย่างระวังเพื่อไม่ให้ WordPress ทำงานผิดปกติ

ตั้งค่า CSP สำหรับ WordPress โดยเฉพาะ

WordPress ใช้ Inline Script และ Style มาก ดังนั้นต้องอนุญาต ‘unsafe-inline’ ไว้ เริ่มต้นด้วย Report-Only Mode ก่อนเพื่อทดสอบ:

# เริ่มต้นด้วย Report-Only Mode
add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';" always;

ตรวจสอบผลด้วย SecurityHeaders.com

หลังตั้งค่าแล้ว ตรวจสอบที่ securityheaders.com ใส่ URL เว็บไซต์เพื่อดูคะแนน Security Headers เป้าหมายคือได้คะแนน A หรือ A+ หรือตรวจสอบด้วย curl:

curl -I https://yourdomain.com

สรุป

HTTP Security Headers เป็นอีกชั้นความปลอดภัยที่สำคัญสำหรับ WordPress บน Cloud VPS ของ de.co.th การตั้งค่าไม่ยากแต่ต้องระวังเรื่อง CSP ที่อาจทำให้ WordPress หรือ Plugin บางตัวทำงานผิดปกติ แนะนำให้เริ่มจาก Headers พื้นฐานก่อน แล้วค่อยเพิ่ม CSP ทีหลัง