...

Cómo proteger el contenido de tu web WordPress

Proteger contenido en WordPress

Proteger contenido en WordPress es una tarea que combina medidas en el cliente (navegador), protecciones server-side y estrategias legales/procesales. En esta guía exhaustiva aprenderás qué funciona, qué limita, qué puede romper la experiencia de usuario y cómo implementar controles técnicos reales para reducir el robo de contenido, la copia masiva y el scraping automatizado.

Advertencia importante: ninguna protección es 100% infalible. Cualquier contenido que se muestre en el navegador puede ser capturado (pantallazos, inspección, peticiones HTTP). El objetivo es aumentar la fricción para el atacante y proteger la propiedad intelectual sin romper la usabilidad ni el SEO.

Índice (resumen de lo que cubriremos)

  1. ¿Por qué proteger el contenido y qué riesgos cubre
  2. Proteger en el front-end: CSS + JS para impedir selección y clic derecho
  3. Técnicas con overlays y “transparent protections”
  4. Bloquear accesos desde la consola / teclas que abren devtools
  5. Protecciones server-side: .htaccess (Apache) y reglas nginx
  6. Anti-hotlinking y servir imágenes de forma segura
  7. Control de feeds y protección RSS / ATOM
  8. Detección y bloqueo de scrapers: rate limiting, fail2ban, Cloudflare Bot Management
  9. APIs y REST: restringir acceso y limitar endpoints públicos
  10. Plugins WordPress recomendados (pros/contras)
  11. Medidas legales y metadata (copyright, señales legales)
  12. Estrategia por niveles (gradual) y checklist de implementación
  13. Monitoreo, métricas y señales de que te están copiando
  14. FAQ y buenas prácticas

1. ¿Por qué proteger contenido en WordPress y qué cubre cada técnica?

Antes de tocar código: define objetivos. ¿Quieres evitar copias puntuales, scrapers masivos, hotlinking de imágenes o reposteo en otros sites? Cada objetivo requiere acciones distintas.

  • Evitar copias rápidas (usuarios que seleccionan+copian): medidas front-end (CSS/JS).
  • Evitar scraping automatizado: medidas server-side (rate limits, bloqueos por User-Agent, captchas, bot management).
  • Evitar hotlinking de imágenes: configuración webserver o CDN.
  • Evitar extracción de feeds: limitar feeds o servir resúmenes.
  • Evitar uso no autorizado del contenido (comercial): señales legales y mecanismos de detección y DMCA.

2. Front-end: impedir selección, copiar y clic derecho (JS + CSS)

CSS básico (evita selección visual)

 /* Evita selección de texto */
.noprotect, body.protect {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

/* Evita arrastrar imágenes */
img { -webkit-user-drag: none; user-drag: none; }

Aplica la clase protect en body cuando quieras habilitar o deshabilitar protección.

JS: desactivar clic derecho y selección

<script>
document.addEventListener('contextmenu', function(e) {
  // Bloquea menú contextual
  e.preventDefault();
}, false);

document.addEventListener('selectstart', function(e) {
  if (document.body.classList.contains('protect')) e.preventDefault();
});

document.addEventListener('keydown', function(e) {
  if (document.body.classList.contains('protect')) {
    if ((e.ctrlKey || e.metaKey) && e.key === 'c') {
      e.preventDefault();
    }
  }
});
</script>

Ventajas: fácil y rápido.
Limitaciones: usuarios técnicos pueden desactivar JS o usar la consola; afecta accesibilidad y UX; los motores de búsqueda siguen leyendo el HTML.

Consejo: no apliques a todo el site; usa en artículos especialmente sensibles o p.ej. bloquea solo en elementos concretos (.protect-content).

3. Overlays transparentes (técnica común)

Un div transparente encima del contenido impide selección y clics. Útil para texto/medios específicos.

.protect-wrapper { position: relative; display:block; }
.protect-overlay {
  position: absolute; top:0; left:0; right:0; bottom:0;
  background: rgba(255,255,255,0); z-index: 9999;
}
<div class="protect-wrapper">
  <div class="protect-overlay" aria-hidden="true"></div>
  <div class="content">Texto protegido…</div>
</div>

Ojo: esto rompe selección y navegación móvil si no se hace con cuidado. Añade botón «Ver versión imprimible» o similar para usuarios autorizados.

4. Bloquear atajos y la consola del navegador

No existe forma completamente fiable de bloquear DevTools. Puedes detectar apertura de DevTools por cambios de window.outerWidth - innerWidth o mediante debugger tricks, pero no confiables.

Ejemplo de detección (no perfecto):

 (function(){
  let threshold = 160;
  window.addEventListener('resize', function(){
    if (window.outerWidth - window.innerWidth > threshold) {
      // Posible apertura de DevTools
      console.warn('DevTools detectado');
      // Opcional: redirigir o desactivar contenido
    }
  });
})();

Recomendación: no bases protección crítica en esto. Usa server-side en lugar de confiar en client-side.

5. Protecciones server-side: Apache (.htaccess) y nginx

Apache: bloquear User-Agents y hotlinking

Bloquear User-Agent simple:

 # Bloquear user agents molestos
SetEnvIfNoCase User-Agent "Semalt" bad_bot
SetEnvIfNoCase User-Agent "MJ12bot" bad_bot
Order Allow,Deny
Allow from all
Deny from env=bad_bot

Anti-hotlinking (imágenes):

 RewriteEngine On
# Permite hotlink desde tu dominio y desde vacío (para navegadores)
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?tudominio\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F,NC]
 

Nginx: block by UA, hotlinking, limit_req

Bloquear UA:

 if ($http_user_agent ~* (MJ12bot|Semalt|AhrefsBot)) {
  return 403;
}

Anti-hotlinking:

 location ~* \.(?:png|jpg|jpeg|gif|webp)$ {
    valid_referers none blocked .tudominio.com;
    if ($invalid_referer) {
        return 403;
    }
}

Rate limiting (limit_req):

 http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    server {
        location / {
            limit_req zone=one burst=20 nodelay;
            ...
        }
    }
}

Nota: configura rate según tu patrón de tráfico. Prueba en staging para no afectar usuarios reales.

6. Anti-hotlinking avanzado: servir imágenes mediante script PHP

En lugar de permitir acceso directo /wp-content/uploads/..., sirve imágenes desde un endpoint que valide referer o token:

// serve-image.php

// ejemplo básico: validar token
$path = $_GET['img'];
$token = $_GET['t'];
// valida token (hash con fecha y secreto)
$secret = 'MI_SECRETO';
if (!hash_equals(hash_hmac('sha256',$path,$secret), $token)) {
    header("HTTP/1.1 403 Forbidden");
    exit;
}
$full = '/var/www/html/wp-content/uploads/' . basename($path);
if (!file_exists($full)){ http_response_code(404); exit; }
$finfo = finfo_open(FILEINFO_MIME_TYPE);
header('Content-Type: '.finfo_file($finfo,$full));
readfile($full);

Enlaces a imágenes incluirían token calculado en PHP al generar HTML. Esto evita que terceros enlacen imágenes directamente.

7. Control de Feeds RSS y protección de contenido en feeds

Los scrapers a menudo utilizan RSS. Opciones:

  • Servir solo resúmenes: evita que el feed contenga contenido completo.
  • Desactivar feeds:
// functions.php
function disable_wp_feeds() {
    wp_die( __('No hay feed disponible, visita el sitio web.') );
}
add_action('do_feed',    'disable_wp_feeds', 1);
add_action('do_feed_rss2', 'disable_wp_feeds', 1);
  • Limitar accesos por IP: via firewall o plugins.

8. Detección y bloqueo de scrapers: fail2ban, Cloudflare, WAF

Fail2ban (ejemplo para nginx)

Crea filtro que detecta patrones de scraping (muchas peticiones a /wp-json o a /feed) y banea IPs.

/etc/fail2ban/filter.d/nginx-scraper.conf

[Definition]
failregex = ^ -.*"(GET|POST).*\/wp\-json.*"
ignoreregex =

/etc/fail2ban/jail.local

 [nginx-scraper]
enabled = true
filter = nginx-scraper
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 50
findtime = 60
bantime = 3600

Cloudflare / CDN WAF

  • Cloudflare Bot Management (pro/pago) detecta scrapers y desafía con JS challenge o CAPTCHA.
  • CloudFront + AWS WAF: reglas para bloquear User-Agents, limitar rate, bloquear requests con patrones sospechosos.

Consejo: implementa bot challenge para tráfico sospechoso y usa JS challenge para filtrar scrapers sin afectar a usuarios reales.

9. WP REST API y XML-RPC: restringir

Muchas herramientas y scrapers utilizan wp-json o xmlrpc.php. Restringe el acceso:

Bloquear xmlrpc.php:

<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

Limitar WP REST API a usuarios autenticados (functions.php):

 add_filter('rest_authentication_errors', function($result) {
    if (!empty($result)) return $result;
    if (!is_user_logged_in()) {
        return new WP_Error('rest_forbidden', 'Acceso restringido', array('status' => 401));
    }
    return $result;
});

Nota: esto puede romper integraciones públicas o headless; valora impacto.

10. Plugins WordPress recomendados (con uso y limitaciones)

  • Wordfence / Sucuri: firewall, bloqueo por IP, rate limiting. (recomendado)
  • WP Content Copy Protection & No Right Click: scripts para prevenir clic derecho. (útil como primera capa)
  • Disable Right Click For WP: sencillo para bloquear clic derecho.
  • WP-CopyRight Pro / WP Shield: añade marca de agua/aviso de copyright.
  • UnGrabber / WP Content Copy Protection: ofuscan texto por JS (limitado).
  • WP Rocket / FlyingPress: no protección directa, pero mejora rendimiento y reduce coste de scrapers (menos recursos disponibles).
  • AMG / BotBlocker plugins: complementarios.

Recomendación: combina plugin de copy-protection con firewall/server-level (Cloudflare + fail2ban). Plugins por sí solos son fáciles de evadir.

11. Medidas legales y metadata (copyright / señales)

  • Incluye meta tags y schema.org con información de copyright.
  • Añade aviso de copyright visible con fecha.
  • Implementa marca de agua en imágenes importantes (transparente).
  • Registro de obras y políticas de Términos y Condiciones y DMCA/aviso de copyright en footer.
  • Usa Watermark on image con librerías al subir (Imagick) si procede.

12. Estrategia por niveles (implementación gradual)

Nivel 0 — Básico (rápido)

  • Añadir CSS/JS anti-copypaste en áreas sensibles.
  • Activar plugin “Disable Right Click”.
  • Configurar robots.txt y desactivar xmlrpc si no usado.

Nivel 1 — Intermedio (recomendado)

  • Implementar anti-hotlinking en servidor.
  • Redis/Cache para reducir impacto de scrapers.
  • Limitar feeds a extractos.
  • Cloudflare Free + Page Rules para protección básica.

Nivel 2 — Avanzado (profesional)

  • WAF (Cloudflare Pro o AWS WAF).
  • Fail2ban para patrones personalizados.
  • Servir imágenes con tokens o a través de S3 con signed URLs.
  • Revisión legal y DMCA ready.

Nivel 3 — Enterprise

  • Fingerprinting de bots, ML para detectar scrapers.
  • Honeypots y traps para identificar IPs maliciosas.
  • Integración SIEM, logs centralizados y respuesta automática.

13. Monitoreo y métricas: cómo saber si te copian

  • Anomalías en logs: picos de requests desde pocas IPs, crawling intensivo de /wp-json, /feed, /wp-content/uploads.
  • Cloudflare Analytics: ver requests bloqueadas, threats.
  • New Relic / Datadog: picos CPU/mem ligados a scraping.
  • Google Analytics: spikes en tráfico con altas tasas de rebote (bots).
  • Herramientas de búsqueda de duplicados: Copyscape, plagiarism detectors para ver contenido reposted.
  • Alertas via CloudWatch / Fail2ban: notifica cuando IPs exceden umbrales.

14. Código útiles y snippets (recopilatorio)

.htaccess: bloquear referrers y hotlinking + proteger xmlrpc

# Bloquear xmlrpc
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

# Anti-hotlink
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?tudominio\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F,NC]

functions.php: deshabilitar feeds completos

 function custom_feed_limit(){
    // Forzar resumen
    add_filter('the_excerpt_rss', 'wp_trim_excerpt');
    add_filter('the_content_feed', 'wp_trim_excerpt');
}
add_action('init','custom_feed_limit');

REST API restrict (permitir solo JSON a usuarios auth)

 add_filter('rest_authentication_errors', function($result) {
    if (!empty($result)) return $result;
    if (!is_user_logged_in()) {
        return new WP_Error('rest_forbidden', 'Acceso REST restringido', array('status' => 401));
    }
    return $result;
});

Nginx rate limit snippet

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
    location / {
        limit_req zone=one burst=5 nodelay;
        ...
    }
}

15. Buenas prácticas y consideraciones finales (UX y SEO)

  • No sacrifiques SEO/UX por protecciones agresivas. Google indexa contenido si lo bloqueas (robots.txt, REST lock) podrías perder indexación.
  • Evita bloquear motores legítimos (Googlebot, Bingbot). Si usas bloqueos por UA, manten lista blanca.
  • Probar en staging antes de aplicar en producción.
  • Documenta cada regla y ten rollback plan.
  • No uses ofuscación excesiva que empeore accesibilidad o la velocidad.
  • Balance: combinar capas (client + server + legal) es lo más efectivo.

16. FAQ (respuestas rápidas)

Q: ¿Puedo evitar que hagan screenshot de mi contenido?
A: No. Screenshots no se pueden prevenir técnicamente. Puedes marcar imágenes con agua y usar soluciones legales.

Q: ¿Las protecciones romperán mi SEO?
A: Si bloqueas crawlers o deshabilitas feeds, sí. Implementa solo lo necesario y mantén whitelist para bots de búsqueda.

Q: ¿Es suficiente un plugin anti-copy?
A: No. Es una capa útil para usuarios casuales, pero no detendrá a scrapers o usuarios técnicos.

17. Checklist de implementación (resumido)

  1. Evaluar qué contenido proteger y por qué.
  2. Implementar CSS/JS en áreas sensibles.
  3. Ajustes server-side: anti-hotlink, rate-limits, UA block.
  4. Habilitar WAF / Cloudflare y configurar Bot Management.
  5. Restringir WP REST y xmlrpc si no usado.
  6. Limitar feeds y logs.
  7. Implementar fail2ban y/o AWS WAF + CloudWatch.
  8. Monitoreo y alertas, pruebas A/B en staging.
  9. Redactar DMCA y avisos legales.
  10. Revisar impacto en SEO (Search Console) y accesibilidad.

18. Conclusión estratégica

Proteger el contenido en WordPress es una tarea multifacética. La combinación correcta es capas de protección: front-end para frenar usuarios casuales; server-side para bloquear scrapers automatizados y hotlinkers; y medidas legales y de monitorización para reaccionar a incidents y hacer reclamaciones.

Si priorizas UX y SEO, aplica medidas graduales y controla el impacto. Para proyectos sensibles o de alto valor, la recomendación es implementar soluciones de WAF, CDN con bot management, rate limiting y monitoreo profesional.

¿Quieres que lo instalemos o lo implementemos por ti?

En MCE podemos ayudarte a:

  • Auditar tu sitio y priorizar qué contenido proteger.
  • Implementar reglas seguras en Apache / Nginx / Cloudflare.
  • Configurar fail2ban, AWS WAF / Cloudflare Bot Management y alertas.
  • Añadir protecciones en WordPress (plugins + snippets) sin romper SEO ni UX.
  • Crear un plan de respuesta ante scraping y reclamaciones DMCA.

¿Te interesa que implementemos estas protecciones en tu web? Escríbenos y lo diseñamos según tus necesidades.

Contáctanos

Solicita tu asesoría personalizada

Políticas de Cookies MCE

Usamos cookies para ayudarle a navegar de manera eficiente y realizar ciertas funciones. Encontrará información detallada sobre cada una de las cookies bajo cada categoría de consentimiento a continuación.

Las cookies categorizadas como “Necesarias” se guardan en su navegador, ya que son esenciales para permitir las funcionalidades básicas del sitio web.

También utilizamos cookies de terceros que nos ayudan a analizar cómo usted utiliza este sitio web, guardar sus preferencias y aportar el contenido y la publicidad que le sean relevantes. Estas cookies solo se guardan en su navegador previo consentimiento por su parte.

Puede optar por activar o desactivar alguna o todas estas cookies, aunque la desactivación de algunas podría afectar a su experiencia de navegación.

Para obtener más información sobre el funcionamiento de las cookies de terceros de Google y cómo tratan sus datos, consulte la:  Política de privacidad de Google

Las cookies necesarias son cruciales para las funciones básicas del sitio web y el sitio web no funcionará de la forma prevista sin ellas.Estas cookies no almacenan ningún dato de identificación personal.

Las cookies funcionales ayudan a realizar ciertas funcionalidades, como compartir el contenido del sitio web en plataformas de redes sociales, recopilar comentarios y otras características de terceros.

Las cookies analíticas se utilizan para comprender cómo interactúan los visitantes con el sitio web. Estas cookies ayudan a proporcionar información sobre métricas el número de visitantes, el porcentaje de rebote, la fuente de tráfico, etc.

Las cookies de rendimiento se utilizan para comprender y analizar los índices de rendimiento clave del sitio web, lo que ayuda a proporcionar una mejor experiencia de usuario para los visitantes.

Las cookies publicitarias se utilizan para entregar a los visitantes anuncios personalizados basados ​​en las páginas que visitaron antes y analizar la efectividad de la campaña publicitaria.

Otras cookies no categorizadas son las que se están analizando y aún no se han clasificado en una categoría.

Usamos cookies para ayudarle a navegar de manera eficiente y realizar ciertas funciones. Encontrará información detallada sobre cada una de las cookies bajo cada categoría de consentimiento a continuación.

Las cookies categorizadas como “Necesarias” se guardan en su navegador, ya que son esenciales para permitir las funcionalidades básicas del sitio web.

También utilizamos cookies de terceros que nos ayudan a analizar cómo usted utiliza este sitio web, guardar sus preferencias y aportar el contenido y la publicidad que le sean relevantes. Estas cookies solo se guardan en su navegador previo consentimiento por su parte.

Puede optar por activar o desactivar alguna o todas estas cookies, aunque la desactivación de algunas podría afectar a su experiencia de navegación.

Para obtener más información sobre el funcionamiento de las cookies de terceros de Google y cómo tratan sus datos, consulte la:  Política de privacidad de Google

Las cookies necesarias son cruciales para las funciones básicas del sitio web y el sitio web no funcionará de la forma prevista sin ellas.Estas cookies no almacenan ningún dato de identificación personal.

Las cookies funcionales ayudan a realizar ciertas funcionalidades, como compartir el contenido del sitio web en plataformas de redes sociales, recopilar comentarios y otras características de terceros.

Las cookies analíticas se utilizan para comprender cómo interactúan los visitantes con el sitio web. Estas cookies ayudan a proporcionar información sobre métricas el número de visitantes, el porcentaje de rebote, la fuente de tráfico, etc.

Las cookies de rendimiento se utilizan para comprender y analizar los índices de rendimiento clave del sitio web, lo que ayuda a proporcionar una mejor experiencia de usuario para los visitantes.

Las cookies publicitarias se utilizan para entregar a los visitantes anuncios personalizados basados ​​en las páginas que visitaron antes y analizar la efectividad de la campaña publicitaria.

Otras cookies no categorizadas son las que se están analizando y aún no se han clasificado en una categoría.

Soporte