ข้ามไปยังเนื้อหา

Cloudflare Turnstile

Cloudflare Turnstile ใส่ challenge ของ Cloudflare ไว้ในฟอร์มเข้าสู่ระบบของแอดมิน ทุกครั้งที่มีคนพยายามเข้าสู่ระบบ เซิร์ฟเวอร์จะถาม Cloudflare ก่อนแล้วจึงตรวจ passkey ถ้าไม่ผ่าน challenge ก็จะไปต่อไม่ได้ ปลั๊กอินนี้ดูแลแค่การเข้าสู่ระบบเท่านั้น ผู้อ่านไม่เคยเจอ และไม่เคยขวางการกู้คืนบัญชี

หน้า “ปลั๊กอิน” ใต้ “หน้าตาเว็บไซต์” ในกลุ่ม “การตั้งค่า” มีการ์ดของปลั๊กอินทุกตัวที่มากับ TomeCMS ทุกตัวปิดอยู่จนกว่าคุณจะเปิดเอง

หน้า “ปลั๊กอิน” มีการ์ดห้าใบ คือ “Cloudflare Turnstile” “Sticky Banner” “Popup” “Image lightbox” และ “Jev (TypeSafe AI)” แต่ละใบมีชื่อปลั๊กอินและคำอธิบายว่าทำอะไร ถัดลงมาเป็นแถบบอกว่าปลั๊กอินทำงานตรงไหน เช่น “หน้าเข้าสู่ระบบผู้ดูแล” หรือ “ทุกหน้าสาธารณะ” แล้วจึงเป็นสวิตช์กับปุ่ม “ตั้งค่า” การ์ด Turnstile, Popup และ Jev ขึ้นว่า “ยังไม่ได้ตั้งค่า” ส่วน Sticky Banner และ Image lightbox ขึ้นว่า “ปิด” ข้างการ์ด Jev คือการ์ด “ปลั๊กอินมาจากไหน” และข้างล่างคือ “ปลั๊กอินล็อกคุณออกจากระบบไม่ได้”

แถบบนการ์ดแต่ละใบบอกว่าปลั๊กอินทำงานตรงไหน คือ “หน้าเข้าสู่ระบบผู้ดูแล” “ทุกหน้าสาธารณะ” หรือ “คำแนะนำระหว่างเขียน” สวิตช์ท้ายการ์ดมีผลทันทีที่กด และคำข้างสวิตช์บอกสถานะ คือ “เปิด” “ปิด” หรือ “ยังไม่ได้ตั้งค่า” ถ้ายังมีการตั้งค่าที่ปลั๊กอินต้องใช้แต่ยังว่างอยู่ ปลั๊กอินที่ยังไม่ได้ตั้งค่าจะเปิดใช้ไม่ได้

ปุ่ม “ตั้งค่า” เปิดแผงการตั้งค่าของปลั๊กอินขึ้นมาทางข้างจอ ชื่อแผงคือ “ตั้งค่า” ตามด้วยชื่อปลั๊กอิน ระหว่างที่ยังขาดข้อมูลที่ต้องใช้ ด้านบนของแผงจะขึ้นว่า “กรอกข้อมูลที่จำเป็นให้ครบก่อนเปิดใช้งาน” กด “บันทึก” แล้วการ์ดจะขึ้นว่า “บันทึกแล้ว” การบันทึกไม่เปลี่ยนสถานะเปิดหรือปิดของปลั๊กอิน

การตั้งค่าบางช่องเป็นค่าลับ เช่น key ของบริการอื่น ค่าลับถูกเข้ารหัสด้วย TOME_CMS_CONTEXT_SECRET ก่อนเก็บ และไม่เคยถูกส่งกลับมาที่เบราว์เซอร์ ช่องนี้จึงว่างอยู่เสมอ และเมื่อเก็บค่าไว้แล้วจะขึ้นว่า “เก็บไว้แล้ว เว้นว่างไว้เพื่อใช้ค่าเดิม” ถ้าเว้นว่างไว้ ค่าที่เก็บไว้จะยังอยู่ ถ้าพิมพ์ค่าใหม่ ค่าเดิมจะถูกแทนที่ หน้าการตั้งค่าอธิบายว่าทำไมห้ามเปลี่ยนค่านี้หลังติดตั้งเว็บแล้ว

ปลั๊กอินมาพร้อมกับ TomeCMS ตามที่การ์ด “ปลั๊กอินมาจากไหน” บอกไว้ หน้านี้ไม่มีทางติดตั้งปลั๊กอินเพิ่ม การ์ด “ปลั๊กอินล็อกคุณออกจากระบบไม่ได้” บอกเหตุผลไว้ว่า ปลั๊กอินถูกถามตอนมีคนพยายามเข้าสู่ระบบเท่านั้น ไม่เคยถูกถามตอนกู้คืนบัญชี และคำตอบที่ถามไม่ได้ก็ไม่นับเป็นการปฏิเสธ ปลั๊กอินทุกตัวยังสั่งปิดจากเซิร์ฟเวอร์ได้ด้วย npm run plugin:disable ตามด้วย id ของปลั๊กอิน คือ turnstile, typesafe ของ Jev, notice ของ Sticky Banner, popup และ lightbox

  1. ใน dashboard ของ Cloudflare ให้เพิ่ม widget ของ Turnstile สำหรับชื่อโฮสต์ของเว็บคุณ ซึ่งก็คือชื่อใน TOME_CMS_PUBLIC_URL แล้ว Cloudflare จะให้ site key กับ secret key มา
  2. บนการ์ด “Cloudflare Turnstile” กด “ตั้งค่า” วาง key ทั้งสองลงไป แล้วกด “บันทึก”
  3. เปิดสวิตช์ การ์ดจะขึ้นว่า “เปิด”
การตั้งค่า ในหน้าภาษาอังกฤษ ใช้ทำอะไร
“Site key” “Site key” key ที่ทำให้ challenge แสดงในฟอร์มเข้าสู่ระบบ เป็นข้อมูลสาธารณะ และถูกส่งไปถึงเบราว์เซอร์ของคุณพร้อมกับฟอร์ม ต้องกรอก
“Secret key” “Secret key” key ที่เซิร์ฟเวอร์ใช้ถาม Cloudflare ว่าผ่าน challenge หรือไม่ เก็บแบบเข้ารหัสและจะไม่แสดงอีก ต้องกรอก

challenge จะขึ้นก็ต่อเมื่อเก็บ key ไว้ครบทั้งสองตัวแล้ว

ฟอร์มเข้าสู่ระบบจะมี challenge อยู่เหนือปุ่ม passkey เมื่อคุณเข้าสู่ระบบด้วย passkey เซิร์ฟเวอร์จะส่งคำตอบของ challenge ไปให้ Cloudflare ก่อน แล้วรอคำตอบไม่เกินห้าวินาที

Cloudflare ตอบว่า ผลที่ตามมา
ผ่าน challenge เซิร์ฟเวอร์ตรวจ passkey ต่อตามปกติ
คำตอบผิด ถูกใช้ไปแล้ว หรือไม่มีคำตอบเพราะ challenge ไม่ขึ้นเลย การเข้าสู่ระบบถูกปฏิเสธ และฟอร์มขึ้นว่า “ไม่ผ่านการตรวจสอบก่อนเข้าสู่ระบบ” พร้อมบอกให้ลองอีกครั้ง หรือปิดปลั๊กอินจากเซิร์ฟเวอร์
ไม่ได้คำตอบที่ใช้ได้ เช่น secret key ผิด Cloudflare ตอบกลับเป็นข้อผิดพลาด ติดต่อไม่ได้ หรือไม่ตอบภายในห้าวินาที เซิร์ฟเวอร์บันทึกสาเหตุลง log แล้วตรวจ passkey ต่อ

แถวสุดท้ายนี้เองที่ทำให้ secret key ที่พิมพ์ผิดไม่ล็อกคุณออกจากเว็บของตัวเอง challenge ไม่ได้ขวางการสร้าง passkey เช่นกัน /recovery จึงใช้ได้เสมอไม่ว่าจะเปิดปลั๊กอินไว้หรือไม่ ถ้า challenge ไม่ขึ้นในเบราว์เซอร์ของคุณ ให้ปิดปลั๊กอินจากเซิร์ฟเวอร์ตามที่หน้ากลับเข้าหน้าผู้ดูแลบอกไว้

challenge เป็นของหน้าเข้าสู่ระบบเท่านั้น เมื่อคุณเข้าสู่ระบบอยู่แล้วและแอดมินขอ passkey อีกครั้ง เพื่อติดตั้งอัปเดตหรือสร้างรหัสกู้คืนชุดใหม่ จะไม่แสดงและไม่ตรวจ challenge ใน 1.1.0 และก่อนหน้าจะตรวจ และสองอย่างนั้นก็ใช้ไม่ได้ ดูแก้ปัญหา

ในเบราว์เซอร์ของคุณ หน้าเข้าสู่ระบบของแอดมินจะโหลดสคริปต์ของ Cloudflare จาก challenges.cloudflare.com และ challenge ทำงานอยู่ในหน้านั้น Cloudflare จึงเห็นสิ่งเดียวกับที่เว็บไหนก็เห็นเมื่อเบราว์เซอร์ไปโหลดไฟล์จากเว็บนั้น รวมถึง address ของคุณ หน้าอื่นไม่โหลดสคริปต์นี้ และผู้อ่านหน้าเว็บสาธารณะไม่มีทางไปถึง Cloudflare ผ่านปลั๊กอินนี้

จากฝั่งเซิร์ฟเวอร์ การเข้าสู่ระบบแต่ละครั้งจะส่ง secret key คำตอบที่ challenge ให้เบราว์เซอร์ของคุณไว้ และ address ที่การเข้าสู่ระบบนั้นมาจาก ไปที่ siteverify ของ Cloudflare ไม่มีข้อมูลเนื้อหาหรือผู้อ่านของคุณถูกส่งไปเลย หน้าสิ่งที่เบราว์เซอร์ของผู้อ่านเก็บไว้รวบรวมบริการทั้งหมดที่เว็บติดต่อได้ไว้