Turnstile: ป้องกันบอทแบบไม่ต้องให้ผู้ใช้ติ๊กรูปรถเมล์

สรุปสั้น ๆ
Turnstile คือบริการป้องกันบอทของ Cloudflare ที่ใช้สัญญาณเชิงพฤติกรรมและเทคนิคแทนการให้ผู้ใช้แก้ปริศนาภาพแบบ CAPTCHA ดั้งเดิม ส่วนใหญ่ทำงานเบื้องหลังแบบผู้ใช้ไม่รู้ตัว แต่ต้อง verify token ที่ได้กลับมาฝั่ง server เสมอ เพราะการเชื่อ token ฝั่ง client อย่างเดียวไม่ปลอดภัยและยังมีข้อจำกัดที่ไม่ได้บล็อกบอททุกประเภท
ฟอร์มสมัครสมาชิก ฟอร์มติดต่อ หรือช่องคอมเมนต์ที่เปิดสาธารณะ มักเป็นเป้าหมายของบอทที่ส่ง spam หรือพยายามสร้างบัญชีปลอมจำนวนมาก วิธีป้องกันแบบดั้งเดิมคือใส่ CAPTCHA ให้ผู้ใช้พิมพ์ตัวอักษรบิดเบี้ยวหรือเลือกรูปที่มีวัตถุตามที่โจทย์กำหนด ซึ่งได้ผลในการกันบอทระดับหนึ่ง แต่แลกมาด้วยประสบการณ์ผู้ใช้ที่แย่ลง ผู้ใช้จริงจำนวนไม่น้อยหงุดหงิดหรือกรอกผิดจนต้องลองใหม่หลายรอบ
Turnstile เป็นความพยายามของ Cloudflare ในการแก้ปัญหานี้ด้วยแนวคิดต่างออกไป แทนที่จะให้ผู้ใช้พิสูจน์ตัวเองผ่านปริศนา ระบบจะวิเคราะห์สัญญาณเชิงพฤติกรรมและเทคนิคของเบราว์เซอร์เบื้องหลัง แล้วตัดสินใจว่าจำเป็นต้องให้ผู้ใช้ทำอะไรเพิ่มเติมหรือไม่ ในหลายกรณีผู้ใช้จะผ่านการตรวจสอบไปโดยไม่เห็นอะไรเลยนอกจากไอคอนเล็ก ๆ ที่กะพริบแล้วหายไป
บทความนี้จะพาไปดูตั้งแต่หลักการทำงานเบื้องหลัง วิธีติดตั้งทั้งฝั่ง frontend และ server, ความแตกต่างของโหมดการทำงาน ไปจนถึงข้อจำกัดที่ต้องเข้าใจก่อนเชื่อว่า Turnstile จะป้องกันบอทได้ทุกกรณี เพราะไม่มีเครื่องมือป้องกันบอทตัวไหนที่สมบูรณ์แบบร้อยเปอร์เซ็นต์
Turnstile คืออะไร และต่างจาก CAPTCHA แบบเดิมยังไง
Turnstile คือบริการตรวจสอบว่าผู้ที่กำลังใช้งานเว็บไซต์เป็นมนุษย์จริงหรือเป็นบอทอัตโนมัติ ของ Cloudflare ที่ฝังลงในหน้าเว็บผ่าน widget ขนาดเล็ก หลักการทำงานต่างจาก CAPTCHA แบบดั้งเดิมที่พึ่งพาปริศนาที่มนุษย์แก้ได้ง่ายกว่าเครื่องจักร Turnstile ใช้การวิเคราะห์สัญญาณหลายอย่างร่วมกัน เช่นพฤติกรรมการเคลื่อนเมาส์ ลักษณะการโหลดหน้าเว็บ และข้อมูลทางเทคนิคของเบราว์เซอร์ เพื่อประเมินความน่าจะเป็นว่าเป็นมนุษย์หรือบอท
จุดต่างที่ชัดเจนที่สุดคือประสบการณ์ผู้ใช้ CAPTCHA แบบเดิมต้องการให้ผู้ใช้ทำอะไรบางอย่างเสมอ เช่นพิมพ์ตัวอักษรหรือเลือกรูปภาพ ในขณะที่ Turnstile ส่วนใหญ่ทำงานแบบไม่ต้องให้ผู้ใช้ทำอะไรเลย ระบบจะตัดสินใจเองว่ากรณีไหนน่าสงสัยพอที่จะต้องขอให้ผู้ใช้ยืนยันเพิ่มเติม เช่นกดปุ่มเช็คบ็อกซ์ครั้งเดียว แทนที่จะให้ทุกคนต้องผ่านด่านเดียวกันหมด
การไม่ต้องแก้ปริศนายังช่วยเรื่อง accessibility ด้วย เพราะ CAPTCHA แบบภาพหรือเสียงมักเป็นอุปสรรคสำหรับผู้ใช้ที่มีข้อจำกัดทางการมองเห็นหรือการได้ยิน Turnstile ที่ทำงานเบื้องหลังโดยไม่ต้องให้ผู้ใช้ตีความเนื้อหาใด ๆ จึงเข้าถึงได้ง่ายกว่าสำหรับผู้ใช้กลุ่มนี้
Managed Challenge ทำงานเบื้องหลังโดยผู้ใช้ไม่รู้ตัวได้ยังไง
เมื่อฝัง Turnstile widget ในโหมดที่เรียกว่า Managed Challenge ระบบจะเก็บสัญญาณต่าง ๆ จากเบราว์เซอร์ของผู้ใช้ทันทีที่หน้าเว็บโหลด เช่นการตอบสนองของ JavaScript engine พฤติกรรมการโต้ตอบกับหน้าเว็บ และข้อมูลอื่นที่ช่วยแยกแยะระหว่างเบราว์เซอร์จริงกับสคริปต์อัตโนมัติ แล้วประมวลผลทั้งหมดนี้เพื่อให้คะแนนความน่าเชื่อถือ
ถ้าคะแนนความน่าเชื่อถือสูงพอ ผู้ใช้จะผ่านการตรวจสอบไปเลยโดยไม่ต้องทำอะไรเพิ่มเติม เห็นแค่ widget เล็ก ๆ ที่ขึ้นเครื่องหมายถูกแล้วหายไป กรณีนี้เกิดขึ้นกับผู้ใช้ส่วนใหญ่ที่ใช้เบราว์เซอร์ปกติและมีพฤติกรรมการใช้งานเหมือนมนุษย์ทั่วไป ไม่มีความผิดปกติที่น่าสงสัย
ถ้าสัญญาณที่เก็บได้ยังไม่ชัดเจนพอ ระบบอาจขอให้ผู้ใช้ทำ interactive challenge เพิ่มเติมหนึ่งขั้นตอน เช่นกดเช็คบ็อกซ์ยืนยันตัวตนครั้งเดียว ซึ่งยังง่ายกว่าการแก้ปริศนา CAPTCHA แบบเดิมมาก กรณีนี้มักเกิดกับผู้ใช้ที่ใช้เบราว์เซอร์แปลก ๆ ปิด JavaScript บางส่วน หรือมีพฤติกรรมที่ต่างจากรูปแบบทั่วไป
ติดตั้ง Turnstile บน Frontend และตรวจสอบ Token ฝั่ง Server
การติดตั้ง Turnstile แบ่งเป็นสองฝั่งที่ต้องทำครบทั้งคู่ ฝั่งแรกคือ frontend ที่ฝัง widget ในหน้าเว็บ ฝั่งที่สองคือ server ที่ต้องตรวจสอบ token ที่ widget สร้างขึ้นก่อนยอมรับการกระทำของผู้ใช้ ขั้นตอนต่อไปนี้เป็นลำดับทั่วไปที่ใช้ได้กับฟอร์มส่วนใหญ่
- ฝัง Turnstile script ในหน้าเว็บที่มีฟอร์มที่ต้องการป้องกัน แล้วสร้าง widget div ที่ระบุ site key ซึ่งได้จากการลงทะเบียนโดเมนในหน้า Cloudflare dashboard
- เมื่อผู้ใช้ผ่านการตรวจสอบไม่ว่าจะแบบเงียบหรือแบบต้องกดยืนยัน widget จะสร้าง token ขึ้นมาแล้วใส่ไว้ใน hidden field ของฟอร์มโดยอัตโนมัติ
- เมื่อผู้ใช้ส่งฟอร์ม ให้ server รับ token นั้นมาพร้อมกับข้อมูลฟอร์มอื่น ๆ แล้วส่ง token ไปตรวจสอบกับ API ของ Cloudflare ก่อนดำเนินการต่อ ไม่ควรเชื่อว่ามี token มาแนบแล้วถือว่าผ่านเลยโดยไม่ตรวจสอบจริง
- รับผลตรวจสอบกลับจาก API ซึ่งจะบอกว่า token นั้นถูกต้องและยังไม่หมดอายุหรือไม่ ถ้าผ่าน ให้ดำเนินการฟอร์มต่อตามปกติ ถ้าไม่ผ่าน ให้ปฏิเสธการกระทำนั้นและแจ้งผู้ใช้ให้ลองใหม่
- ตั้งค่า fallback สำหรับกรณีที่ API ตรวจสอบ token ล่มชั่วคราว เพื่อไม่ให้ผู้ใช้จริงทั้งหมดถูกบล็อกเพราะระบบตรวจสอบภายนอกมีปัญหา โดยพิจารณาความเสี่ยงของแต่ละฟอร์มว่ายอมรับความเสี่ยงชั่วคราวได้แค่ไหน
โหมด Managed, Non-interactive และ Invisible ต่างกันยังไง
Turnstile เปิดให้เลือกโหมดการทำงานหลายแบบตามความเข้มงวดที่ต้องการ ตารางด้านล่างสรุปความต่างเพื่อช่วยเลือกโหมดที่เหมาะกับแต่ละฟอร์ม
| โหมด | พฤติกรรมที่ผู้ใช้เห็น | เหมาะกับ |
|---|---|---|
| Managed | ระบบตัดสินใจเองว่าจะให้ผ่านเงียบ ๆ หรือขอ interactive challenge เพิ่ม | ฟอร์มทั่วไปที่ต้องการสมดุลระหว่างความปลอดภัยและประสบการณ์ผู้ใช้ |
| Non-interactive | ไม่มีการขอให้ผู้ใช้ทำอะไรเลย ตรวจสอบจากสัญญาณเบื้องหลังเท่านั้น | งานที่ต้องการรบกวนผู้ใช้น้อยที่สุด แต่ยอมรับความเสี่ยงสูงกว่าเล็กน้อย |
| Invisible | ไม่แสดง widget ให้เห็นเลยในหน้าเว็บ | หน้าที่ต้องการดีไซน์สะอาดโดยไม่มีองค์ประกอบ UI เพิ่ม |
ทำไม Verify Token ฝั่ง Client อย่างเดียวไม่พอ
ข้อผิดพลาดที่พบบ่อยที่สุดในการติดตั้ง Turnstile คือทีมเข้าใจว่าแค่ฝัง widget ในหน้าเว็บแล้วเช็คว่ามี token ส่งมากับฟอร์มก็เพียงพอแล้ว ความจริงคือ token ที่ frontend สร้างขึ้นสามารถถูกปลอมหรือถูก inject เข้าไปในฟอร์มโดยบอทที่ไม่ได้ผ่านการตรวจสอบจริงได้ ถ้า server ไม่ตรวจสอบ token กับ API ของ Cloudflare ก่อน ระบบป้องกันทั้งหมดจะไม่มีความหมายเลย
การ verify ฝั่ง server ต้องส่ง token พร้อมกับ secret key ที่เก็บไว้อย่างปลอดภัยบน server ไปยัง API ตรวจสอบของ Cloudflare แล้วดูผลลัพธ์ที่ส่งกลับมาว่า token นั้นถูกต้องจริงและยังไม่ถูกใช้ไปแล้วหรือไม่ เพราะ token แต่ละตัวควรใช้ได้เพียงครั้งเดียว ถ้ามีคนพยายามส่ง token เดิมซ้ำ server ควรปฏิเสธ
ทีมที่มีระบบ backend อยู่บน Workers อยู่แล้วสามารถเรียก API ตรวจสอบนี้จาก Worker ได้โดยตรงโดยไม่ต้องผ่าน backend แยกต่างหาก ทำให้ทั้ง flow การรับฟอร์มและการตรวจสอบบอทอยู่ในเครือข่ายเดียวกัน ลด latency ของขั้นตอนตรวจสอบเมื่อเทียบกับการเรียกข้าม backend หลายชั้น
ใช้ Turnstile ตรงไหนได้บ้างนอกจากฟอร์ม Login
แม้ตัวอย่างที่พูดถึงบ่อยที่สุดคือฟอร์ม login หรือสมัครสมาชิก แต่ Turnstile มีประโยชน์กับหลายจุดในเว็บไซต์ที่เปิดให้บอทเข้าถึงได้ง่าย เช่นฟอร์มติดต่อที่มักโดน spam ข้อความโฆษณา ช่องคอมเมนต์ที่เปิดสาธารณะ ระบบสมัครรับข่าวสารทางอีเมลที่บอทมักใช้อีเมลปลอมสมัครจำนวนมาก หรือแม้แต่หน้า checkout ที่ต้องป้องกันบอทพยายามทดสอบเลขบัตรเครดิตจำนวนมาก
อีกจุดที่มักถูกมองข้ามคือ API endpoint ที่เปิดสาธารณะโดยไม่ต้อง login เช่น API ค้นหาหรือ API ขอราคาสินค้า ที่บอทอาจใช้ scrape ข้อมูลจำนวนมากในเวลาอันสั้น การฝัง Turnstile ไว้หน้า flow ที่นำไปสู่การเรียก API เหล่านี้ช่วยลดภาระจากการเรียกซ้ำจำนวนมากที่ไม่ได้มาจากผู้ใช้จริง
ทีมที่มีระบบ rate limiting อยู่แล้วสามารถใช้ Turnstile เป็นชั้นป้องกันเพิ่มเติมคู่กัน ไม่ใช่แทนที่กัน เพราะ rate limiting ป้องกันปริมาณ request ที่มากเกินไปในภาพรวม ในขณะที่ Turnstile ช่วยแยกแยะว่า request แต่ละครั้งมาจากมนุษย์หรือบอทตั้งแต่ต้นทาง ทั้งสองกลไกทำงานเสริมกันได้ดีกว่าใช้อย่างใดอย่างหนึ่งเพียงอย่างเดียว
ข้อจำกัดที่ต้องรู้ก่อนเชื่อว่าบล็อกบอทได้ 100%
ไม่มีระบบป้องกันบอทตัวไหนในโลกที่บล็อกบอทได้ทั้งหมดร้อยเปอร์เซ็นต์ Turnstile ก็เช่นกัน บอทที่ซับซ้อนขึ้นเรื่อย ๆ อาจพยายามเลียนแบบพฤติกรรมมนุษย์ให้สมจริงมากขึ้น หรือใช้เบราว์เซอร์จริงควบคุมด้วยสคริปต์แทนการยิง HTTP request ตรง ๆ ซึ่งยากต่อการตรวจจับกว่าบอทแบบง่าย ทีมควรมองว่า Turnstile เป็นชั้นป้องกันหนึ่งในหลายชั้น ไม่ใช่ทางออกเดียวที่แก้ปัญหาสแปมได้ทั้งหมด
อีกข้อจำกัดคือ Turnstile ตรวจสอบว่า 'ผู้ใช้เป็นมนุษย์หรือไม่' แต่ไม่ได้ตรวจสอบว่า 'มนุษย์คนนั้นมีเจตนาดีหรือไม่' คนที่ตั้งใจสแปมด้วยมือเองก็ยังผ่าน Turnstile ได้เพราะเป็นมนุษย์จริง ระบบจึงยังต้องมีชั้นป้องกันอื่นเพิ่ม เช่น content moderation หรือ rate limiting ต่อบัญชี เพื่อจัดการพฤติกรรมไม่พึงประสงค์ที่มาจากมนุษย์จริงด้วย
ทีมที่ทำระบบที่ต้องป้องกันการโจมตีแบบซับซ้อน ควรใช้ Turnstile ร่วมกับกลไกอื่นของ Cloudflare อย่าง Web Application Firewall หรือ Bot Management แทนการพึ่งพา Turnstile เพียงอย่างเดียวสำหรับงานที่มีความเสี่ยงสูง เช่นระบบการเงินหรือระบบที่มีข้อมูลอ่อนไหว
ทำแบบนี้แล้วพัง เพราะลืม Handle กรณี Challenge ล้มเหลว
ทีมที่ไม่ได้เขียนโค้ดรองรับกรณีที่ Turnstile challenge ล้มเหลวหรือ token หมดอายุ มักเจอปัญหาผู้ใช้จริงถูกปฏิเสธโดยไม่มีข้อความอธิบายที่ชัดเจนว่าเกิดอะไรขึ้น ทำให้ผู้ใช้คิดว่าเว็บไซต์มีบั๊กแทนที่จะรู้ว่าต้องลองยืนยันตัวตนใหม่อีกครั้ง การแสดงข้อความที่ชัดเจนเมื่อ challenge ล้มเหลว พร้อมปุ่มให้ลองใหม่ ช่วยลดความสับสนของผู้ใช้ได้มาก
อีกอาการที่พบคือทีมไม่ได้จัดการกรณี token หมดอายุระหว่างที่ผู้ใช้กรอกฟอร์มนาน เช่นฟอร์มยาวที่ผู้ใช้ใช้เวลากรอกหลายนาที token ที่สร้างไว้ตอนโหลดหน้าอาจหมดอายุก่อนที่ผู้ใช้จะกดส่งฟอร์ม ทำให้ server ปฏิเสธการส่งฟอร์มทั้งที่ผู้ใช้เป็นมนุษย์จริง วิธีแก้คือตั้งให้ widget รีเฟรช token อัตโนมัติเป็นระยะ หรือตรวจจับตอนส่งฟอร์มแล้วขอ token ใหม่ถ้าตัวเดิมหมดอายุแล้ว
อาการที่สามคือทีมลืมทดสอบว่าเกิดอะไรขึ้นถ้า API ตรวจสอบ token ของ Cloudflare ล่มชั่วคราว ถ้าโค้ดฝั่ง server เขียนแบบปฏิเสธทุกอย่างทันทีเมื่อเรียก API ไม่สำเร็จ ผู้ใช้จริงทั้งหมดจะถูกบล็อกไปด้วยในช่วงที่บริการภายนอกมีปัญหา ควรออกแบบ fallback ที่เหมาะสมกับความเสี่ยงของแต่ละฟอร์ม เช่นฟอร์มความเสี่ยงต่ำอาจยอมให้ผ่านชั่วคราวพร้อม log ไว้ตรวจสอบทีหลัง แทนที่จะบล็อกผู้ใช้จริงทั้งหมด
สรุป
Turnstile เปลี่ยนวิธีป้องกันบอทจากการทดสอบให้ผู้ใช้พิสูจน์ตัวเองผ่านปริศนา มาเป็นการวิเคราะห์สัญญาณเบื้องหลังที่ผู้ใช้ส่วนใหญ่ไม่รู้ตัวด้วยซ้ำว่ากำลังถูกตรวจสอบอยู่ ทำให้ประสบการณ์ผู้ใช้ดีขึ้นอย่างชัดเจนเมื่อเทียบกับ CAPTCHA แบบเดิม แต่ทีมยังต้องทำการบ้านเรื่อง server-side verification ให้ถูกต้อง ไม่ใช่แค่ฝัง widget แล้วจบ
ควรมองว่า Turnstile เป็นเครื่องมือหนึ่งในหลายชั้นป้องกันสแปมและบอท ไม่ใช่ทางออกเดียวที่ครอบคลุมทุกความเสี่ยง สำหรับระบบที่มีความเสี่ยงสูงกว่าฟอร์มทั่วไป ควรใช้ร่วมกับ rate limiting และเครื่องมือป้องกันอื่นเพื่อสร้างระบบป้องกันที่ครอบคลุมมากขึ้น
- Turnstile วิเคราะห์สัญญาณพฤติกรรมเบื้องหลัง แทนการให้ผู้ใช้แก้ปริศนาแบบ CAPTCHA เดิม
- ต้อง verify token ฝั่ง server ทุกครั้ง เพราะ token ฝั่ง client อย่างเดียวปลอมได้
- มีสามโหมดหลักคือ Managed, Non-interactive และ Invisible ต่างกันที่ความเข้มงวดและ UX
- ไม่บล็อกบอทได้ 100% และไม่ตรวจเจตนาของมนุษย์ ต้องใช้ร่วมกับชั้นป้องกันอื่น
- ต้องออกแบบ fallback สำหรับกรณี token หมดอายุหรือ API ตรวจสอบล่มชั่วคราว ไม่บล็อกผู้ใช้จริงทั้งหมด
คำถามที่พบบ่อย
Turnstile ฟรีสำหรับทุกเว็บไซต์ไหม
แผนการใช้งานและเงื่อนไขราคาควรตรวจสอบจากหน้า pricing ล่าสุดของ Cloudflare เพราะเปลี่ยนแปลงได้ตามช่วงเวลา ไม่ควรอ้างอิงตัวเลขราคาเก่าโดยไม่ตรวจสอบก่อนวางแผนใช้งานจริง
ต้องติดตั้งทั้ง frontend และ server หรือแค่ฝั่งใดฝั่งหนึ่งพอ
ต้องทำทั้งสองฝั่งเสมอ ฝั่ง frontend สร้าง token จากการตรวจสอบพฤติกรรมผู้ใช้ ฝั่ง server ต้องตรวจสอบ token นั้นกับ API ของ Cloudflare ก่อนยอมรับการกระทำ ถ้าทำแค่ฝั่งเดียวระบบป้องกันจะไม่สมบูรณ์และบอทสามารถหลบเลี่ยงได้ง่าย
ผู้ใช้ที่ปิด JavaScript จะผ่าน Turnstile ได้ไหม
โดยทั่วไปจะผ่านไม่ได้ เพราะ Turnstile ต้องใช้ JavaScript ในการเก็บสัญญาณและสร้าง token ทีมควรมี fallback หรือคำอธิบายสำหรับผู้ใช้กลุ่มนี้ ถ้าคาดว่าจะมีผู้ใช้จำนวนหนึ่งที่ปิด JavaScript ด้วยเหตุผลด้าน privacy
token ของ Turnstile ใช้ซ้ำได้กี่ครั้ง
โดยหลักการควรใช้ได้เพียงครั้งเดียว server ควรตรวจสอบว่า token นั้นถูกใช้ไปแล้วหรือยังก่อนยอมรับ ถ้ามีการส่ง token เดิมซ้ำควรปฏิเสธ เพื่อป้องกันการนำ token ที่ถูกดักจับไว้มาใช้ซ้ำโดยไม่ได้รับอนุญาต
Turnstile ป้องกัน DDoS ได้ไหม
Turnstile เน้นแยกแยะมนุษย์กับบอทในระดับการกระทำ เช่นการส่งฟอร์ม ไม่ใช่เครื่องมือป้องกัน DDoS โดยตรง สำหรับการป้องกันการโจมตีปริมาณมากระดับเครือข่าย ควรใช้ร่วมกับบริการป้องกัน DDoS และ Web Application Firewall ของ Cloudflare แยกต่างหาก
ถ้าอยากลดความรบกวนผู้ใช้ให้น้อยที่สุดควรเลือกโหมดไหน
โหมด Non-interactive หรือ Invisible ลดการรบกวนผู้ใช้ได้มากที่สุดเพราะไม่ขอให้ผู้ใช้ทำอะไรเลย แต่ต้องยอมรับว่าความแม่นยำในการแยกแยะบอทอาจต่ำกว่าโหมด Managed เล็กน้อย ควรเลือกตามความเสี่ยงที่ยอมรับได้ของแต่ละฟอร์ม ไม่ใช่เลือกจากความสะดวกอย่างเดียว
อ่านต่อแบบเจาะลึก
ทดลองวัดผลโฆษณาเข้า LINE ฟรี 14 วัน
สมัครแล้วสร้างโปรเจกต์ เชื่อม LINE ติดตั้ง Tracking แล้วเริ่มเห็น Funnel จาก Click ถึง Purchase ได้ทันที ไม่ต้องใช้บัตรเครดิต
เริ่มทดลองใช้ฟรี 14 วันบทความที่เกี่ยวข้อง

เว็บทีมเล็กที่งบจำกัด ควรย้ายจาก Vercel มา Cloudflare Pages ตอนไหน

API เรียกไว on localhost แต่ทำไม Edge Function จริงกลับหน่วงกว่าที่คิด
