SEO7.ES — Web, SEO, AI & Automation
Saltar al contenido

Caso · Web + seguridad

Una web que sobrevivió al hackeo del hosting sin un rasguño.

Grooming ESTA — мобильная версия
🛡

0 archivos dañados en el hackeo del hosting

🤖

ChatGPT lo lee: 37 visitas en 5 días

Portada en 0,34 s, PageSpeed 96

💰

89 precios que edita el propietario

La web anterior del salón, en Joomla, fue hackeada. La reconstruimos en PHP puro y JSON: sin CMS, sin base de datos, sin subida de archivos. Tres semanas después hackearon toda la cuenta de hosting y nuestra web ni se enteró.

vipstrizhkasobak.ru — web del salón de peluquería canina «ESTA» en Moscú: 89 posiciones de precios, 30 páginas de razas y 79 trabajos «antes y después» que el propietario edita solo. La portada se sirve en 0,34 segundos, PageSpeed 96, y en cinco días la leyeron ChatGPT, Perplexity y Claude.

Grooming ESTA — десктоп

¿Quieres un proyecto similar?

Completa un breve briefing — volvemos con plan y presupuesto.

vipstrizhkasobak.ru es la web de un salón de peluquería canina en Moscú, reconstruida desde cero después de que hackearan su sitio anterior en Joomla. Elegimos un stack en el que no hay nada que romper: PHP puro y JSON, sin CMS, sin base de datos, sin subida de archivos. Tres semanas después del lanzamiento hackearon toda la cuenta de hosting, y eso sirvió de prueba real: ni un solo archivo del sitio resultó afectado.

Cliente: salón de peluquería canina «ESTA», Moscú, Izmáilovo · Web: https://vipstrizhkasobak.ru · Categoría: web

Lo esencial

  • Stack sin agujeros. PHP 8.3 puro más archivos JSON. Sin CMS, sin base de datos, sin subida de archivos.
  • La web la encontraron los buscadores de IA. En cinco días la leyeron ChatGPT (37 visitas), Perplexity y Claude. Es el resultado de la infraestructura GEO, no una casualidad.
  • La portada se sirve en 0,34 segundos y pesa 9,8 KB comprimida.
  • Mascota interactiva en lugar de una ventana emergente: seis estados, ocho animaciones, menú de contacto al hacer clic.
  • Monitorización de integridad que revisa el sitio cada media hora y escribe al propietario por Telegram.
  • 89 posiciones de precios y 30 páginas de razas que el propietario edita solo, sin programador.

Stack tecnológico

  • Backend: PHP 8.3 puro, sin framework.
  • Datos: archivos JSON, la base de datos no existe como concepto.
  • Front: plantillas PHP, maquetación adaptativa mobile-first, tipografía Exo 2.
  • Hosting: hosting PHP compartido, despliegue por SSH.
  • Solicitudes: manejador PHP, escritura en JSON y aviso inmediato a Telegram.
  • Generación de recursos: rembg para recortar el fondo, fal.ai para generar imágenes, PIL para normalizar, exiftool para metadatos.
  • Analítica: Yandex Metrica.

El cliente tiene un hosting compartido sin Node en el servidor. Por eso todo el trabajo pesado (recortar al perro de la foto, generar el fondo, llevar 79 imágenes a un cuadrado único, escribir el EXIF) se hizo localmente en contenedores Docker, y al servidor solo subía el resultado. Docker replica producción: el mismo Apache, el mismo PHP, el mismo .htaccess. Así «en mi máquina funciona» y «en el servidor funciona» significan lo mismo.

Cómo empezó todo

La web anterior del salón estaba en Joomla y la hackearon. Historia típica de un CMS antiguo en hosting compartido, donde el motor y los plugins llevaban años sin actualizarse. Recuperar un sistema infectado no tenía sentido: los mismos agujeros habrían devuelto el mismo problema en un mes.

La tarea se formuló directamente: hacer una web que físicamente no se pueda romper.

El sitio antiguo sirvió como fuente de datos. De él extrajimos con cuidado, solo en lectura, 200 fotografías, todo el listado de precios, una estructura de 41 direcciones, los textos de 30 razas y los documentos legales. Ni una línea de código ajeno entró en el proyecto nuevo.

Lista completa de funciones

🌐 Web y páginas

  • Portada con héroe: perro recortado sobre fondo generado
  • Bloque sobre el salón con foto de la peluquera, ventajas, razas populares, trabajos, reseñas, formulario de reserva
  • Adaptación a 375, 768 y 1024 píxeles
  • La cabecera se pliega en una línea al hacer scroll
  • Zoom escalonado de la interfaz en monitores anchos

🐕 30 páginas de razas

  • Una página por raza: precio del pack, tabla «peluquería, higiene, SPA», contenido del procedimiento
  • Todo se renderiza desde un único archivo JSON: una raza nueva se añade desde el panel en un minuto

💰 89 posiciones de precios

  • Página hub con cuatro tarjetas y cuatro subpáginas con tablas
  • 44 posiciones para perros (de 2000 a 6600 ₽), 3 para gatos, 13 servicios adicionales, 29 packs SPA
  • El precio con barra indica la elección entre corte y stripping, algo importante en razas de pelo duro
  • El propietario edita los precios y los cambios se ven al instante

🐩 Mascota interactiva

  • Un perro dibujado en la esquina en lugar de la ventana emergente que todos cierran sin leer
  • Seis estados, microanimación, ocho variantes de cambio aleatorio cada ocho segundos
  • Frases del tipo «Pack desde 3300 ₽, mira los precios»
  • Al hacer clic se despliega el menú: WhatsApp, Telegram, llamada, precios, reserva

🛠 Panel de administración

  • Acceso con sesiones y protección contra falsificación de peticiones
  • Panel, edición de contactos, precios y razas, listado de solicitudes
  • Escritura atómica en JSON: dos solicitudes simultáneas no se pisan

📨 Solicitudes y protección antispam

  • El formulario guarda la solicitud en un archivo y la envía al grupo de Telegram del salón
  • Deslizador «arrastre a la derecha»: funciona con ratón, con el dedo y desde el teclado
  • Token firmado en el servidor con control de tiempo: se rechaza el envío en menos de tres segundos o sin firma válida
  • Campo trampa oculto para los bots primitivos

La comprobación real vive en el servidor. El deslizador se puede saltar con un script; un token firmado con control de tiempo, ya no.

🖼 Galería y reseñas

  • 79 trabajos «antes y después» llevados a un cuadrado único de 600 × 600
  • Reseñas en tres carruseles (Yandex, WhatsApp, Avito) con estrellas dibujadas por código y arrastre con el ratón
  • 146 imágenes, todas con los datos EXIF del salón

📄 Documentos legales

  • Oferta, política de privacidad conforme a la ley 152-FZ, dos consentimientos de tratamiento de datos, normas de servicio
  • Textos originales para este negocio concreto, con los datos del responsable del tratamiento y los organismos de control
  • Los datos del pasaporte no se publican en la web

🔍 SEO

  • Mapa del sitio dinámico con 46 direcciones, se actualiza solo al editar en el panel
  • Marcado Schema.org en cada página, direcciones canónicas, Open Graph, títulos únicos
  • Redirecciones 301 desde todas las direcciones antiguas de Joomla: el peso acumulado no se perdió en la migración

🤖 GEO: optimización para la búsqueda con IA

  • llms.txt con una descripción breve del salón y un mapa de enlaces
  • llms-full.txt con el contenido completo: contactos, las 89 posiciones de precios, las 30 razas con precios
  • En robots.txt se permite explícitamente a GPTBot, OAI-SearchBot, PerplexityBot, ClaudeBot y Google-Extended
  • Ambos archivos se generan de los mismos datos que la web, así que no envejecen

⚡ Velocidad y seguridad

  • Compresión, caché de estáticos, cabeceras de seguridad, HTTPS forzado
  • Carpetas de servicio cerradas al acceso directo
  • PHP actualizado de la versión muerta 7.3 a la 8.3.31

El hackeo que la web ni notó

Tres semanas después del lanzamiento ocurrió una catástrofe en el hosting. Lo contamos con franqueza, porque es la mejor prueba de que el stack elegido era el correcto.

Qué pasó. En la misma cuenta de hosting vivía otra web del cliente, una Joomla antigua. La hackearon el 26 de junio. El 25 de julio a las 06:17:28 el atacante lanzó la infección masiva de la cuenta: en un minuto se repartieron por todas las carpetas 13 copias del webshell filefuns.php, más de 20 archivos .htaccess sustituidos y dos dominios parásitos que el propietario nunca creó.

Lo peor estaba en la memoria del servidor. Allí se instaló el proceso php -f /tmp/httpd.conf. Se borró del disco nada más arrancar y trabajaba en bucle infinito, recreando los archivos maliciosos cada 0,3 segundos. Por eso la infección volvía después de cada limpieza. El proceso vivió 12 días y solo se podía ver por SSH: por FTP los procesos no se ven.

Qué le pasó a nuestra web. Nada. Comparamos las sumas de verificación de todos los archivos del proyecto con los originales locales y coincidieron todas. La infección dejó archivos al lado, pero no pudo cambiar nada dentro del sitio, porque no había qué cambiar: no hay CMS con plugins vulnerables, ni base de datos, ni subida de archivos, ni ejecución de código. Los logs confirman que ningún intento de intrusión a través de la web prosperó.

Cómo lo limpiamos. Entramos por SSH y encontramos el proceso residente, invisible por FTP. Extrajimos el código del gusano directamente de la memoria a través de /proc, porque en disco ya no existía, y así obtuvimos la prueba para el hosting. Detuvimos el proceso, eliminamos 13 backdoors, devolvimos los .htaccess originales y borramos los dos dominios parásitos. Pasamos un escaneo de firmas por toda la cuenta: 0 webshells, 0 código ofuscado, planificador limpio. Preparamos para el hosting un informe con la hora exacta, el identificador del proceso y el código del malware.

Qué hicimos para que no se repita. Escribimos un vigilante de integridad que funciona del lado del desarrollador y no en el servidor: un vigilante que se puede hackear junto con el sitio no sirve de nada. Cada 30 minutos el script entra con clave, compara las sumas de verificación de todos los archivos con el original, busca nombres conocidos de backdoors y código ofuscado, y revisa la lista de procesos y el planificador. Los avisos llegan a Telegram en dos casos: si algo cambió y una vez al día por la mañana con un «todo limpio». Comprobado dejando un archivo de prueba: la alerta llega con la ruta exacta.

La historia aparte de Installatron. Más tarde, cuando el propietario borraba en el panel los restos de aplicaciones antiguas, el instalador del hosting decidió que nuestra web también formaba parte de esa instalación y se llevó parte de los archivos. El sitio estuvo caído una hora y veinte minutos. Lo restauramos en un minuto subiendo el proyecto local, porque todo el código está en control de versiones y el despliegue es reproducible. Las solicitudes y los ajustes no sufrieron. En los logs se ve claramente al culpable: las peticiones de borrado venían de Installatron Plugin desde la dirección del propio servidor.

Resultados

La web la encontraron los asistentes de IA

Datos del log del servidor de cinco días, del 14 al 19 de agosto de 2026:

Quién entróVisitas
ChatGPT (OAI-SearchBot y ChatGPT-User)37
Bytespider (IA de ByteDance)391
PetalBot4
PerplexityBot3
Google-Extended2
ClaudeBot1

Las visitas de ChatGPT-User significan que personas reales preguntaron al asistente por el salón y él fue a la web a buscar la respuesta. Para eso se montó la infraestructura GEO.

Búsqueda clásica

BuscadorVisitas en cinco días
YandexBot144
Googlebot82
bingbot73

Los buscadores recorren razas, precios y documentos, y pasan correctamente por las redirecciones desde las direcciones antiguas. Hay visitas desde la ficha del salón en Yandex Mapas.

PageSpeed Insights, informe del 19 de agosto de 2026

CategoríaPuntuación
Rendimiento96
Accesibilidad93
Buenas prácticas96
SEO100
Navegación de agentes3 de 3

Métricas de carga: First Contentful Paint 0,8 segundos, Largest Contentful Paint 1,2 segundos, Total Blocking Time 10 milisegundos, Cumulative Layout Shift 0,001, Speed Index 1,0 segundos.

Técnica

IndicadorValor
Páginas en el mapa del sitio46
Entrega de la portada0,34 segundos, 9,8 KB comprimida
Versión de PHP8.3.31
Volumen de código1648 líneas
Imágenes en la web146
Peticiones en cinco días3466
Solicitudes de spam bloqueadas5
Archivos dañados durante el hackeo de la cuenta0

¿No sabes por dónde empezar?

Analizamos tu caso en una consulta gratuita y proponemos una solución.

Presupuesto por tarifa

9 posicionesPlazo: ~1 mes
Por separado (à la carte)€1071
Ahorro del pack−€391
Pack llave en mano€680

Precios según nuestra tarifa. Cada módulo por separado cuesta más: integraciones, gestión, overhead. Como proyecto único en un solo backend sale más barato. El presupuesto exacto, tras el briefing.

Cuantas más funciones, más conviene el pack

Por separadoPrecio del pack
Минимум · €390Стандарт · €1490€1071−€391Este proyecto€680Volumen de funciones →9Coste, €

Por unidades el coste crece de forma lineal. En pack llega a una meseta: arquitectura común, un solo backend, reutilización de código. Por eso, a más funciones, mayor es la diferencia y tu ahorro. Este proyecto (41 funciones) ya está en la meseta.

Preguntas frecuentes

La web anterior en Joomla fue hackeada por vulnerabilidades del CMS y de plugins sin actualizar durante años. Desinfectarla habría devuelto el mismo problema en un mes, así que la reconstruimos en un stack donde no hay nada que romper.

Proyectos relacionados.

¿Listo para tu proyecto?

Déjanos tu solicitud — calculamos plazos y precio para tu negocio.