เหตุใดฟอร์มติดต่อจึงเป็นความเสี่ยงด้านสแปมที่ใหญ่ที่สุดของคุณ
ฟอร์มติดต่อส่วนใหญ่ถูกตั้งค่าให้ส่งอีเมลโดยตรงจากข้อมูลที่ผู้ใช้ป้อน ซึ่งทำให้ถูกนำไปใช้ในทางที่ผิดได้ง่ายมาก
สารบัญ
- ปัญหานี้เก่ากว่าที่คุณคิด
- อะไรทำให้ฟอร์มติดต่อถูกโจมตีได้ง่าย
- วิธีที่ถูกต้องในการส่งอีเมลจากฟอร์มติดต่อ
- Rate limiting ไม่ใช่เรื่องที่เลือกทำก็ได้
- CAPTCHA เป็นการแลกเปลี่ยน ไม่ใช่ทางออก
- เมื่อใดควรใช้บริการฟอร์มจากบุคคลที่สาม
- ปัญหา DMARC
- แล้ว [ความยินยอมคุกกี้และการติดตามฟอร์ม](/th/blog/2026-05-02-what-changed-for-cookies-in-2026-and-what-to-do-about-it) ล่ะ?
- ประเด็นสำคัญ
- FAQ
- Sources
ปัญหานี้เก่ากว่าที่คุณคิด
ฟอร์มติดต่อเป็นช่องทางของสแปมมาตั้งแต่ช่วงต้นทศวรรษ 2000 แต่ปัญหารุนแรงขึ้นเมื่อผู้ให้บริการอีเมลเข้มงวดกับข้อกำหนดด้านการยืนยันตัวตนมากขึ้น ฟอร์มติดต่อส่วนใหญ่ยังคงถูกสร้างในรูปแบบเดิม: ผู้ใช้กรอกฟอร์ม เซิร์ฟเวอร์ของคุณส่งอีเมลโดยใช้ที่อยู่ของผู้ใช้ในส่วนหัว From แล้วคุณก็รอการตอบกลับ
นี่คือช่องโหว่ email spoofing แบบตำราเรียน นักสแปมสามารถใช้ฟอร์มของคุณเพื่อส่งอีเมลที่ดูเหมือนมาจากที่อยู่ใดก็ได้ที่พวกเขาต้องการ โดยส่งผ่าน IP ของเซิร์ฟเวอร์คุณ หากมีสแปมจำนวนมากถูกส่งออกไปด้วยวิธีนี้ โดเมนของคุณจะถูกตั้งค่าสถานะ และอีเมลธุรกรรมที่ถูกต้องตามปกติของคุณจะไม่ถึงกล่องจดหมาย
วิธีแก้ไขตรงไปตรงมา แต่บทแนะนำส่วนใหญ่ยังทำผิดอยู่
อะไรทำให้ฟอร์มติดต่อถูกโจมตีได้ง่าย
ฟอร์มติดต่อทั่วไปจะรับข้อมูลสามช่อง: ชื่อ อีเมล และข้อความ ตัวจัดการฝั่งเซิร์ฟเวอร์จะนำที่อยู่อีเมลนั้นไปใส่ในส่วนหัว From ของข้อความ SMTP ขาออกโดยตรง วิธีนี้สะดวกสำหรับการตอบกลับ—คุณเพียงกด “reply” ในกล่องจดหมาย—แต่มันก็เป็นของขวัญให้กับนักสแปมเช่นกัน
นี่คือสิ่งที่เกิดขึ้นเมื่อนักสแปมพบฟอร์มของคุณ:
- พวกเขาส่งฟอร์มโดยใส่ที่อยู่อีเมลของเหยื่อในช่อง “from”
- เซิร์ฟเวอร์ของคุณส่งอีเมลโดยใส่ที่อยู่ของเหยื่อนั้นในส่วนหัว
Fromอย่างขยันขันแข็ง - เมลเซิร์ฟเวอร์ของเหยื่อเห็นอีเมลที่อ้างว่ามาจากโดเมนของตน แต่มีต้นทางจาก IP ของคุณ
- หากโดเมนของคุณไม่มีระเบียน SPF/DKIM/DMARC ที่เหมาะสม (หรือแม้จะมี) อีเมลนั้นอาจยังผ่านไปได้ เพราะเซิร์ฟเวอร์จำนวนมากผ่อนปรนกับทราฟฟิกจากฟอร์มติดต่อ
- เหยื่อได้รับสแปมที่ดูเหมือนมาจากที่อยู่ของตนเอง หรือโดเมนของคุณถูกตั้งค่าสถานะว่าเกี่ยวข้องกับ spoofing
นี่ไม่ใช่การโจมตีเชิงทฤษฎี มันเกิดขึ้นตลอดเวลา หากคุณมีฟอร์มติดต่อและไม่เคยตรวจสอบบันทึกของเมลเซิร์ฟเวอร์ คุณอาจถูกใช้ในลักษณะนี้อยู่แล้ว
วิธีที่ถูกต้องในการส่งอีเมลจากฟอร์มติดต่อ
วิธีแก้คืออย่าใส่ข้อมูลจากผู้ใช้ในส่วนหัว From เด็ดขาด ให้ทำดังนี้แทน:
- From:
[email protected](หรือที่อยู่ใดก็ตามที่คุณควบคุม) - Reply-To: ที่อยู่อีเมลที่ผู้ใช้ส่งมา
- Subject: ใส่ชื่อผู้ใช้ได้หากต้องการ แต่อย่าใส่อีเมลของพวกเขา
- Body: ใส่ข้อมูลทั้งหมดจากฟอร์ม พร้อมป้ายกำกับที่ชัดเจน
ด้วยวิธีนี้ เซิร์ฟเวอร์ของคุณจะส่งอีเมลจากที่อยู่ที่คุณเป็นเจ้าของและยืนยันตัวตนไว้อย่างถูกต้องเท่านั้น เมื่อคุณกด “reply” ในกล่องจดหมาย อีเมลก็ยังส่งไปถึงผู้ใช้—นั่นคือหน้าที่ของ Reply-To แต่นักสแปมจะใช้ฟอร์มของคุณเพื่อปลอมเป็นที่อยู่ใดก็ได้ตามใจไม่ได้
ไลบรารีอีเมลส่วนใหญ่รองรับสิ่งนี้ตั้งแต่แรกอยู่แล้ว ใน PHP's PHPMailer:
$mail->setFrom('[email protected]', 'Contact Form');
$mail->addReplyTo($_POST['email'], $_POST['name']);
ใน Python's smtplib with email.mime:
msg['From'] = '[email protected]'
msg['Reply-To'] = form_data['email']
ใน Node.js with Nodemailer:
const mailOptions = {
from: '[email protected]',
replyTo: req.body.email,
// ...
};
หากฟอร์มติดต่อของคุณตอนนี้ใส่ข้อมูลผู้ใช้ในส่วนหัว From นี่คือการแก้ไขเพียงบรรทัดเดียว ทำวันนี้เลย
Rate limiting ไม่ใช่เรื่องที่เลือกทำก็ได้
แม้จะมีสุขอนามัยของส่วนหัวที่เหมาะสม ฟอร์มติดต่อที่ไม่มีการป้องกันก็ยังเป็นช่องทางของสแปมอยู่ดี นักสแปมจะส่งฟอร์มของคุณหลายร้อยครั้งด้วยเนื้อความข้อความที่แตกต่างกัน แล้วกล่องจดหมายของคุณจะเต็มไปด้วยขยะ
คุณต้องมี rate limiting หลายระดับ:
- ต่อ IP: ไม่เกิน 5 ครั้งต่อชั่วโมงจาก IP เดียวกัน
- ต่ออีเมล: ไม่เกิน 3 ครั้งต่อวันจากที่อยู่อีเมลเดียวกัน
- ภาพรวมทั้งหมด: ไม่เกิน 50 ครั้งต่อชั่วโมงสำหรับผู้ใช้ทั้งหมด (ปรับตามทราฟฟิกของคุณ)
Rate limiting ควรอยู่ในโค้ดแอปพลิเคชันของคุณ ไม่ใช่แค่ในคอนฟิกเว็บเซิร์ฟเวอร์ การจำกัดอัตราของ Nginx และ Apache ช่วยได้ แต่ทำงานในระดับคำขอ และไม่รู้จักที่อยู่อีเมลหรือรูปแบบการใช้งานฟอร์มในทางที่ผิดโดยเฉพาะ
หากคุณใช้ framework ก็น่าจะมี middleware สำหรับ rate-limiting ที่นำมาใช้ได้เลย หากคุณสร้างเองตั้งแต่ต้น ตัวนับ Redis แบบง่ายพร้อมคีย์ที่หมดอายุก็ใช้งานได้ดี:
key = f"contact_form:{ip_address}"
count = redis.incr(key)
if count == 1:
redis.expire(key, 3600) # 1 hour
if count > 5:
return error("Rate limit exceeded")
สิ่งนี้ไม่ได้กันกระสุนได้ทั้งหมด—นักสแปมสามารถหมุนเวียน IP ได้—แต่มันเพิ่มต้นทุนของการใช้งานในทางที่ผิดอย่างมีนัยสำคัญ
CAPTCHA เป็นการแลกเปลี่ยน ไม่ใช่ทางออก
Google's reCAPTCHA v3 มองไม่เห็นและให้คะแนนผู้ใช้ตามพฤติกรรม ซึ่งฟังดูเหมาะมาก ในทางปฏิบัติ มันบล็อกผู้ใช้ที่ถูกต้องบ่อยกว่าที่คุณคาด โดยเฉพาะผู้ใช้บน VPN, Tor หรือเครือข่ายองค์กรที่ใช้ร่วมกัน
reCAPTCHA v2 (ช่องทำเครื่องหมาย “I'm not a robot”) น่าเชื่อถือกว่าแต่เพิ่มแรงเสียดทาน Honeypot fields—ช่องกรอกฟอร์มที่ซ่อนไว้ ซึ่งมนุษย์จะไม่กรอกแต่บอตจะกรอก—จับบอตที่ไม่ซับซ้อนได้โดยไม่มีผลกระทบต่อผู้ใช้ แต่ก็ถูกหลีกเลี่ยงได้ง่ายมากสำหรับนักสแปมที่จริงจัง
แนวทางที่ดีที่สุดคือใช้หลายชั้น:
- ส่วนหัวอีเมลที่ถูกต้อง (ต่อรองไม่ได้)
- Rate limiting (ต่อรองไม่ได้)
- Honeypot field (ได้ประโยชน์ง่าย ไม่มีข้อเสีย)
- CAPTCHA เฉพาะเมื่อคุณยังได้รับสแปมจำนวนมากหลังจากทำสิ่งข้างต้นแล้ว
หากคุณเพิ่ม CAPTCHA ให้ใช้ reCAPTCHA v3 ด้วย threshold ต่ำ (0.5 หรือต่ำกว่า) และมี fallback ไปยัง v2 สำหรับผู้ใช้ที่ได้คะแนนต่ำ วิธีนี้ทำให้แรงเสียดทานต่ำสำหรับผู้ใช้ส่วนใหญ่ ในขณะเดียวกันก็ยังบล็อกบอตได้
เมื่อใดควรใช้บริการฟอร์มจากบุคคลที่สาม
หากคุณดูแลเว็บไซต์ขนาดเล็กและไม่ต้องการบำรุงรักษาโครงสร้างพื้นฐานของฟอร์ม บริการจากบุคคลที่สามอย่าง Formspree, Tally หรือ Netlify Forms จะจัดการสิ่งเหล่านี้ทั้งหมดให้คุณ พวกเขาทำ rate-limit, ตรวจสอบความถูกต้อง และส่งอีเมลจากโดเมนของตนเอง ทำให้ชื่อเสียงของคุณยังสะอาดอยู่
สิ่งที่ต้องแลกคือคุณกำลังส่งข้อมูลผู้ใช้ไปยังบุคคลที่สาม ซึ่งอาจขัดกับนโยบายความเป็นส่วนตัวหรือภาระผูกพันตาม GDPR ของคุณ การประมวลผลข้อมูลฝั่งไคลเอนต์ เป็นแนวโน้มที่เติบโตขึ้นสำหรับทีมที่ใส่ใจความเป็นส่วนตัว แต่ฟอร์มติดต่อโดยธรรมชาติแล้วต้องใช้การประมวลผลฝั่งเซิร์ฟเวอร์—คุณไม่สามารถส่งอีเมลจากเบราว์เซอร์โดยไม่เปิดเผยข้อมูลรับรองได้
หากคุณรับคำถามที่มีความอ่อนไหว (กฎหมาย การแพทย์ การเงิน) คุณน่าจะต้องดูแลโครงสร้างพื้นฐานของฟอร์มเอง สำหรับกรณีอื่น บริการจากบุคคลที่สามเป็นตัวเลือกที่สมเหตุสมผล
ปัญหา DMARC
แม้ว่าคุณจะแก้ส่วนหัวของฟอร์มติดต่อแล้ว คุณก็ยังไม่ปลอดภัยหากโดเมนของคุณไม่มีนโยบาย DMARC DMARC บอกเมลเซิร์ฟเวอร์ฝั่งรับว่าควรทำอย่างไรกับอีเมลที่ไม่ผ่านการตรวจสอบ SPF หรือ DKIM หากไม่มีสิ่งนี้ นักสแปมยังสามารถส่งอีเมลที่ดูเหมือนมาจากโดเมนของคุณได้ แม้ไม่ได้ใช้เซิร์ฟเวอร์ของคุณก็ตาม
การตั้งค่า DMARC อยู่นอกขอบเขตของบทความนี้ แต่หากคุณจริงจังกับชื่อเสียงด้านอีเมล สิ่งนี้ต่อรองไม่ได้ เริ่มด้วยนโยบายแบบ monitoring-only (p=none) แล้วค่อย ๆ ย้ายไปที่ p=quarantine หรือ p=reject เมื่อคุณยืนยันแล้วว่าอีเมลที่ถูกต้องของคุณได้รับการยืนยันตัวตนอย่างเหมาะสม
แล้ว ความยินยอมคุกกี้และการติดตามฟอร์ม ล่ะ?
หากฟอร์มติดต่อของคุณใช้ analytics หรือ marketing pixels เพื่อติดตามการส่งฟอร์ม คุณน่าจะอยู่ภายใต้กฎ GDPR และ ePrivacy ฟอร์มติดต่อส่วนใหญ่ไม่จำเป็นต้องมีการติดตาม—คุณรู้อยู่แล้วว่ามีคนส่งฟอร์มเพราะคุณได้รับอีเมล—แต่หากคุณใช้สิ่งอย่าง Facebook Pixel หรือเหตุการณ์ของ Google Analytics คุณต้องได้รับความยินยอมอย่างชัดเจนก่อนที่สคริปต์เหล่านั้นจะโหลด
แนวทางที่ง่ายที่สุดคือไม่ติดตามการส่งฟอร์มติดต่อเลย หากจำเป็นต้องติดตาม ให้โหลดสคริปต์ติดตามหลังจากผู้ใช้ให้ความยินยอมเท่านั้น และตรวจให้แน่ใจว่าแบนเนอร์ขอความยินยอมของคุณเป็นไปตามข้อกำหนด
ประเด็นสำคัญ
- อย่าใส่ที่อยู่อีเมลที่ผู้ใช้ส่งมาในส่วนหัว
Fromใช้Reply-Toแทน - Rate limiting เป็นสิ่งจำเป็น ต้องทำในระดับแอปพลิเคชัน ไม่ใช่แค่เว็บเซิร์ฟเวอร์
- Honeypot fields เป็นประโยชน์แบบไม่เสียค่าใช้จ่าย ส่วน CAPTCHA ควรเป็นทางเลือกสุดท้าย
- บริการฟอร์มจากบุคคลที่สามเป็นตัวเลือกที่สมเหตุสมผลสำหรับเว็บไซต์ขนาดเล็ก แต่มีสิ่งที่ต้องแลกด้านความเป็นส่วนตัว
- หากคุณส่งอีเมลใด ๆ จากโดเมนของคุณ คุณต้องมีนโยบาย DMARC
FAQ
Q: ฉันปิดฟอร์มติดต่อแล้วใช้ลิงก์ mailto แทนได้ไหม?
A: ได้ แต่ลิงก์ mailto เปิดเผยที่อยู่อีเมลของคุณต่อ scrapers และคุณจะเสียความสามารถในการเก็บข้อมูลแบบมีโครงสร้าง หากสแปมล้นหลาม ลิงก์ mailto ดีกว่าฟอร์มติดต่อที่มีปัญหา แต่การแก้ฟอร์มให้ถูกต้องดีกว่าทั้งสองอย่าง
Q: ถ้าฉันจำเป็นต้องส่งอีเมลจากที่อยู่ของผู้ใช้ด้วยเหตุผลที่ถูกต้องล่ะ?
A: แทบจะแน่นอนว่าคุณไม่จำเป็น หากคุณคิดว่าจำเป็น คุณอาจกำลังพยายามแก้ปัญหาเวิร์กโฟลว์ (เช่น การกำหนดเส้นทางการตอบกลับ) ที่ Reply-To แก้ให้แล้ว หากคุณจำเป็นต้องส่งอีเมลจากที่อยู่ใดก็ได้จริง ๆ คุณต้องใช้บริการอีเมลเฉพาะที่มีการยืนยันตัวตนอย่างถูกต้อง ไม่ใช่ฟอร์มติดต่อ
Q: ฉันจะรู้ได้อย่างไรว่าฟอร์มติดต่อของฉันถูกนำไปใช้ในทางที่ผิดอยู่แล้ว?
A: ตรวจสอบบันทึกของเมลเซิร์ฟเวอร์สำหรับการเชื่อมต่อ SMTP ขาออก หากคุณเห็นอีเมลขาออกจำนวนมากไปยังที่อยู่ที่คุณไม่รู้จัก หรือหากโดเมนของคุณถูกตั้งค่าสถานะโดยฐานข้อมูลสแปมอย่าง Spamhaus คุณน่าจะถูกใช้เป็น relay เครื่องมืออย่าง MXToolbox สามารถตรวจชื่อเสียงของโดเมนคุณได้
Q: การใช้บริการ CAPTCHA ฟรีปลอดภัยไหม?
A: Google's reCAPTCHA ฟรีและใช้กันอย่างแพร่หลาย แต่ส่งข้อมูลผู้ใช้ไปยัง Google ซึ่งอาจขัดกับนโยบายความเป็นส่วนตัวของคุณ hCaptcha เป็นทางเลือกที่เน้นความเป็นส่วนตัวและไม่ฝึกโมเดล AI ด้วยข้อมูลผู้ใช้ของคุณ Cloudflare Turnstile เป็นอีกตัวเลือกหนึ่งที่รบกวนน้อยกว่า CAPTCHA แบบดั้งเดิม
Q: SPF, DKIM และ DMARC ต่างกันอย่างไร?
A: SPF ระบุว่าเมลเซิร์ฟเวอร์ใดได้รับอนุญาตให้ส่งอีเมลจากโดเมนของคุณ DKIM ลงนามอีเมลขาออกด้วยการเข้ารหัสเพื่อให้ผู้รับตรวจสอบได้ว่าอีเมลไม่ถูกแก้ไข DMARC เชื่อมทั้งสองอย่างเข้าด้วยกันและบอกผู้รับว่าควรทำอย่างไรหากอีเมลไม่ผ่านการตรวจสอบ SPF หรือ DKIM คุณต้องมีทั้งสามอย่างเพื่อการยืนยันตัวตนอีเมลที่เหมาะสม
Sources
- OWASP: Email Header Injection — คำอธิบายโดยละเอียดว่าฟอร์มติดต่อสามารถถูกใช้เพื่อ email spoofing ได้อย่างไร
- RFC 5322: Internet Message Format — มาตรฐานทางเทคนิคที่กำหนดส่วนหัวอีเมล รวมถึง
FromและReply-To - DMARC.org: Overview — แหล่งข้อมูลอย่างเป็นทางการสำหรับการทำความเข้าใจและใช้นโยบาย DMARC
- Spamhaus: Domain Blocklists — ตรวจสอบว่าโดเมนของคุณถูกตั้งค่าสถานะว่าเกี่ยวข้องกับสแปมหรือไม่ และทำความเข้าใจว่า blocklists ทำงานอย่างไร


