Landing Page GuideMở ứng dụng
Khóa 615 phútBài 4/10

Tích hợp biểu mẫu

Kiến trúc nhận form an toàn: endpoint riêng, kiểm tra dữ liệu ở server, chống spam bằng Turnstile và honeypot, lưu vào D1.

Mục tiêu bài học
  • Hiểu luồng dữ liệu từ form tĩnh tới nơi lưu trữ
  • Kiểm tra dữ liệu ở cả trình duyệt và server
  • Chống spam bằng Turnstile và honeypot, giữ secret ở server

Landing Page tĩnh (HTML, CSS, JS) không tự lưu dữ liệu. Để nhận form, bạn cần một endpoint: một địa chỉ phía server nhận dữ liệu, kiểm tra, lưu lại và báo cho người phụ trách. Trên hạ tầng Cloudflare, có thể dùng Workers làm endpoint và D1 (cơ sở dữ liệu SQL) để lưu.

JSONFormMáy chủCRM
Form → endpoint Worker → kiểm tra → lưu D1 → thông báo.
  1. Trình duyệt kiểm tra cơ bản (trường bắt buộc, định dạng email, số điện thoại) để báo lỗi nhanh cho khách.
  2. Form gửi dữ liệu bằng POST tới endpoint, ví dụ /api/lead, kèm token Turnstile.
  3. Worker kiểm tra lại toàn bộ dữ liệu ở server: không tin dữ liệu từ trình duyệt.
  4. Worker gọi API Siteverify của Turnstile bằng secret key để xác thực token.
  5. Worker kiểm tra trường honeypot: nếu có giá trị, bỏ qua yêu cầu.
  6. Lưu lead vào D1 bằng câu lệnh có tham số (prepared statement), tránh SQL injection.
  7. Gửi thông báo (email, webhook tới CRM) và trả về kết quả JSON để trang hiển thị lời cảm ơn.

Chống spam: Turnstile và honeypot

CáchHoạt độngLưu ý
Cloudflare TurnstileWidget xác minh người dùng thật, thường không bắt giải đốBắt buộc xác thực token ở server; site key ở trang, secret key ở server
HoneypotMột trường ẩn với người dùng; bot tự điền thì bị loạiẨn bằng CSS và đặt tabindex="-1", autocomplete="off" để không ảnh hưởng người dùng thật
Giới hạn tần suấtGiới hạn số lần gửi theo thời gianGiảm spam hàng loạt từ một nguồn
Secret key của Turnstile, khóa API email, token CRM tuyệt đối không đặt trong HTML hay JavaScript phía trình duyệt. Lưu chúng bằng secrets của Worker. Ai xem mã nguồn trang cũng đọc được mọi thứ ở frontend.

Dữ liệu cá nhân trong form

  • Chỉ lưu trường cần thiết; không lưu dữ liệu nhạy cảm nếu không bắt buộc
  • Lưu thời điểm và nội dung đồng ý khách đã đánh dấu
  • Giới hạn người có quyền xem dữ liệu lead
  • Có quy trình xóa khi khách yêu cầu và thời hạn lưu trữ rõ ràng
  • Xử lý dữ liệu quy mô lớn hoặc nhạy cảm: nên tham khảo luật sư về Luật 91/2025/QH15
Luôn có phương án dự phòng trên trang: nút Zalo hoặc số điện thoại cạnh form. Nếu endpoint lỗi, khách vẫn liên hệ được, và bạn nên có cảnh báo khi tỷ lệ lỗi tăng.

Thiết kế khối biểu mẫu

Bài tập thực hành

Vẽ sơ đồ kiến trúc nhận form cho Landing Page của bạn: các trường, nơi kiểm tra, cách chống spam, nơi lưu, ai được thông báo, nơi cất secret.

Gợi ý: Dùng 7 bước trong bài làm khung. Đánh dấu rõ phần nào chạy ở trình duyệt, phần nào chạy ở server.

  • Dữ liệu được kiểm tra lại ở server
  • Có Turnstile (xác thực ở server) và honeypot
  • Không có secret nào ở frontend
  • Có lưu bằng chứng đồng ý và quy trình xóa dữ liệu
  • Có phương án liên hệ dự phòng khi form lỗi

Làm bài & lưu ghi chú trong ứng dụng

Kiểm tra kiến thức

1. Token Turnstile cần được xác thực ở đâu?
  1. Chỉ ở trình duyệt
  2. Ở server, gọi API Siteverify bằng secret key
  3. Không cần xác thực
  4. Trong Google Sheets
Xem đáp án

B. Ở server, gọi API Siteverify bằng secret key — Xác thực ở trình duyệt có thể bị giả mạo; chỉ server giữ secret key mới xác nhận token hợp lệ.

2. Honeypot là gì?
  1. Một loại cookie quảng cáo
  2. Trường ẩn với người dùng, bot tự điền sẽ bị loại
  3. Mã giảm giá
  4. Một công cụ email
Xem đáp án

B. Trường ẩn với người dùng, bot tự điền sẽ bị loại — Người dùng thật không thấy nên để trống trường này; bot điền mọi ô sẽ bị phát hiện.

3. Vì sao phải kiểm tra dữ liệu lại ở server dù trình duyệt đã kiểm tra?
  1. Vì trình duyệt chậm
  2. Vì kẻ xấu có thể bỏ qua trình duyệt và gửi thẳng tới endpoint
  3. Vì luật bắt buộc dùng server
  4. Không cần
Xem đáp án

B. Vì kẻ xấu có thể bỏ qua trình duyệt và gửi thẳng tới endpoint — Kiểm tra ở trình duyệt chỉ để tiện cho người dùng; bất kỳ ai cũng có thể gửi yêu cầu trực tiếp tới endpoint.

Nguồn tham khảo chính thức