← Cloudflare Turnstile / turnstile / tutorials
Условное применение Turnstile
В этом руководстве показано, как включать Turnstile выборочно, в зависимости от входящего запроса: например, по заранее согласованному секрету в заголовке или по конкретному IP-адресу.
Обзор
В некоторых конфигурациях, например при автоматизации, проверка Turnstile не загружается или не выполняется. Использование HTMLRewriter, в этом руководстве показано, как обрабатывать в зависимости от условий клиентский виджет и Siteverify API при выполнении определённых условий.
Внедрение
В этом руководстве мы изменим существующий Демонстрация Turnstile ↗, чтобы условно удалить существующий script и контейнерные элементы виджета.
export default {
async fetch(request) {
// ...
+ if (request.headers.get("x-bypass-turnstile") === "VerySecretValue") {
+ class RemoveHandler {
+ element(element) {
+ element.remove();
+ }
+ }
+
+ return new HTMLRewriter()
+ // Remove the script tag
+ .on(
+ 'script[src="https://challenges.cloudflare.com/turnstile/v0/api.js"]',
+ new RemoveHandler(),
+ )
+ // Remove the container used in implicit rendering
+ .on(
+ '.cf-turnstile',
+ new RemoveHandler(),
+ )
+ // Remove the container used in explicit rendering
+ .on(
+ '#myWidget',
+ new RemoveHandler(),
+ )
+ .transform(body);
+ }
return new Response(body, {
headers: {
"Content-Type": "text/html",
},
});
},
};Интеграция на стороне сервера
Если сработала та же логика, по которой мы убрали клиентские элементы, проверка завершится досрочно.
async function handlePost(request) {
+ if (request.headers.get("x-bypass-turnstile") === "VerySecretValue") {
+ return new Response('Turnstile not enforced on this request')
+ }
// Proceed with validation as normal!
const body = await request.formData();
// Turnstile injects a token in "cf-turnstile-response".
const token = body.get('cf-turnstile-response');
const ip = request.headers.get('CF-Connecting-IP');
// ...
}После этих изменений Turnstile не будет применяться к запросам с заголовком x-bypass-turnstile: VerySecretValue присутствует.
Демонстрация
После выполнения npm run dev в папке проекта, изменения можно проверить следующей командой:
curl -X POST http://localhost:8787/handler -H "x-bypass-turnstile: VerySecretValue"Turnstile not enforced on this request