← Cloudflare Turnstile / turnstile / tutorials
Защита форм
Это руководство проведёт вас через интеграцию Cloudflare Turnstile для защиты веб-форм: входа, регистрации или обратной связи. Вы узнаете, как разместить виджет Turnstile на стороне клиента и проверить токен Turnstile через Siteverify API на стороне сервера.
Перед началом работы
- Вам потребуется учётная запись Cloudflare.
- Вам потребуется веб-приложение с формой, которую нужно защитить.
- Вам потребуются базовые знания HTML и выбранного серверного языка, например Node.js или Python.
Получение sitekey и секретного ключа Turnstile
- На панели управления Cloudflare перейдите к разделу Turnstile страницу. Перейдите в Turnstile ↗
- Создание нового виджета Turnstile.
- Скопируйте sitekey и секретный ключ: они понадобятся на следующем шаге.
Добавьте виджет Turnstile в HTML-форму
- Добавьте виджет Turnstile в форму.
- Замените
<YOUR-SITE-KEY>на sitekey, полученный в Cloudflare. - Добавьте
data-callbackк элементу div виджета Turnstile. Эта функция JavaScript будет вызвана после успешного прохождения проверки. - Кнопка отправки формы должна быть изначально неактивна.
Пример
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Contact Form</title>
<script
src="https://challenges.cloudflare.com/turnstile/v0/api.js"
async
defer
></script>
<script>
function enableSubmit() {
document.getElementById("submit-button").disabled = false;
}
</script>
</head>
<body>
<form id="contact-form" action="/submit" method="POST">
<input type="text" name="name" placeholder="Name" required />
<input type="email" name="email" placeholder="Email" required />
<textarea name="message" placeholder="Message" required></textarea>
<!-- Turnstile widget -->
<div
class="cf-turnstile"
data-sitekey="<YOUR-SITE-KEY>"
data-callback="enableSubmit"
></div>
<button type="submit" id="submit-button" disabled>Submit</button>
</form>
</body>
</html>Проверка токена Turnstile на стороне сервера
Токен Turnstile, отправленный с клиентской стороны, нужно проверить. Ниже приведён пример на Node.js.
Пример на Node.js
const express = require("express");
const axios = require("axios");
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.post("/submit", async (req, res) => {
const turnstileToken = req.body["cf-turnstile-response"];
const secretKey = "your-secret-key";
try {
const response = await axios.post(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
null,
{
params: {
secret: secretKey,
response: turnstileToken,
},
},
);
if (response.data.success) {
// Token is valid, proceed with form submission
const name = req.body.name;
const email = req.body.email;
const message = req.body.message;
// Your form processing logic here
res.send("Form submission successful");
} else {
res.status(400).send("Turnstile verification failed");
}
} catch (error) {
res.status(500).send("Error verifying Turnstile token");
}
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});Важные замечания
Правильная проверка токена Turnstile критически важна. В этом разделе собраны ключевые моменты, о которых стоит помнить.
Проверка токена после ввода данных формы
- Проверяйте токен Turnstile только после того, как пользователь заполнил форму и нажал submit.
- Если проверять токен до того, как пользователь введёт данные, злоумышленник сможет обойти защиту: получив действительный токен, он подменит отправляемые данные формы.
Правильная реализация сценария
- Когда пользователь отправляет форму, передайте на сервер и данные формы, и токен Turnstile.
- На стороне сервера сначала проверьте токен Turnstile.
- По ответу сервиса проверки решите, обрабатывать ли данные формы дальше.