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)
- ¿Por qué proteger el contenido y qué riesgos cubre
- Proteger en el front-end: CSS + JS para impedir selección y clic derecho
- Técnicas con overlays y “transparent protections”
- Bloquear accesos desde la consola / teclas que abren devtools
- Protecciones server-side: .htaccess (Apache) y reglas nginx
- Anti-hotlinking y servir imágenes de forma segura
- Control de feeds y protección RSS / ATOM
- Detección y bloqueo de scrapers: rate limiting, fail2ban, Cloudflare Bot Management
- APIs y REST: restringir acceso y limitar endpoints públicos
- Plugins WordPress recomendados (pros/contras)
- Medidas legales y metadata (copyright, señales legales)
- Estrategia por niveles (gradual) y checklist de implementación
- Monitoreo, métricas y señales de que te están copiando
- 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)
- Evaluar qué contenido proteger y por qué.
- Implementar CSS/JS en áreas sensibles.
- Ajustes server-side: anti-hotlink, rate-limits, UA block.
- Habilitar WAF / Cloudflare y configurar Bot Management.
- Restringir WP REST y xmlrpc si no usado.
- Limitar feeds y logs.
- Implementar fail2ban y/o AWS WAF + CloudWatch.
- Monitoreo y alertas, pruebas A/B en staging.
- Redactar DMCA y avisos legales.
- 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.