{"id":7360,"date":"2026-04-09T19:03:15","date_gmt":"2026-04-09T18:03:15","guid":{"rendered":"https:\/\/www.k3bone.com\/blog\/?p=7360"},"modified":"2026-04-10T09:58:09","modified_gmt":"2026-04-10T08:58:09","slug":"sustituye-google-recaptcha-por-cloudflare-turnstile-en-tu-web","status":"publish","type":"post","link":"https:\/\/www.k3bone.com\/blog\/2026\/04\/sustituye-google-recaptcha-por-cloudflare-turnstile-en-tu-web\/","title":{"rendered":"Sustituye Google reCAPTCHA por Cloudflare Turnstile en tu web"},"content":{"rendered":"<h2>Qu\u00e9 es Cloudflare Turnstile<\/h2>\n<p><strong>Cloudflare Turnstile<\/strong>\u00a0es un sistema de verificaci\u00f3n que sustituye a los CAPTCHA tradicionales. En lugar de mostrar desaf\u00edos visuales, ejecuta una serie de comprobaciones JavaScript en el navegador (proof-of-work, pruebas de espacio, detecci\u00f3n de comportamientos humanos) y decide si el visitante es humano o bot sin pedirle interacci\u00f3n.<\/p>\n<p>Turnstile tiene tres modos de widget: <strong>gestionado<\/strong>\u00a0(el recomendado, decide autom\u00e1ticamente si muestra un checkbox o no),\u00a0<strong>no interactivo<\/strong>\u00a0(el visitante nunca interact\u00faa con el widget) e\u00a0<strong>invisible<\/strong>\u00a0(el widget es completamente oculto). Tambi\u00e9n es compatible con WCAG 2.2 AAA, lo que lo hace accesible para personas con discapacidad. Y no hace falta que tu web pase por la red CDN de Cloudflare: funciona en cualquier sitio, sea cual sea el hosting.<\/p>\n<p>Seg\u00fan Cloudflare, Turnstile gestiona m\u00e1s de 50 millones de verificaciones diarias y su tasa de resoluci\u00f3n sin interacci\u00f3n supera el 99% en sitios de bajo riesgo.<\/p>\n<h2>Por qu\u00e9 cambiar de Google reCAPTCHA a Turnstile<\/h2>\n<p>Si llevas tiempo usando\u00a0<strong>Google reCAPTCHA<\/strong>, quiz\u00e1 te preguntes si merece la pena cambiar. Hay varias razones para plante\u00e1rselo:<\/p>\n<table>\n<thead>\n<tr>\n<th>Caracter\u00edstica<\/th>\n<th>Google reCAPTCHA v2\/v3<\/th>\n<th>Cloudflare Turnstile<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Interacci\u00f3n del usuario<\/strong><\/td>\n<td>puzzles visuales o seguimiento de comportamiento<\/td>\n<td>sin interacci\u00f3n en la mayor\u00eda de casos<\/td>\n<\/tr>\n<tr>\n<td><strong>Privacidad<\/strong><\/td>\n<td>recopila datos de navegaci\u00f3n y los comparte con Google<\/td>\n<td>centrado en privacidad, sin tracking publicitario<\/td>\n<\/tr>\n<tr>\n<td><strong>Dependencia<\/strong><\/td>\n<td>vinculado al ecosistema Google<\/td>\n<td>funciona sin depender de Google<\/td>\n<\/tr>\n<tr>\n<td><strong>Coste<\/strong><\/td>\n<td>gratis hasta cierto volumen<\/td>\n<td>gratis para los primeros 100.000 dominios, luego planes de pago<\/td>\n<\/tr>\n<tr>\n<td><strong>Accesibilidad<\/strong><\/td>\n<td>WCAG 2.1 AA (con problemas conocidos)<\/td>\n<td>WCAG 2.2 AAA<\/td>\n<\/tr>\n<tr>\n<td><strong>Rendimiento<\/strong><\/td>\n<td>impacta en velocidad de carga<\/td>\n<td>script m\u00e1s ligero, menor impacto<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La principal ventaja de Turnstile es la\u00a0<strong>experiencia del usuario<\/strong>. Los visitantes no tienen que resolver ning\u00fan puzzle, y en la mayor\u00eda de los casos ni siquiera ven el widget. Menos fricci\u00f3n en formularios de contacto, registros y compras se traduce en m\u00e1s conversiones y menos abandonos.<\/p>\n<p>En cuanto a privacidad, Google reCAPTCHA recopila informaci\u00f3n de navegaci\u00f3n para sus propios fines publicitarios. Turnstile no utiliza los datos de verificaci\u00f3n con fines de publicidad.<\/p>\n<h2>C\u00f3mo crear un widget de Turnstile en Cloudflare<\/h2>\n<p>Antes de a\u00f1adir Turnstile a tu web, necesitas crear un widget en el panel de Cloudflare:<\/p>\n<ol>\n<li><strong>Crear una cuenta en Cloudflare<\/strong>: Si no tienes una, reg\u00edstrate en\u00a0<a href=\"https:\/\/dash.cloudflare.com\/\" target=\"_blank\" rel=\"noopener\">dash.cloudflare.com<\/a>. Es gratis.<\/li>\n<li><strong>Acceder a Turnstile<\/strong>: Desde el panel, ve a la secci\u00f3n \u00abTurnstile\u00bb en el men\u00fa lateral.<\/li>\n<li><strong>Crear un widget<\/strong>: Pulsa \u00abAdd site\u00bb y rellena los datos: un nombre descriptivo (por ejemplo, \u00abFormulario de contacto\u00bb), los dominios donde lo vas a usar y el modo de widget (gestionado, no interactivo o invisible).<\/li>\n<li><strong>Guardar las claves<\/strong>: Al crear el widget, Cloudflare te da dos claves: la\u00a0<strong>sitekey<\/strong>\u00a0(clave p\u00fablica, va en el HTML) y la\u00a0<strong>secret key<\/strong> (clave privada, va en el servidor para validar el token). Gu\u00e1rdalas en un lugar seguro.<\/li>\n<\/ol>\n<p>La\u00a0<strong>sitekey<\/strong>\u00a0se usa en el lado cliente para mostrar el widget. La\u00a0<strong>secret key<\/strong>\u00a0se usa en el servidor para verificar que el token es v\u00e1lido. Nunca la expongas en tu c\u00f3digo frontend.<\/p>\n<p><a href=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7362\" src=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2.jpg\" alt=\"\" width=\"1358\" height=\"834\" srcset=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2.jpg 1358w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2-1024x629.jpg 1024w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2-768x472.jpg 768w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2-640x393.jpg 640w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2-400x246.jpg 400w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2-367x225.jpg 367w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-2-1320x811.jpg 1320w\" sizes=\"auto, (max-width: 1358px) 100vw, 1358px\" \/><\/a><\/p>\n<h2>Implementar Turnstile en una web est\u00e1ndar (HTML + PHP)<\/h2>\n<p>La implementaci\u00f3n tiene dos partes: el widget en tu HTML y la validaci\u00f3n del token en PHP. Vamos a ver ambas.<\/p>\n<h3>Paso 1: A\u00f1adir el script y el widget al formulario<\/h3>\n<p>Incluye el script de Turnstile en tu p\u00e1gina HTML y coloca el widget dentro del formulario. Vamos a usar el renderizado impl\u00edcito, el m\u00e1s sencillo para p\u00e1ginas est\u00e1ticas:<\/p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\r\n&lt;html lang=\"es\"&gt;\r\n&lt;head&gt;\r\n    &lt;meta charset=\"UTF-8\"&gt;\r\n    &lt;title&gt;Formulario de contacto&lt;\/title&gt;\r\n    &lt;!-- Script de Turnstile --&gt;\r\n    &lt;script src=\"https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js\" async defer&gt;&lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n    &lt;h1&gt;Contacto&lt;\/h1&gt;\r\n    &lt;form action=\"procesar.php\" method=\"POST\"&gt;\r\n        &lt;label for=\"nombre\"&gt;Nombre:&lt;\/label&gt;\r\n        &lt;input type=\"text\" id=\"nombre\" name=\"nombre\" required&gt;\r\n\r\n        &lt;label for=\"email\"&gt;Email:&lt;\/label&gt;\r\n        &lt;input type=\"email\" id=\"email\" name=\"email\" required&gt;\r\n\r\n        &lt;label for=\"mensaje\"&gt;Mensaje:&lt;\/label&gt;\r\n        &lt;textarea id=\"mensaje\" name=\"mensaje\" required&gt;&lt;\/textarea&gt;\r\n\r\n        &lt;!-- Widget de Turnstile --&gt;\r\n        &lt;div class=\"cf-turnstile\" data-sitekey=\"TU_SITEKEY_AQUI\"&gt;&lt;\/div&gt;\r\n\r\n        &lt;button type=\"submit\"&gt;Enviar&lt;\/button&gt;\r\n    &lt;\/form&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/code><\/pre>\n<p>El\u00a0<code>&lt;div class=\"cf-turnstile\"&gt;<\/code>\u00a0se coloca dentro del formulario. Al enviarlo, Turnstile a\u00f1ade autom\u00e1ticamente un campo oculto llamado\u00a0<code>cf-turnstile-response<\/code>\u00a0con el token de verificaci\u00f3n. No tienes que hacer nada extra en el HTML.<\/p>\n<p>Puedes personalizar el widget con atributos\u00a0<code>data-<\/code>:<\/p>\n<ul>\n<li><code>data-theme=\"light|dark|auto\"<\/code>: aspecto visual del widget.<\/li>\n<li><code>data-size=\"normal|compact|flexible\"<\/code>: tama\u00f1o del widget.<\/li>\n<li><code>data-callback=\"nombreFuncion\"<\/code>: funci\u00f3n JavaScript que se ejecuta al completar la verificaci\u00f3n.<\/li>\n<li><code>data-error-callback=\"nombreFuncion\"<\/code>: funci\u00f3n que se ejecuta si hay error.<\/li>\n<\/ul>\n<h3>Paso 2: Validar el token en PHP (lado servidor)<\/h3>\n<p>Lo anterior solo muestra el widget y genera un token. Para que la protecci\u00f3n funcione, tu servidor tiene que verificar ese token con la API de Cloudflare. Sin esta verificaci\u00f3n, cualquiera puede enviar un formulario sin pasar por Turnstile.<\/p>\n<p>Crea un archivo\u00a0<code>procesar.php<\/code>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\r\n\/\/ Tu secret key de Turnstile (NUNCA expongas esta clave en el frontend)\r\n$secret_key = 'TU_SECRET_KEY_AQUI';\r\n\r\n\/\/ Recoger el token enviado por el formulario\r\n$token = $_POST['cf-turnstile-response'] ?? '';\r\n\r\n\/\/ IP del visitante (opcional pero recomendado)\r\n$remoteip = $_SERVER['HTTP_CF_CONNECTING_IP']\r\n    ?? $_SERVER['HTTP_X_FORWARDED_FOR']\r\n    ?? $_SERVER['REMOTE_ADDR'];\r\n\r\n\/\/ Llamar a la API de verificaci\u00f3n de Cloudflare\r\n$url = 'https:\/\/challenges.cloudflare.com\/turnstile\/v0\/siteverify';\r\n$data = [\r\n    'secret'   =&gt; $secret_key,\r\n    'response' =&gt; $token,\r\n    'remoteip' =&gt; $remoteip\r\n];\r\n\r\n$options = [\r\n    'http' =&gt; [\r\n        'header'  =&gt; \"Content-type: application\/x-www-form-urlencoded\\r\\n\",\r\n        'method'  =&gt; 'POST',\r\n        'content' =&gt; http_build_query($data)\r\n    ]\r\n];\r\n\r\n$context  = stream_context_create($options);\r\n$response = file_get_contents($url, false, $context);\r\n$result   = json_decode($response, true);\r\n\r\nif ($result['success']) {\r\n    \/\/ Token v\u00e1lido: procesar el formulario\r\n    echo \"Formulario enviado correctamente.\";\r\n    \/\/ Aqu\u00ed va tu l\u00f3gica: guardar en base de datos, enviar email, etc.\r\n} else {\r\n    \/\/ Token inv\u00e1lido: rechazar el env\u00edo\r\n    echo \"Verificaci\u00f3n fallida. Int\u00e9ntalo de nuevo.\";\r\n    error_log('Turnstile error: ' . implode(', ', $result['error-codes']));\r\n}\r\n?&gt;<\/code><\/pre>\n<p>Este c\u00f3digo env\u00eda el token y tu secret key al endpoint de Cloudflare. Si la respuesta es\u00a0<code>\"success\": true<\/code>, el token es v\u00e1lido y puedes procesar el formulario. Si no, rechazas el env\u00edo.<\/p>\n<p>Puntos a tener en cuenta:<\/p>\n<ul>\n<li><strong>Los tokens expiran a los 5 minutos<\/strong>\u00a0(300 segundos). Cada token se puede usar una sola vez.<\/li>\n<li><strong>La validaci\u00f3n del lado servidor es obligatoria<\/strong>. Si solo pones el widget en el HTML sin validar en el servidor, cualquier bot puede saltarse la protecci\u00f3n.<\/li>\n<li><strong>Nunca pongas la secret key en tu c\u00f3digo JavaScript<\/strong>. Tiene que quedarse en el servidor, siempre.<\/li>\n<\/ul>\n<h3>Validar el token en Node.js<\/h3>\n<p>Si tu backend est\u00e1 en Node.js, la l\u00f3gica de validaci\u00f3n es la misma: enviar el token y la secret key al endpoint de Cloudflare y comprobar la respuesta. Aqu\u00ed tienes un ejemplo con Express:<\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\r\nconst app = express();\r\n\r\napp.use(express.urlencoded({ extended: true }));\r\n\r\nconst SECRET_KEY = 'TU_SECRET_KEY_AQUI';\r\n\r\nasync function validarTurnstile(token, remoteip) {\r\n    const params = new URLSearchParams();\r\n    params.append('secret', SECRET_KEY);\r\n    params.append('response', token);\r\n    if (remoteip) params.append('remoteip', remoteip);\r\n\r\n    const respuesta = await fetch(\r\n        'https:\/\/challenges.cloudflare.com\/turnstile\/v0\/siteverify',\r\n        {\r\n            method: 'POST',\r\n            body: params\r\n        }\r\n    );\r\n\r\n    return await respuesta.json();\r\n}\r\n\r\napp.post('\/contacto', async (req, res) =&gt; {\r\n    const token = req.body['cf-turnstile-response'];\r\n    const ip = req.headers['cf-connecting-ip']\r\n        || req.headers['x-forwarded-for']\r\n        || req.socket.remoteAddress;\r\n\r\n    const resultado = await validarTurnstile(token, ip);\r\n\r\n    if (resultado.success) {\r\n        \/\/ Token v\u00e1lido: procesar el formulario\r\n        res.send('Formulario enviado correctamente.');\r\n    } else {\r\n        \/\/ Token inv\u00e1lido: rechazar el env\u00edo\r\n        console.error('Turnstile error:', resultado['error-codes']);\r\n        res.status(400).send('Verificaci\u00f3n fallida. Int\u00e9ntalo de nuevo.');\r\n    }\r\n});\r\n\r\napp.listen(3000);<\/code><\/pre>\n<p>Al igual que en PHP, la secret key debe guardarse en una variable de entorno, no en el c\u00f3digo fuente. Puedes usar\u00a0<code>process.env.TURNSTILE_SECRET_KEY<\/code>\u00a0en lugar de la constante directa.<\/p>\n<p>Si todo ha funcionado bien, ver\u00e1s el icono (modo gestionado) de CloudFlare similar a este:<\/p>\n<p><a href=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-icono.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7364\" src=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-icono.jpg\" alt=\"\" width=\"411\" height=\"123\" srcset=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-icono.jpg 411w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-icono-400x120.jpg 400w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/captcha-cloudflare-turnstile-icono-367x110.jpg 367w\" sizes=\"auto, (max-width: 411px) 100vw, 411px\" \/><\/a><\/p>\n<p>Tienes la informaci\u00f3n completa de implementaci\u00f3n en el <a href=\"https:\/\/developers.cloudflare.com\/turnstile\/get-started\/client-side-rendering\/\" target=\"_blank\" rel=\"noopener\">sitio web de CloudFlare<\/a>.<\/p>\n<h3>Ejemplo con callbacks (opcional)<\/h3>\n<p>Si quieres m\u00e1s control, puedes usar callbacks para habilitar o deshabilitar el bot\u00f3n de env\u00edo:<\/p>\n<pre><code class=\"language-html\">&lt;div\r\n    class=\"cf-turnstile\"\r\n    data-sitekey=\"TU_SITEKEY_AQUI\"\r\n    data-callback=\"onTurnstileSuccess\"\r\n    data-error-callback=\"onTurnstileError\"\r\n    data-expired-callback=\"onTurnstileExpired\"\r\n&gt;&lt;\/div&gt;\r\n&lt;button type=\"submit\" id=\"btn-enviar\" disabled&gt;Enviar&lt;\/button&gt;\r\n\r\n&lt;script&gt;\r\n    function onTurnstileSuccess(token) {\r\n        document.getElementById('btn-enviar').disabled = false;\r\n    }\r\n    function onTurnstileError(code) {\r\n        document.getElementById('btn-enviar').disabled = true;\r\n    }\r\n    function onTurnstileExpired() {\r\n        document.getElementById('btn-enviar').disabled = true;\r\n    }\r\n&lt;\/script&gt;<\/code><\/pre>\n<p>As\u00ed el bot\u00f3n de env\u00edo solo se activa cuando Turnstile verifica correctamente al visitante, y se desactiva si hay error o si el token expira.<\/p>\n<h2>Implementar Turnstile en WordPress<\/h2>\n<p>Si tu web usa WordPress, no necesitas tocar nada de c\u00f3digo. Hay plugins que integran Turnstile en unos minutos.<\/p>\n<h3>Plugin recomendado: Simple Cloudflare Turnstile<\/h3>\n<p>El plugin\u00a0<strong>Simple Cloudflare Turnstile<\/strong>\u00a0(por Elliot Sowersby \/ RelyWP) es la opci\u00f3n m\u00e1s usada, con m\u00e1s de 100.000 instalaciones activas. Es gratis y compatible con los principales plugins de formularios:<\/p>\n<ul>\n<li><strong>Contact Form 7<\/strong><\/li>\n<li><strong>WooCommerce<\/strong>\u00a0(login, registro, checkout)<\/li>\n<li><strong>WordPress Login y Registro<\/strong><\/li>\n<li><strong>WPForms<\/strong><\/li>\n<li><strong>Elementor Forms<\/strong><\/li>\n<li><strong>Forminator<\/strong><\/li>\n<li><strong>Comentarios de WordPress<\/strong><\/li>\n<\/ul>\n<h3>Pasos para instalar y configurar el plugin<\/h3>\n<ol>\n<li><strong>Instala el plugin<\/strong>: Ve a \u00abPlugins &gt; A\u00f1adir nuevo\u00bb en tu panel de WordPress y busca \u00abSimple Cloudflare Turnstile\u00bb. Inst\u00e1lalo y act\u00edvalo.<\/li>\n<li><strong>Configura las claves<\/strong>: Ve a \u00abAjustes &gt; Cloudflare Turnstile\u00bb. Introduce tu\u00a0<strong>Site Key<\/strong>\u00a0y tu\u00a0<strong>Secret Key<\/strong>\u00a0(las que obtuviste al crear el widget en Cloudflare).<\/li>\n<li><strong>Selecciona d\u00f3nde activarlo<\/strong>: El plugin te permite elegir en qu\u00e9 formularios aparece Turnstile: login, registro, comentarios, recuperaci\u00f3n de contrase\u00f1a, WooCommerce, etc.<\/li>\n<li><strong>Elige el modo del widget<\/strong>: Puedes seleccionar entre managed, non-interactive o invisible. El modo managed suele ser la mejor opci\u00f3n para la mayor\u00eda de webs.<\/li>\n<li><strong>Guarda los cambios<\/strong>: Pulsa \u00abSave Changes\u00bb y ya est\u00e1.<\/li>\n<\/ol>\n<p>No hace falta tocar PHP ni JavaScript. El plugin inserta el script y valida el token de forma autom\u00e1tica.<\/p>\n<p>Puedes descargarlo en su <a href=\"https:\/\/wordpress.org\/plugins\/simple-cloudflare-turnstile\/\" target=\"_blank\" rel=\"noopener\">repositorio de WordPress<\/a>.<\/p>\n<p><a href=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-7365\" src=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile.png\" alt=\"\" width=\"1544\" height=\"500\" srcset=\"https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile.png 1544w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile-1024x332.png 1024w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile-768x249.png 768w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile-1536x497.png 1536w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile-640x207.png 640w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile-400x130.png 400w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile-367x119.png 367w, https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/wordpress-captcha-trunstile-1320x427.png 1320w\" sizes=\"auto, (max-width: 1544px) 100vw, 1544px\" \/><\/a><\/p>\n<h3>Otras opciones para WordPress<\/h3>\n<p>Si usas plugins de formularios espec\u00edficos, hay integraciones directas:<\/p>\n<ul>\n<li><strong>Contact Form 7<\/strong>: El plugin \u00abContact Form 7 Captcha\u00bb permite usar Turnstile en CF7.<\/li>\n<li><strong>Gravity Forms<\/strong>: \u00abEnable Turnstile (Cloudflare) for Gravity Forms\u00bb a\u00f1ade soporte espec\u00edfico.<\/li>\n<li><strong>WooCommerce<\/strong>: \u00abLogin Security Captcha\u00bb protege formularios de login, registro y checkout con Turnstile o reCAPTCHA.<\/li>\n<li><strong>Shield Security<\/strong>: Incluye protecci\u00f3n anti-bots con Turnstile entre sus funciones de seguridad.<\/li>\n<li><strong>LiteSpeed Cache<\/strong>: Si usas LiteSpeed como servidor (como en k3bone), el plugin LiteSpeed Cache tambi\u00e9n tiene integraci\u00f3n con Turnstile en sus ajustes de seguridad.<\/li>\n<\/ul>\n<h2>Buenas pr\u00e1cticas<\/h2>\n<p>Al implementar Turnstile, ten en cuenta estos puntos:<\/p>\n<ul>\n<li><strong>Valida siempre el token en el servidor<\/strong>. El widget en el HTML es solo la mitad de la protecci\u00f3n. Sin validaci\u00f3n en el servidor, Turnstile no sirve de nada.<\/li>\n<li><strong>Usa el modo managed\/gestionado<\/strong>\u00a0a menos que tengas una raz\u00f3n concreta para elegir otro. Es el que mejor equilibra seguridad y experiencia de usuario.<\/li>\n<li><strong>Rota las claves de forma peri\u00f3dica<\/strong>. Desde el panel de Cloudflare puedes generar nuevas secret keys y revocar las antiguas.<\/li>\n<li><strong>Restringe los dominios<\/strong>\u00a0en la configuraci\u00f3n del widget. Solo a\u00f1ade los dominios donde vayas a usar Turnstile.<\/li>\n<li><strong>Separa entornos<\/strong>: usa widgets diferentes para desarrollo, staging y producci\u00f3n.<\/li>\n<li><strong>Los tokens expiran a los 5 minutos<\/strong>. Si un usuario tarda m\u00e1s en completar el formulario, el token caduca y hay que volver a generarlo con\u00a0<code>turnstile.reset()<\/code>.<\/li>\n<\/ul>\n<p>Si vienes de Google reCAPTCHA, la migraci\u00f3n es directa: Turnstile se integra dondequiera que tengas el script de reCAPTCHA. Puedes consultar la gu\u00eda oficial de migraci\u00f3n en la\u00a0<a href=\"https:\/\/developers.cloudflare.com\/turnstile\/migration\/\" target=\"_blank\" rel=\"noopener\">documentaci\u00f3n de Cloudflare<\/a>.<\/p>\n<h2>Preguntas frecuentes sobre Cloudflare Turnstile<\/h2>\n<h3>\u00bfEs Cloudflare Turnstile gratis?<\/h3>\n<p>S\u00ed, Turnstile es gratis para los primeros 100.000 dominios. Cloudflare ofrece un plan gratuito que cubre la mayor\u00eda de casos de uso. Para vol\u00famenes m\u00e1s altos o necesidades empresariales, hay planes de pago. Consulta los detalles en la\u00a0<a href=\"https:\/\/developers.cloudflare.com\/turnstile\/plans\/\" target=\"_blank\" rel=\"noopener\">p\u00e1gina de planes de Turnstile<\/a>.<\/p>\n<h3>\u00bfNecesito usar Cloudflare como CDN para usar Turnstile?<\/h3>\n<p>No. Turnstile funciona por separado. Puedes usarlo en cualquier web, uses o no la red CDN de Cloudflare. No hace falta cambiar de hosting ni de proveedor DNS.<\/p>\n<h3>\u00bfTurnstile funciona en sitios sin HTTPS?<\/h3>\n<p>No. Turnstile solo funciona en p\u00e1ginas servidas con HTTPS. Otros protocolos como <code>file:\/\/<\/code> tampoco son compatibles.<\/p>\n<h3>\u00bfC\u00f3mo s\u00e9 si Turnstile est\u00e1 funcionando?<\/h3>\n<p>Puedes usar las claves de test que proporciona Cloudflare para verificar la integraci\u00f3n sin desaf\u00edos reales. La sitekey de test es\u00a0<code>1x0000000000000000000000000000000AA<\/code>\u00a0y la secret key de test es\u00a0<code>1x0000000000000000000000000000000AA<\/code>. Una vez en producci\u00f3n, revisa los datos en la secci\u00f3n \u00abTurnstile Analytics\u00bb del panel de Cloudflare.<\/p>\n<h3>\u00bfPuedo usar Turnstile en aplicaciones m\u00f3viles?<\/h3>\n<p>S\u00ed, Cloudflare tiene gu\u00edas para integrar Turnstile en aplicaciones iOS y Android a trav\u00e9s de WebView. Consulta la documentaci\u00f3n sobre\u00a0<a href=\"https:\/\/developers.cloudflare.com\/turnstile\/get-started\/mobile-implementation\/\" target=\"_blank\" rel=\"noopener\">implementaci\u00f3n m\u00f3vil<\/a>.<\/p>\n<hr \/>\n<p>Si tu web sigue usando Google reCAPTCHA y quieres mejorar la experiencia de tus visitantes, Turnstile es la alternativa que estabas buscando. Podemos ayudarte con la integraci\u00f3n en tu proyecto, tanto si es una web a medida como si usa WordPress.\u00a0<a href=\"https:\/\/www.k3code.com\/contacto\/\" target=\"_blank\" rel=\"noopener\">Contacta con nosotros<\/a>\u00a0si necesitas ayuda con la configuraci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qu\u00e9 es Cloudflare Turnstile Cloudflare Turnstile\u00a0es un sistema de verificaci\u00f3n que sustituye a los CAPTCHA tradicionales. En lugar de mostrar desaf\u00edos visuales, ejecuta una serie de comprobaciones JavaScript en el navegador (proof-of-work, pruebas de espacio, detecci\u00f3n de comportamientos humanos) y decide si el visitante es humano o bot sin pedirle interacci\u00f3n. Turnstile tiene tres modos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7368,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[2,34,47],"tags":[143,261],"class_list":["post-7360","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-programacion-de-sitios-web","category-wordpress-web-apps","tag-captcha","tag-cloudflare"],"featured_image_src":{"landsacpe":["https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/Sustituye-Google-reCAPTCHA-por-Cloudflare-Turnstile-en-tu-web-1140x445.jpg",1140,445,true],"list":["https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/Sustituye-Google-reCAPTCHA-por-Cloudflare-Turnstile-en-tu-web-463x348.jpg",463,348,true],"medium":["https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/Sustituye-Google-reCAPTCHA-por-Cloudflare-Turnstile-en-tu-web-300x169.jpg",300,169,true],"full":["https:\/\/www.k3bone.com\/blog\/wp-content\/uploads\/2026\/04\/Sustituye-Google-reCAPTCHA-por-Cloudflare-Turnstile-en-tu-web.jpg",1920,1080,false]},"_links":{"self":[{"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/posts\/7360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/comments?post=7360"}],"version-history":[{"count":8,"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/posts\/7360\/revisions"}],"predecessor-version":[{"id":7373,"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/posts\/7360\/revisions\/7373"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/media\/7368"}],"wp:attachment":[{"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/media?parent=7360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/categories?post=7360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.k3bone.com\/blog\/wp-json\/wp\/v2\/tags?post=7360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}