Security Headers ตรวจสอบ HTTP Response Headers เพื่อความปลอดภัยของเว็บไซต์

Security Headers คือ HTTP Response Headers ชุดพิเศษที่เซิร์ฟเวอร์ส่งมาพร้อมกับทุก Response เพื่อบอก Browser ว่าให้จัดการ Content อย่างไรให้ปลอดภัย ถ้าเว็บของคุณขาด Security Headers ที่ถูกต้อง ผู้ไม่ประสงค์ดีอาจโจมตีด้วยวิธีต่างๆ เช่น XSS, Clickjacking หรือ MIME Sniffing ได้ง่ายขึ้น

บทความนี้จะอธิบาย Security Headers สำคัญทีละตัว พร้อมวิธีตรวจสอบและเพิ่มเข้าใน Hosting หรือ VPS ของคุณ

Security Headers สำคัญที่เว็บควรมี

ต่อไปนี้คือ Security Headers หลักที่ Google, securityheaders.com และผู้เชี่ยวชาญด้าน Security แนะนำให้มีทุกเว็บ:

Header ป้องกันอะไร ค่าแนะนำ
Strict-Transport-Security บังคับ HTTPS ป้องกัน Downgrade Attack max-age=31536000; includeSubDomains
Content-Security-Policy ป้องกัน XSS และการโหลด Script/Style จากแหล่งที่ไม่น่าเชื่อถือ กำหนดตาม Use Case (เช่น default-src 'self')
X-Frame-Options ป้องกัน Clickjacking — ไม่ให้ embed เว็บใน iframe SAMEORIGIN หรือ DENY
X-Content-Type-Options ป้องกัน MIME Sniffing — บังคับ Browser ใช้ Content-Type ที่กำหนด nosniff
Referrer-Policy ควบคุมข้อมูล Referrer ที่ส่งไปหน้าอื่น strict-origin-when-cross-origin
Permissions-Policy จำกัดการใช้ Browser Feature (Camera, Microphone, Geolocation) geolocation=(), microphone=(), camera=()
X-XSS-Protection เปิด Browser XSS Filter (Legacy — ยังใช้บน Browser เก่า) 1; mode=block

ตรวจสอบ Security Headers ของเว็บคุณได้เลย

ก่อนจะเพิ่ม Security Headers ควรตรวจสอบก่อนว่าเว็บของคุณมี Header อะไรบ้างในตอนนี้ และมีอะไรขาดหายไป เครื่องมือตรวจสอบ Security Headers ฟรีที่ใช้ง่ายจาก ไทยคือ:

🔒

dnsxray.com — Security Headers Checker

ตรวจสอบ HTTP Security Headers ของเว็บใดก็ได้ทันที แสดงผล Header ที่มี, ที่ขาด และคำแนะนำแก้ไขเป็นภาษาเข้าใจง่าย ไม่ต้องติดตั้งโปรแกรมใดๆ

ตรวจ Security Headers ฟรี →

ระดับ Grade ของ Security Headers

เครื่องมือตรวจ Security Headers มักให้คะแนนเป็น Grade A+ ถึง F ขึ้นอยู่กับ Header ที่มีและค่าที่ตั้ง:

A+ครบทุก Header ค่าดีที่สุด
Aครบเกือบหมด บางตัวค่าไม่สมบูรณ์
Bมีหลัก Header แต่ขาดบางตัว
Cมีน้อย ควรเพิ่มด่วน
Fขาดหมด หรือค่าผิดมาก

เว็บไซต์ทั่วไปที่ยังไม่ได้ตั้งค่ามักได้ Grade D หรือ F เป้าหมายที่ดีคือ Grade B+ ขึ้นไป และ Grade A+ สำหรับเว็บที่ต้องการ Security สูงอย่าง E-Commerce หรือเว็บ Login

เพิ่ม Security Headers ใน .htaccess (Apache / DirectAdmin)

สำหรับ Hosting ที่ใช้ Apache (รวมถึง DirectAdmin ของ AsiaGB) คุณเพิ่ม Security Headers ได้โดยแก้ไขไฟล์ .htaccess ที่ root ของเว็บไซต์:

# Security Headers — เพิ่มใน .htaccess
<IfModule mod_headers.c>
    # บังคับ HTTPS 1 ปี
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" "expr=%{HTTPS} == 'on'"

    # ป้องกัน Clickjacking
    Header always set X-Frame-Options "SAMEORIGIN"

    # ป้องกัน MIME Sniffing
    Header always set X-Content-Type-Options "nosniff"

    # Referrer Policy
    Header always set Referrer-Policy "strict-origin-when-cross-origin"

    # Permissions Policy (ปิด Camera/Mic/Geo)
    Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"

    # XSS Protection (Legacy)
    Header always set X-XSS-Protection "1; mode=block"
</IfModule>

หมายเหตุ: Content-Security-Policy (CSP) ต้องกำหนดค่าให้เหมาะกับเว็บแต่ละไซต์ ค่าผิดอาจทำให้ Script หรือ Style บางอย่างไม่ทำงาน ควรทดสอบใน Staging ก่อนใช้จริง

เพิ่ม Security Headers ใน Nginx (VPS)

สำหรับ VPS ที่ใช้ Nginx เพิ่ม Security Headers ใน Server Block:

# เพิ่มใน server block ของ Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
add_header X-XSS-Protection "1; mode=block" always;

การทดสอบ Security Headers บน Staging ก่อน Production

ก่อนนำ Security Headers ขึ้น Production Server จริง ควรทดสอบบน Staging Environment เสมอ โดยเฉพาะ CSP ที่มีความซับซ้อนสูง ขั้นตอนการทดสอบที่แนะนำมีดังนี้:

  1. ทดสอบใน Browser DevTools: เปิด Console (F12) แล้วเช็คว่ามี Error ประเภท "Refused to load" หรือ "Blocked by Content Security Policy" ปรากฏหรือไม่ หลังเพิ่ม CSP
  2. ใช้ Report-Only Mode: เริ่มด้วย Content-Security-Policy-Report-Only เพื่อดู Violation โดยไม่ Block Script ใดๆ
  3. ตรวจทุก Feature ของเว็บ: ลองใช้งานทุกฟีเจอร์ — ฟอร์ม, ปุ่ม, วิดีโอ, แผนที่, Payment Widget — เพราะแต่ละอย่างอาจต้องการ Source ที่ต่างกัน
  4. ตรวจสอบบน Mobile: เปิดเว็บบนมือถือเพราะบาง Browser อาจ Interpret CSP ต่างออกไป
  5. ยืนยันด้วย dnsxray.com: หลังขึ้น Production แล้ว ตรวจสอบซ้ำที่ dnsxray.com/security-headers เพื่อยืนยันว่า Header ส่งออกมาถูกต้อง

เคล็ดลับ Staging: ถ้าไม่มี Staging Environment แยก ให้ใช้ Subdomain เช่น staging.yourdomain.com หรือทดสอบบน Local Development ด้วย XAMPP/Laragon ก่อน โดยติดตั้ง Headers ผ่าน Virtual Host ใน httpd.conf แทน .htaccess

เปรียบเทียบ Security Headers: เว็บใหม่ vs เว็บที่มีอยู่แล้ว

วิธีการเพิ่ม Security Headers อาจแตกต่างกันขึ้นอยู่กับว่าคุณกำลังสร้างเว็บใหม่หรือแก้ไขเว็บที่มีอยู่แล้ว ตารางต่อไปนี้สรุปความแตกต่างและข้อควรระวัง:

ประเภทโปรเจกต์ ความเสี่ยง วิธีที่แนะนำ ลำดับความสำคัญ Header
เว็บใหม่ (เริ่มต้น) ต่ำ — ยังไม่มี Third-party Script มาก เพิ่ม HSTS + X-Frame + nosniff ทันที แล้วค่อยเพิ่ม CSP HSTS → X-Frame → nosniff → Referrer → CSP
WordPress ที่มีอยู่แล้ว สูง — มี Plugin หลายตัวที่โหลด External Script เริ่ม CSP ด้วย Report-Only 2–4 สัปดาห์ก่อน Enforce nosniff → X-Frame → Referrer → HSTS → CSP (last)
E-Commerce สูงมาก — มี Payment Gateway Script ประสานงานกับ Payment Provider ก่อนตั้ง CSP เพราะ Payment Script มักต้องการ allow หลาย Domain HSTS Preload → CSP → X-Frame DENY → nosniff
Landing Page / Static ต่ำ — ไม่มี Dynamic Content ใช้ CSP เข้มงวดได้เลย เช่น default-src 'self' ตั้งครบทุกตัวได้ทันที

Content-Security-Policy (CSP) คืออะไร และตั้งค่าอย่างไร

Content-Security-Policy (CSP) คือ Security Header ที่ทรงพลังที่สุดและตั้งค่ายากที่สุดในเวลาเดียวกัน CSP บอก Browser ว่าอนุญาตให้โหลด Script, Style, รูปภาพ และทรัพยากรอื่นๆ จากแหล่งใดได้บ้าง ซึ่งช่วยป้องกันการโจมตีแบบ XSS (Cross-Site Scripting) ได้อย่างมีประสิทธิภาพ

Directive หลักของ CSP

ตัวอย่าง CSP สำหรับเว็บทั่วไปที่ใช้ Google Analytics และ Google Fonts

# CSP ตัวอย่าง — ปรับแก้ให้เข้ากับเว็บของคุณ
Header always set Content-Security-Policy \
  "default-src 'self'; \
   script-src 'self' 'unsafe-inline' https://www.googletagmanager.com https://www.google-analytics.com; \
   style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; \
   font-src 'self' https://fonts.gstatic.com; \
   img-src 'self' data: https://www.google-analytics.com; \
   connect-src 'self' https://www.google-analytics.com; \
   frame-ancestors 'self';"

แนะนำ: เริ่มจาก Report-Only Mode ก่อนเสมอ — ใช้ Content-Security-Policy-Report-Only แทน Content-Security-Policy เพื่อดู Violation ที่จะเกิดขึ้นโดยที่ยังไม่บล็อก Script ใดๆ เมื่อ Error หายหมดแล้วค่อยเปลี่ยนเป็น Enforce Mode จริง

Security Headers กับ Framework และ CMS ยอดนิยม

นอกจาก Apache .htaccess และ Nginx แต่ละ Framework และ CMS ยังมีวิธีตั้ง Security Headers ของตัวเองที่แตกต่างกัน ต่อไปนี้คือตัวอย่างสำหรับ Platform ที่ใช้บ่อย:

Laravel (PHP)

ใน Laravel สามารถเพิ่ม Security Headers ผ่าน Middleware ได้สะดวก โดยสร้าง Middleware ใหม่หรือแก้ใน app/Http/Middleware/:

// app/Http/Middleware/SecurityHeaders.php
public function handle($request, Closure $next)
{
    $response = $next($request);
    $response->header('X-Frame-Options', 'SAMEORIGIN');
    $response->header('X-Content-Type-Options', 'nosniff');
    $response->header('Referrer-Policy', 'strict-origin-when-cross-origin');
    $response->header('Permissions-Policy', 'geolocation=(), microphone=(), camera=()');
    return $response;
}

Next.js / React (Vercel / Static Export)

สำหรับโปรเจกต์ Next.js ตั้ง Security Headers ใน next.config.js:

// next.config.js
const securityHeaders = [
  { key: 'X-Frame-Options', value: 'SAMEORIGIN' },
  { key: 'X-Content-Type-Options', value: 'nosniff' },
  { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
];
module.exports = {
  async headers() {
    return [{ source: '/(.*)', headers: securityHeaders }];
  },
};

หมายเหตุ: สำหรับ Static Hosting อย่าง Netlify, Cloudflare Pages หรือ GitHub Pages ให้ตั้ง Headers ผ่าน Config ของ Platform (เช่น netlify.toml หรือ _headers file) แทนการใช้ .htaccess เพราะ Apache ไม่ได้ถูกใช้บน Platform เหล่านี้

เปรียบเทียบผลกระทบด้านความปลอดภัยของแต่ละ Header

Security Headers แต่ละตัวป้องกันการโจมตีที่แตกต่างกัน ตารางต่อไปนี้แสดงระดับความสำคัญและผลที่จะเกิดขึ้นหากขาดแต่ละ Header:

Header ความสำคัญ ความเสี่ยงหากขาด เว็บที่เสี่ยงที่สุด
Strict-Transport-Security สูงมาก ถูก Downgrade จาก HTTPS → HTTP ได้ ทุกเว็บที่มี HTTPS
Content-Security-Policy สูงมาก XSS โจมตีได้ง่าย ขโมย Cookie/Session เว็บที่มี Login / E-Commerce
X-Frame-Options สูง ถูก embed ใน iframe หลอกให้คลิก (Clickjacking) เว็บ Banking, Admin Panel
X-Content-Type-Options ปานกลาง Browser รัน Script ที่ Disguise เป็น File อื่น เว็บที่รับ File Upload
Referrer-Policy ปานกลาง URL ส่วนตัว (เช่น Token ใน Query String) รั่วออก เว็บที่ใช้ Token ใน URL
Permissions-Policy ปานกลาง Script ของบุคคลที่สามเข้าถึง Camera/Mic/Location ได้ ทุกเว็บที่มี Third-party Script

การตั้งค่า HSTS Preload และผลระยะยาวที่ต้องรู้

HSTS Preload คือการลงทะเบียนโดเมนของคุณไว้ใน Preload List ที่ Browser ยักษ์ใหญ่อย่าง Chrome, Firefox, Safari และ Edge ฝังรายชื่อไว้ใน Source Code เลย ซึ่งหมายความว่าแม้จะเข้าเว็บเป็นครั้งแรก Browser จะบังคับ HTTPS ทันทีโดยไม่ต้องรอ Header จากเซิร์ฟเวอร์ก่อน

เงื่อนไขที่ต้องมีก่อนยื่นลงทะเบียน HSTS Preload:

คำเตือนสำคัญ: การลงทะเบียน HSTS Preload ยกเลิกได้ยากมาก อาจใช้เวลาหลายเดือนกว่า Browser จะนำโดเมนของคุณออกจาก List ห้ามทำถ้า Subdomain ใดของคุณยังไม่มี SSL หรือยังต้องใช้ HTTP อยู่ เพราะจะทำให้ผู้ใช้เข้า Subdomain นั้นไม่ได้เลย

ปัญหาที่พบบ่อยหลังเพิ่ม Security Headers

หลังเพิ่ม Security Headers แล้ว อาจพบปัญหาบางอย่างที่ทำให้เว็บทำงานผิดปกติ ต่อไปนี้คือปัญหาที่พบบ่อยและวิธีแก้:

1. หน้าเว็บแสดงผลเป็นสีขาว (White Screen) หลังเพิ่ม CSP

สาเหตุส่วนใหญ่คือ CSP บล็อก Script หรือ Style ที่จำเป็น แก้ไขโดยเปิด Browser Developer Tools (F12) แล้วดูแถบ Console จะมี Error ข้อความว่า "Refused to load..." พร้อมระบุ URL ที่ถูกบล็อก นำ Domain ที่ระบุไปเพิ่มใน CSP Directive ที่เหมาะสม

2. รูปภาพหรือ Video จากแหล่งภายนอกไม่แสดง

ตรวจสอบว่า img-src และ media-src ใน CSP รวม Domain ของรูปภาพหรือวิดีโอที่ต้องการไว้แล้ว เช่น หากใช้รูปจาก Unsplash ต้องเพิ่ม https://images.unsplash.com ใน img-src

3. Google Analytics หรือ Facebook Pixel ไม่ทำงาน

ต้องเพิ่ม Domain ของ Tracking Script ใน script-src และ connect-src:

script-src 'self' 'unsafe-inline'
  https://www.googletagmanager.com
  https://connect.facebook.net;
connect-src 'self'
  https://www.google-analytics.com
  https://www.facebook.com;

4. HSTS ทำให้ไม่สามารถเข้า HTTP ได้

นี่คือพฤติกรรมที่ถูกต้องของ HSTS Browser ที่เคยเห็น HSTS Header จะบล็อก HTTP โดยอัตโนมัติ หากต้องการทดสอบ HTTP บน Development ให้ใช้ Browser ในโหมด Incognito หรือลบ HSTS Cache ใน Chrome ผ่าน chrome://net-internals/#hsts

เทคนิค Debug CSP: ใช้ dnsxray.com/security-headers ตรวจสอบ Header ที่เว็บของคุณส่งออกมาจริงๆ เพื่อยืนยันว่า Header ที่เพิ่มใน .htaccess ทำงานถูกต้องแล้ว

Security Headers กับ WordPress

WordPress สามารถเพิ่ม Security Headers ผ่าน .htaccess (ระวัง: WordPress มักเขียนทับ .htaccess ส่วนบนเมื่อ Update Permalink ดังนั้นให้เพิ่ม Header ไว้ ก่อน บรรทัด # BEGIN WordPress) หรือใช้ Plugin เช่น:

วิธีใช้ dnsxray.com ตรวจ Security Headers ทีละขั้นตอน

  1. เปิด dnsxray.com/security-headers
  2. พิมพ์ URL เว็บของคุณ (เช่น https://yourdomain.com) แล้วกด Check
  3. ระบบจะแสดง Grade รวม + Header แต่ละตัวที่มีและขาด
  4. Header ที่ขาดจะมีคำแนะนำวิธีเพิ่มให้ทันที
  5. หลังเพิ่ม Header ใน .htaccess หรือ Nginx แล้ว กลับมาตรวจซ้ำเพื่อยืนยัน

ลองเลย: เปิด dnsxray.com/security-headers แล้วพิมพ์ URL เว็บของคุณ ระบบจะแสดงผลทันทีว่า Security Headers ผ่านระดับไหนและต้องแก้ไขอะไรบ้าง — ใช้เวลาน้อยกว่า 30 วินาที

คำถามที่พบบ่อย (FAQ)

Security Headers กระทบ SEO ของ Google ไหม?
ไม่กระทบ SEO โดยตรง แต่ Google ใช้ HTTPS (HSTS) เป็นปัจจัยใน Ranking ส่วนหนึ่ง Security Headers ที่ตั้งค่าถูกต้องช่วยให้เว็บดูน่าเชื่อถือและปลอดภัยมากขึ้น ซึ่งลดโอกาสที่ Browser จะแสดง Warning และลดอัตราการ Bounce
Content-Security-Policy ตั้งค่าผิดแล้วเว็บพังไหม?
ได้ CSP ที่เข้มงวดเกินไปอาจ Block Script ของ Google Analytics, Font หรือ Script ของบุคคลที่สามออกหมด แนะนำให้เริ่มจาก Report-Only mode (Content-Security-Policy-Report-Only) เพื่อดู Error ก่อน แล้วค่อย Enforce จริง
Hosting AsiaGB รองรับ Security Headers ไหม?
รองรับครบ Hosting AsiaGB ใช้ Apache + DirectAdmin ซึ่งรองรับ mod_headers อยู่แล้ว คุณเพิ่ม Security Headers ได้เองผ่าน .htaccess ที่ root ของเว็บ หรือแจ้งทีมงานช่วยตั้งค่าได้
HSTS กับ Strict-Transport-Security ต่างกันไหม?
ไม่ต่าง HSTS ย่อมาจาก HTTP Strict Transport Security ซึ่งก็คือ Header Strict-Transport-Security นั่นเอง เมื่อ Browser เห็น Header นี้ จะบังคับใช้ HTTPS ตลอดช่วงเวลาที่กำหนดใน max-age โดยไม่ให้เข้าผ่าน HTTP ได้

Hosting AsiaGB มี Security Headers ครบในตัว

ทุก Hosting Plan มาพร้อม SSL ฟรี, HSTS, cPGuard Security และ Imunify360 — เริ่มต้น 500 บาท/ปี