// SEC-HARDEN START: enqueue + token seguro function seguridad_enqueue_scripts() { wp_enqueue_script( 'seguridad-form', get_stylesheet_directory_uri() . '/js/forms.js', array(), '1.0.0', true ); wp_localize_script('seguridad-form', 'seguridadVars', array( 'appToken' => SECURE_APP_TOKEN, 'debug' => true // cambia a false cuando termines pruebas )); } add_action('wp_enqueue_scripts', 'seguridad_enqueue_scripts'); // SEC-HARDEN END // ===================================== // SEC-HARDEN START (no destructivo) // ===================================== (function(){ const SEND_TO_MAKE = false; // ← FASE 1: pruebas locales. En Fase Make poner true. const FORM_ID = "podcastForm"; // ID del formulario principal const form = document.getElementById(FORM_ID); if (!form) { if (window.seguridadVars?.debug) console.warn('SEC-HARDEN: form no encontrado'); return; } // Helpers function clean(str){ return String(str) .replace(/&/g,"&").replace(//g,">") .replace(/"/g,""").replace(/'/g,"'") .trim(); } function rateLimit(key, windowMs){ try{ const now = Date.now(); const last = parseInt(localStorage.getItem(key) || "0", 10); if (now - last < windowMs) return false; localStorage.setItem(key, String(now)); return true; }catch{ return true; } } function getTurnstileToken(){ try{ // Turnstile rellena automáticamente un input oculto con name="cf-turnstile-response" const el = form.querySelector('input[name="cf-turnstile-response"]'); return el && el.value ? el.value : ""; }catch{ return ""; } } // (Opcional seguro, sin tocar tu función original) Normaliza custom_length if (typeof window.setCustomLengthForPlan === 'function') { const original = window.setCustomLengthForPlan; window.setCustomLengthForPlan = function(plan){ try{ const inp = document.getElementById('custom_length'); if (inp){ inp.value = parseInt(inp.value || '0', 10) || ''; } }catch{} return original.apply(this, arguments); }; } form.addEventListener("submit", async function(ev){ // Evita doble envío si hay otro JS gestionando ev.preventDefault(); // Honeypot const hp = form.querySelector('input[name="website"]'); if (hp && hp.value){ alert("Spam detectado"); return; } // Rate limit if (!rateLimit("last_submit_podcastForm", 60000)){ alert("Espera 1 minuto antes de reenviar"); return; } // Crea payload sin asumir campos fijos (respetamos tu HTML) const fd = new FormData(form); const data = Object.fromEntries(fd.entries()); // Saneamos campos conocidos si existen (no rompe si faltan) ["topic","cta","goal","plan","audio_url"].forEach(k=>{ if (k in data) data[k] = clean(data[k]); }); // Turnstile const ts = getTurnstileToken(); if (!ts){ alert("Valida el captcha"); return; } data["cf-turnstile-response"] = ts; // Token interno (inyectado por WP, no visible en HTML) if (window.seguridadVars?.appToken){ data["app_token"] = window.seguridadVars.appToken; } // (Fase 1) Mostrar en consola y no enviar aún if (!SEND_TO_MAKE){ console.log("SEC-HARDEN payload (prueba local):", data); alert("Validación local OK. Listo para conectar con Make en la siguiente fase."); return; } // (Fase Make) — se activará en la siguiente etapa try{ const resp = await fetch("https://PON_AQUI_TU_WEBHOOK_FIREWALL_MAKE", { method: "POST", headers: { "Content-Type": "application/json", "X-Internal-Key": window.seguridadVars.appToken || "" }, body: JSON.stringify(data) }); alert(resp.ok ? "Enviado correctamente" : "Error en el envío"); }catch(err){ console.error("Error de red", err); alert("Error de red"); } }); })(); // ===================================== // SEC-HARDEN END // ===================================== https://globalpodflow.com/wp-sitemap-posts-post-1.xmlhttps://globalpodflow.com/wp-sitemap-posts-page-1.xmlhttps://globalpodflow.com/wp-sitemap-posts-product-1.xmlhttps://globalpodflow.com/wp-sitemap-taxonomies-category-1.xmlhttps://globalpodflow.com/wp-sitemap-taxonomies-product_cat-1.xmlhttps://globalpodflow.com/wp-sitemap-users-1.xml