trusty — Website Trust Platform
Website Security

วิธีวางระบบ Content Security Policy (CSP) สำหรับร้านค้าออนไลน์และ E-commerce แบบเป็นขั้นตอน

ขั้นตอนวางระบบ CSP สำหรับร้านค้าออนไลน์ที่ต้องคุมทั้งความปลอดภัยและไม่ให้หน้าชำระเงินหรือพิกเซลการตลาดพัง

📅 เผยแพร่ 10 สิงหาคม 2569อัปเดตล่าสุด 10 สิงหาคม 2569✍️ เขียนโดย trusty Editorial Team⏱ อ่าน 8 นาที
Shopping cart with money next to a laptop symbolizing online shopping and e-commerce.
ภาพโดย https://kaboompics.com/ จาก Pexels

💬 สรุปสั้น ๆ

การวางระบบ Content Security Policy สำหรับร้านค้าออนไลน์ต้องเริ่มจากสำรวจโดเมนที่ Payment Gateway, GTM และพิกเซลโฆษณาเรียกใช้จริง ทดสอบด้วยโหมด Report-Only ให้ครบทุกช่องทางชำระเงินก่อน แล้วจึงเปลี่ยนเป็นบังคับใช้จริง

สารบัญ

ทีมพัฒนาเปิดใช้งาน Content-Security-Policy header แล้วปุ่มชำระเงินในหน้า Checkout เงียบไปทันที iframe ของผู้ให้บริการชำระเงินไม่ขึ้น หรือ Conversion ของ Google Ads หายไปทั้งวันโดยไม่มีใครรู้ตัวจนกว่าทีมการตลาดจะมาถามหาตัวเลข นี่คืออาการที่พบได้บ่อยเมื่อร้านค้าออนไลน์เปิดใช้ CSP โดยไม่ได้สำรวจสคริปต์ที่หน้าร้านใช้จริงก่อนเขียน Directive

Content Security Policy เป็น HTTP response header ที่บอกเบราว์เซอร์ว่าอนุญาตให้โหลดสคริปต์ รูปภาพ iframe และเชื่อมต่อเครือข่ายจากโดเมนใดได้บ้าง สำหรับร้านค้าออนไลน์ โดเมนเหล่านั้นครอบคลุมทั้งผู้ให้บริการชำระเงิน ตัวจัดการแท็กอย่าง Google Tag Manager และพิกเซลโฆษณาอย่าง Meta Pixel กับ Google Ads ซึ่งส่วนใหญ่เป็นของทีมการตลาดที่อาจไม่รู้เลยว่าทีมพัฒนากำลังจะเปิด Policy ใหม่

เข้าใจปัญหาก่อนเริ่ม: ทำไม CSP มักไปพังหน้าชำระเงินและพิกเซลการตลาด

ร้านค้าออนไลน์ทั่วไปมีสคริปต์บุคคลที่สามซ้อนกันหลายชั้นในหน้าเดียว ตัวอย่างเช่นหน้าชำระเงินที่มี iframe ของ Payment Gateway ฝังอยู่ ถ้า directive frame-src หรือ child-src ไม่ได้อนุญาตโดเมนของผู้ให้บริการนั้นไว้ เบราว์เซอร์จะปฏิเสธการโหลด iframe ทันทีและลูกค้าจะกรอกบัตรไม่ได้เลย

ในฝั่งการตลาด Google Tag Manager มักฝังสคริปต์แบบ inline ผ่าน Custom HTML Tag ซึ่งถูกบล็อกได้ง่ายถ้า script-src ไม่มี nonce, hash หรือการอนุญาตที่เหมาะสม ส่วน Meta Pixel ต้องพึ่ง connect-src ไปยังปลายทางที่ใช้ส่งข้อมูล Event และ img-src สำหรับภาพ pixel สำรองกรณี JavaScript ถูกปิด ถ้าขาดโดเมนใดโดเมนหนึ่งไป Conversion จะหายแบบเงียบๆ โดยไม่มี Error ที่ลูกค้าเห็น มีแต่ Log ใน Console ที่นักการตลาดไม่เคยเปิดดู

อีกจุดที่มักถูกมองข้ามคือสคริปต์ของตัวจัดการ Cookie Consent เอง ถ้า CSP บล็อก SDK ของ Consent Banner ไปด้วย แบนเนอร์จะไม่ขึ้นเลย ซึ่งกลายเป็นปัญหาซ้อนปัญหาทั้งด้านความปลอดภัยและด้าน PDPA ในคราวเดียว

ขั้นตอนที่ 1: สำรวจสคริปต์และปลายทางที่หน้าร้านใช้จริง

เปิด Developer Tools แท็บ Network แล้วไล่ดูทุกหน้าที่มีผลต่อยอดขาย ได้แก่ หน้าแรก หน้าสินค้า ตะกร้าสินค้า และหน้าชำระเงิน บันทึกโดเมนทั้งหมดที่ถูกเรียกใช้ ไม่ใช่แค่สคริปต์ แต่รวมถึง XHR, Fetch และ iframe ด้วย

รายการที่ควรมีอยู่ในผลสำรวจของร้านค้าออนไลน์ส่วนใหญ่คือ container ของ Google Tag Manager, base code ของ Meta Pixel, แท็ก Conversion ของ Google Ads, JavaScript SDK และ iframe ของผู้ให้บริการชำระเงิน, วิดเจ็ตแชทสด, วิดเจ็ตรีวิวสินค้า และ CDN ที่ใช้โหลดรูปสินค้าหรือฟอนต์ การสำรวจขั้นตอนนี้ควรทำร่วมกับทีมการตลาดเพราะพวกเขามักรู้ดีกว่าว่าใน GTM มีแท็กอะไรทำงานอยู่บ้าง

ขั้นตอนที่ 2: เริ่มด้วย Content-Security-Policy-Report-Only ก่อนบังคับใช้จริง

แทนที่จะเปิด Content-Security-Policy แบบบังคับใช้ทันที ให้เริ่มด้วย header ชื่อ Content-Security-Policy-Report-Only ซึ่งมีรูปแบบ Directive เหมือนกันทุกอย่างแต่จะไม่บล็อกทรัพยากรจริง เพียงส่งรายงานการละเมิดไปยังปลายทางที่กำหนดผ่าน report-uri หรือ report-to

ต้องมีคนในทีมคอยติดตามรายงานเหล่านี้จริง ไม่ใช่แค่เปิดไว้แล้วปล่อยทิ้ง ควรให้ครอบคลุมช่วงเวลาที่มีการทำธุรกรรมจริงอย่างน้อยหนึ่งรอบเต็ม เพื่อให้เห็น Directive ที่ยังไม่ครอบคลุมก่อนเปลี่ยนไปบังคับใช้จริง

ขั้นตอนที่ 3: ออกแบบ Directive ทีละส่วนสำหรับสแต็กร้านค้าออนไลน์

script-src ต้องอนุญาตโดเมนของ Google Tag Manager, Meta Pixel และ Google Ads รวมถึง SDK ของ Payment Gateway ถ้าเลี่ยงได้ควรหลีกเลี่ยงการเปิด unsafe-inline แบบกว้างทั้งเว็บ และพิจารณาใช้ nonce หรือ hash สำหรับสคริปต์ inline ที่ควบคุมได้ ส่วนสคริปต์ที่ GTM ฉีดแบบไดนามิกอาจต้องใช้แนวทางผสมเพราะควบคุม nonce ได้ยากกว่า

frame-src หรือ child-src ต้องอนุญาตโดเมนของ iframe ชำระเงินและปุ่มกระเป๋าเงินดิจิทัลอย่าง Google Pay หรือ Apple Pay ที่มักฝังผ่าน iframe เช่นกัน ส่วน connect-src ต้องครอบคลุมปลายทางที่ Pixel และ Analytics ยิง Event ไป รวมถึง endpoint ของ Payment Gateway ที่ใช้เรียก API ระหว่างขั้นตอนชำระเงิน

img-src ต้องเผื่อภาพ pixel สำรองของแพลตฟอร์มโฆษณาและ CDN รูปสินค้า และ form-action ควรจำกัดปลายทางที่ฟอร์มหน้าชำระเงินส่งข้อมูลไปได้อย่างชัดเจน เพราะเป็นจุดที่ข้อมูลบัตรและข้อมูลลูกค้าไหลออกจากหน้าเว็บจริง

ตัวอย่างตารางแมป Directive กับส่วนประกอบของร้านค้าออนไลน์

ตารางด้านล่างเป็นตัวอย่างแนวทางแมป Directive กับส่วนประกอบที่ร้านค้าออนไลน์ส่วนใหญ่ใช้งานจริง โดยชื่อในตารางเป็นเพียงตัวอย่างประเภทของปลายทาง ทีมพัฒนาต้องแทนที่ด้วยโดเมนจริงของผู้ให้บริการแต่ละรายที่สำรวจได้จากขั้นตอนที่ 1 เท่านั้น ห้ามคัดลอกรายการนี้ไปใช้ตรงๆ โดยไม่ตรวจสอบกับปลายทางจริงของร้าน

Directiveใช้ควบคุมอะไรตัวอย่างส่วนประกอบร้านค้าออนไลน์
script-srcแหล่งที่มาของ JavaScript ที่โหลดได้Container ของ GTM, Base Code ของ Meta Pixel, SDK ของ Payment Gateway
frame-srcโดเมนที่อนุญาตให้ฝัง iframeiframe หน้ากรอกบัตรของผู้ให้บริการชำระเงิน, ปุ่ม Google Pay หรือ Apple Pay
connect-srcปลายทางที่ Fetch หรือ XHR เชื่อมต่อได้Endpoint ส่ง Event ของ Pixel, Google Ads, API ของ Payment Gateway
img-srcแหล่งที่มาของรูปภาพPixel ภาพสำรอง, CDN รูปสินค้า
form-actionปลายทางที่ฟอร์มส่งข้อมูลได้Endpoint รับข้อมูลชำระเงินของ Payment Gateway

ขั้นตอนที่ 4: ทดสอบ Checkout Flow แบบครบวงจรก่อนเปลี่ยนเป็น Enforce Mode

ทดสอบทั้งการชำระเงินแบบ Guest Checkout และแบบสมาชิก ทดสอบทุกช่องทางชำระเงินที่ร้านเปิดใช้ ไม่ว่าจะเป็นบัตรเครดิต คิวอาร์โค้ด หรือ e-wallet และทดสอบทั้งบนเดสก์ท็อปและมือถือ เพราะบางผู้ให้บริการชำระเงินใช้โดเมนหรือ iframe คนละชุดกันระหว่างสองแพลตฟอร์ม

ระหว่างทดสอบให้เปิด GA4 DebugView หรือเครื่องมือตรวจแท็กที่ใช้อยู่ควบคู่ไปด้วย เพื่อยืนยันว่า Conversion Event ของ Google Ads และ Meta Pixel ยังยิงได้ปกติ และแบนเนอร์ Cookie Consent ยังโหลดและทำงานได้ครบก่อนตัดสินใจเปลี่ยนจาก Report-Only เป็นบังคับใช้จริง

พร้อมตรวจสอบความน่าเชื่อถือของเว็บไซต์คุณหรือยัง?

ทดลองใช้งาน trusty ฟรี ไม่ต้องใช้บัตรเครดิต เริ่มสแกนได้ทันที

ทดลองใช้งานระบบฟรี

ขั้นตอนที่ 5: ประสานงานกับทีมการตลาดเมื่อมีการเพิ่มแท็กใหม่

ปัญหาที่เกิดซ้ำบ่อยที่สุดหลังเปิด CSP ไม่ใช่ตอนตั้งค่าครั้งแรก แต่เกิดหลังจากนั้นเมื่อทีมการตลาดเพิ่ม Tag ใหม่ใน GTM โดยไม่รู้ว่าต้องแจ้งทีมพัฒนาให้เพิ่มโดเมนใน Policy ก่อนด้วย ผลคือ Conversion หรือ Retargeting หายไปหลายวันกว่าจะมีใครสังเกตเห็น

วิธีที่ใช้ได้จริงคือกำหนดขั้นตอนร่วมกันว่า ก่อน Publish GTM Container เวอร์ชันใหม่ที่มีแท็กจากผู้ให้บริการรายใหม่ ต้องแจ้งรายการโดเมนให้ทีมพัฒนาอัปเดต Policy ก่อนเสมอ และควรมี Log กลางที่ทั้งสองทีมเข้าถึงร่วมกันได้

ในทางปฏิบัติร้านที่มีแคมเปญโฆษณาเปลี่ยนบ่อยควรกำหนดรอบทบทวน Policy เป็นระยะสั้นกว่าธุรกิจทั่วไป เช่น ทุกครั้งที่เปิดแคมเปญใหม่บนแพลตฟอร์มที่ไม่เคยใช้มาก่อน หรือทุกครั้งที่เปลี่ยนผู้ให้บริการชำระเงิน เพราะทั้งสองเหตุการณ์นี้มักมาพร้อมโดเมนใหม่ที่ Policy เดิมยังไม่รู้จัก การมอบหมายให้มีเจ้าของ Policy ชัดเจนฝั่งทีมพัฒนา และมีผู้ประสานงานฝั่งการตลาดที่รู้ว่าเมื่อใดต้องแจ้ง จะช่วยลดเวลาที่ Conversion หายไปแบบไม่มีใครรู้ตัวได้มาก

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

CSP เป็นกลไกระดับเบราว์เซอร์ที่ควบคุมว่าเว็บไซต์โหลดทรัพยากรจากโดเมนใดได้บ้าง ส่วน Cookie Consent Banner เป็นกลไกขอความยินยอมก่อนให้สคริปต์ติดตามทำงาน ทั้งสองแยกกันแต่ส่งผลถึงกัน เพราะ CSP ที่เขียนไม่ครบอาจบล็อก SDK ของ Consent Banner เองได้

ทำไมเปิด CSP แล้ว Meta Pixel หรือ Google Ads หยุดยิง Conversion

ส่วนใหญ่เกิดจาก connect-src หรือ script-src ยังไม่ได้อนุญาตโดเมนที่ Pixel ใช้ส่ง Event จริง ให้เปิด Console ของเบราว์เซอร์ดู Error ที่ขึ้นต้นด้วยข้อความปฏิเสธการโหลดตาม Directive แล้วเพิ่มโดเมนนั้นเข้าไปใน Policy

ควรตั้ง CSP ผ่าน HTTP Header หรือ Meta Tag ในหน้าเว็บ

ควรใช้ HTTP Header เป็นหลักเพราะรองรับ Directive ครบกว่า เช่น frame-ancestors และ report-uri ที่ Meta Tag ใช้งานไม่ได้ Meta Tag เหมาะกับกรณีที่ปรับ Header ฝั่งเซิร์ฟเวอร์ไม่ได้จริงๆ เท่านั้น

ใช้เวลานานแค่ไหนกว่าจะเปลี่ยนจาก Report-Only เป็น Enforce ได้จริง

ไม่มีระยะเวลาตายตัว แต่ควรครอบคลุมอย่างน้อยหนึ่งรอบธุรกรรมเต็มที่มีการใช้ทุกช่องทางชำระเงินและทุกแคมเปญโฆษณาที่เปิดอยู่ เพื่อให้ Report-Only จับ Directive ที่ยังขาดได้ครบก่อนบังคับใช้จริง

เช็กลิสต์ปฏิบัติ

  • สำรวจสคริปต์และปลายทางที่หน้าแรก หน้าสินค้า ตะกร้า และหน้าชำระเงินเรียกใช้จริงก่อนเขียน Directive
  • เปิดใช้งานด้วย Content-Security-Policy-Report-Only ก่อนบังคับใช้จริงเสมอ
  • ตั้งค่า report-uri หรือ report-to ให้มีคนติดตาม Violation Report จริง ไม่ปล่อยทิ้งไว้
  • ทดสอบ Checkout ครบทุกช่องทางชำระเงินและอุปกรณ์มือถือก่อนเปลี่ยนเป็น Enforce Mode
  • ตรวจว่า Conversion Event ของ GA4, Google Ads และ Meta Pixel ยังยิงได้ปกติหลังเปิด CSP
  • แจ้งทีมการตลาดให้แนบรายการโดเมนใหม่ทุกครั้งที่เพิ่มแท็กใน GTM
  • เก็บ Policy เวอร์ชันปัจจุบันและวันที่ปรับปรุงไว้ให้ทีมพัฒนาและการตลาดเข้าถึงร่วมกัน

ข้อผิดพลาดที่พบบ่อย

  • เปิด CSP แบบบังคับใช้ทันทีโดยไม่ผ่าน Report-Only ทำให้หน้าชำระเงินล่มโดยไม่มีสัญญาณเตือนล่วงหน้า
  • เขียน script-src กว้างเกินไปด้วย unsafe-inline ทั้งเว็บเพียงเพื่อให้ GTM ทำงาน จน Policy แทบไม่ช่วยลดความเสี่ยงอะไรเลย
  • ลืมเพิ่มโดเมนของแท็กใหม่หลังทีมการตลาดอัปเดต GTM แล้ว Conversion หายไปหลายวันกว่าจะรู้ตัว
  • ทดสอบเฉพาะหน้าแรกแต่ไม่ทดสอบ Checkout จริงกับทุกช่องทางชำระเงินที่ร้านเปิดใช้
  • ใช้ Meta Tag แทน HTTP Header ทั้งที่ต้องการ Directive อย่าง frame-ancestors ซึ่ง Meta Tag ใช้ไม่ได้

สรุป

การวางระบบ CSP สำหรับร้านค้าออนไลน์ไม่ใช่แค่การก็อป Directive มาแปะ แต่ต้องเริ่มจากสำรวจสคริปต์จริงของ Payment Gateway, GTM และพิกเซลโฆษณา ทดสอบผ่านโหมด Report-Only ให้ครบวงจรธุรกรรม แล้วจึงบังคับใช้จริงพร้อมกลไกแจ้งเตือนเมื่อทีมการตลาดเพิ่มแท็กใหม่ เพื่อคุมความเสี่ยงด้านความปลอดภัยโดยไม่ทำให้ยอดขายหรือ Conversion Tracking เสียหาย

แหล่งข้อมูลอ้างอิง

ดูเพิ่มเติมที่ ศูนย์ความรู้ด้าน Website Security หรือ เช็กลิสต์ Content Security Policy สำหรับร้านค้าออนไลน์ และ วิธีตั้งค่า HTTP Security Headers สำหรับร้านค้าออนไลน์

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

CSP ต่างจาก Cookie Consent Banner อย่างไร

CSP เป็นกลไกระดับเบราว์เซอร์ที่ควบคุมว่าเว็บไซต์โหลดทรัพยากรจากโดเมนใดได้บ้าง ส่วน Cookie Consent Banner เป็นกลไกขอความยินยอมก่อนให้สคริปต์ติดตามทำงาน ทั้งสองแยกกันแต่ส่งผลถึงกัน เพราะ CSP ที่เขียนไม่ครบอาจบล็อก SDK ของ Consent Banner เองได้

ทำไมเปิด CSP แล้ว Meta Pixel หรือ Google Ads หยุดยิง Conversion

ส่วนใหญ่เกิดจาก connect-src หรือ script-src ยังไม่ได้อนุญาตโดเมนที่ Pixel ใช้ส่ง Event จริง ให้เปิด Console ของเบราว์เซอร์ดู Error ที่ขึ้นต้นด้วยข้อความปฏิเสธการโหลดตาม Directive แล้วเพิ่มโดเมนนั้นเข้าไปใน Policy

ควรตั้ง CSP ผ่าน HTTP Header หรือ Meta Tag ในหน้าเว็บ

ควรใช้ HTTP Header เป็นหลักเพราะรองรับ Directive ครบกว่า เช่น frame-ancestors และ report-uri ที่ Meta Tag ใช้งานไม่ได้ Meta Tag เหมาะกับกรณีที่ปรับ Header ฝั่งเซิร์ฟเวอร์ไม่ได้จริงๆ เท่านั้น

ใช้เวลานานแค่ไหนกว่าจะเปลี่ยนจาก Report-Only เป็น Enforce ได้จริง

ไม่มีระยะเวลาตายตัว แต่ควรครอบคลุมอย่างน้อยหนึ่งรอบธุรกรรมเต็มที่มีการใช้ทุกช่องทางชำระเงินและทุกแคมเปญโฆษณาที่เปิดอยู่ เพื่อให้ Report-Only จับ Directive ที่ยังขาดได้ครบก่อนบังคับใช้จริง

เนื้อหานี้จัดทำขึ้นเพื่อให้ข้อมูลทั่วไปเท่านั้น ไม่ถือเป็นคำแนะนำทางกฎหมาย กรุณาปรึกษาผู้เชี่ยวชาญด้านกฎหมายหรือ Data Protection Officer ของหน่วยงานท่านก่อนนำไปปฏิบัติจริง

พร้อมตรวจสอบความน่าเชื่อถือของเว็บไซต์คุณหรือยัง?

ทดลองใช้งาน trusty ฟรี ไม่ต้องใช้บัตรเครดิต เริ่มสแกนได้ทันที