WordPress mueve más del 43% de las webs del mundo, y esa misma popularidad lo convierte en el primer destino de cualquier bot que rastrea internet buscando logins abiertos, plugins desactualizados y formularios sin filtrar. Si llevas un tiempo administrando una instalación de WordPress, sabes que las amenazas no son una posibilidad teórica: son tráfico real que llega a tu servidor cada noche, en forma de intentos de acceso a /wp-login.php, peticiones raras a xmlrpc.php o subidas extrañas a wp-content/uploads.
La buena noticia es que la mayoría de los problemas de seguridad en WordPress se resuelven con higiene básica bien aplicada. No hace falta montar un SOC ni contratar un consultor para parar el 95% de los ataques. Aquí van los 20 consejos que de verdad mueven la aguja, ordenados por impacto y dificultad. Si solo tienes media hora, empieza por los cinco primeros.
El parche más eficaz que existe contra una vulnerabilidad conocida es la propia actualización que la corrige. Wordfence publicó en 2024 que más del 50% de los ataques con éxito sobre WordPress aprovechaban fallos en plugins desactualizados, no en el core. Activa las actualizaciones automáticas para versiones menores y revisa una vez por semana las mayores. Si tienes una web crítica, entra en la guía de WordPress 7.0 antes de saltar a una versión nueva: lo de «actualizar a ciegas el viernes por la tarde» no es plan.
Olvídate de «contraseñas robustas» con símbolos raros que nadie recuerda. Lo que de verdad funciona es la longitud: una passphrase de 20 caracteres con palabras al azar tarda años en caer por fuerza bruta, y la metes en Bitwarden, 1Password o KeePassXC y ya no la tocas nunca. Cambia las contraseñas cuando pase algo que las exponga, no por calendario. La rotación cada 30 días es una práctica obsoleta que el propio NIST desaconseja desde 2017.
Sin un límite, un bot puede probar miles de combinaciones contra /wp-login.php en una hora. Plugins como Limit Login Attempts Reloaded o WP Limit Login Attempts cierran la puerta tras 3 o 5 intentos fallidos durante minutos u horas, según configures. Es la medida con mejor relación esfuerzo/resultado de toda esta lista: cinco minutos de configuración te ahorran el 90% del ruido de fuerza bruta.
Aunque alguien consiga tu contraseña, sin el código del segundo factor no entra. Plugins como Two Factor o WP 2FA permiten activar TOTP con Google Authenticator, Authy o Aegis en cuestión de minutos. Hazlo obligatorio para todas las cuentas con rol de administrador o editor. Si solo vas a aplicar una medida de esta lista por encima del límite de logins, que sea el 2FA.
Hoy un sitio sin HTTPS es un sitio que Chrome marca como «no seguro» antes de que llegue el primer visitante. Con Let’s Encrypt el certificado es gratis y la mayoría de hostings lo activan en un clic. Asegúrate de redirigir todo el tráfico HTTP a HTTPS desde el .htaccess o desde la configuración del servidor, y revisa la cabecera HSTS si manejas datos sensibles o pasarela de pago.
Un backup que vive en el mismo servidor que la web no es un backup, es un archivo más que el atacante también va a borrar. UpdraftPlus, BackWPup o WP STAGING Pro mandan las copias a Dropbox, Google Drive, Amazon S3 o un FTP externo. La frecuencia depende de cuánto contenido nuevo subes: una tienda WooCommerce con pedidos cada hora necesita backups diarios, un blog con un post a la semana se conforma con uno semanal. Y comprueba al menos una vez al trimestre que el backup se restaura de verdad.
La regla básica que pocos respetan: 644 para archivos (lectura para todos, escritura solo para el dueño) y 755 para directorios. wp-config.php idealmente a 600 o 640. Si tu hosting te deja entrar por SSH, con dos comandos se ajusta todo el árbol:
find /ruta/a/tu/wp -type d -exec chmod 755 {} \;
find /ruta/a/tu/wp -type f -exec chmod 644 {} \;
chmod 600 /ruta/a/tu/wp/wp-config.php
Wordfence, Solid Security (antes iThemes) y Sucuri Security cubren prácticamente todo lo que un sitio normal necesita: firewall, escaneo de malware, alertas, hardening básico. Elige uno y configúralo bien, no instales tres a la vez porque se pisan entre ellos y disparan los falsos positivos. Si tu hosting ya incluye WAF a nivel de servidor, casi mejor un plugin ligero solo para escaneo y logs.
WP Activity Log y Simple History registran cada acceso, cada cambio de plugin, cada edición de un post o de un fichero. Cuando algo va mal, ese log es la única forma realista de saber qué pasó y cuándo. Para auditorías más profundas tienes herramientas externas como Site Audit Snapshot, que genera un informe del estado del sitio en un solo clic y te ayuda a detectar configuraciones que se han ido degradando con el tiempo.
El archivo guarda las credenciales de la base de datos, las claves SALT y las constantes que controlan el comportamiento del core. Tres ajustes que conviene aplicar desde el primer día:
.htaccess: <Files wp-config.php> Require all denied </Files>.define('DISALLOW_FILE_EDIT', true); antes del comentario «That’s all, stop editing».Un firewall de aplicaciones web filtra el tráfico antes de que toque WordPress. Lo ideal es tenerlo en dos sitios: el WAF del hosting (si es un hosting WordPress decente lo lleva incluido) y un servicio CDN/WAF como Cloudflare delante, en modo proxy. Cloudflare en plan gratis ya bloquea la mayoría de ataques DDoS pequeños y filtra países enteros si te están dando guerra. En el plan Pro tienes WAF gestionado con reglas actualizadas por el equipo de Cloudflare.
El primer nombre que prueba cualquier bot es «admin». Si en tu instalación todavía existe ese usuario, créate uno nuevo con rol de administrador, asígnale los posts del antiguo desde el listado de usuarios y borra el de «admin». También evita nombres obvios tipo «administrador», «webmaster» o tu propio nombre si aparece en los autores del blog: WordPress los expone por defecto en la URL /?author=1.
El .htaccess de la raíz controla las reglas de reescritura de URL. Si un atacante puede modificarlo, redirige tu web a donde quiera. Asegúrate de que sus permisos están en 644, bloquea su lectura desde el navegador y, si tienes un editor visual de htaccess, audita lo que metes ahí cada vez que un plugin pide tocarlo. En servidores con Nginx el equivalente está en el bloque server: revisa que solo el usuario root pueda editar la config.
Si no usas los comentarios, desactívalos. En Ajustes > Comentarios, marca «Cerrar comentarios automáticamente en posts con más de 30 días» y en Discusión exige que el usuario rellene nombre y email. Si los usas, instala Akismet o Antispam Bee y filtra todo lo que llegue con más de un enlace. Cada comentario aprobado a ciegas es un agujero potencial de inyección.
Por defecto WordPress imprime la versión en la metaetiqueta generator del HTML y en el feed RSS. Quitar esa información complica un poco el trabajo a los bots que escanean buscando versiones vulnerables, aunque por sí sola no detiene a nadie con tiempo. Es seguridad por oscuridad: complementa, no sustituye. La mayoría de plugins de seguridad ya traen la opción activada en su modo de hardening.
La carpeta wp-content/uploads es la favorita de los atacantes para colar shells PHP camufladas como imágenes. Bloquea la ejecución de PHP en esa carpeta con una regla en .htaccess:
<Files *.php> Require all denied </Files>
Aunque alguien suba un fichero malicioso, no podrá ejecutarlo. Si usas Nginx, la regla equivalente va en el bloque location ~ /wp-content/uploads/.*\.php$ { deny all; }.
Más allá del log de actividad de WordPress, configura el log de acceso del servidor (Apache, Nginx, LiteSpeed) para guardar al menos 30 días. Cuando hay un incidente, los logs son la diferencia entre saber exactamente qué IP entró y a qué URL, o quedarte mirando un sitio caído sin pistas. Si usas Cloudflare, sus Logs (en plan Pro) o Logpush (en Enterprise) te dan una visión completa del tráfico antes de que toque tu hosting.
El eslabón más débil casi siempre es humano. Un editor que abre un PDF infectado en su portátil, un freelance al que le roban las credenciales por phishing, una agencia que reutiliza la misma contraseña para 30 clientes. Establece reglas claras, prohíbe compartir contraseñas por email o Slack, exige 2FA y haz una sesión rápida con el equipo cada vez que se incorpora alguien nuevo. Vale más eso que cualquier plugin caro.
El hosting marca la diferencia entre que un ataque DDoS pequeño te tire la web en cinco minutos o ni te enteres. Un buen hosting WordPress tiene WAF propio, detecta anomalías en el tráfico, aísla cada cliente para que un sitio infectado no contagie al vecino y el soporte sabe levantar un backup sin que tengas que explicárselo. Si tu factura mensual es de 2 € y compartes IP con 4.000 webs, asume que la seguridad la pones tú al 100% por encima.
Una vez al trimestre, pasa un escaneo completo. Wordfence, Sucuri SiteCheck o WPScan te dan un informe de estado en minutos. Si quieres ir más allá, hay herramientas que combinan IA y análisis estático del sitio, como Claude Code WordPress Expert, que audita la web sin necesidad de instalar nada. Lo importante es que la auditoría no se quede en un PDF: cada hallazgo se traduce en una tarea con dueño y fecha.
Si ahora mismo tu instalación no tiene nada de esto y vas con el tiempo justo, prioriza así: actualizaciones automáticas activas, contraseñas largas con gestor y 2FA en administradores, límite de intentos de login, backups diarios fuera del servidor y un buen hosting. Con esos cinco puntos te quitas de encima la inmensa mayoría de los ataques que circulan por la red. El resto de consejos suma capas, pero esos cinco son la base que no se discute.
Las actualizaciones menores y de seguridad, en cuanto salen. Las mayores, después de revisar el changelog y, si la web es crítica, probarlas antes en un staging. WordPress permite activar las automáticas por plugin desde el listado del panel: marca como mínimo las de seguridad para todos los plugins activos.
Para una web personal, los planes gratuitos de Wordfence o Solid Security cubren bien. Si gestionas una tienda WooCommerce con tráfico, una membresía o una web de empresa con datos sensibles, los planes pagos te dan reglas WAF actualizadas a tiempo real, escaneo de malware más profundo y soporte directo. Sale rentable comparado con limpiar una infección.
Pon la web en mantenimiento, lanza un escaneo con Wordfence o Sucuri y compara los archivos del core con los originales (Wordfence lo hace automáticamente). Si encuentras shells o código sospechoso, restaura desde un backup anterior al incidente, cambia todas las contraseñas (WP, FTP, base de datos, hosting) y regenera las claves SALT en wp-config.php. Si no te sientes cómodo, contrata un servicio de limpieza profesional: Sucuri o Astra cobran entre 200 y 400 € y dejan la web limpia y monitorizada.
Sí, siempre que delegues el pago en pasarelas externas como Stripe, Redsys o PayPal y no almacenes datos de tarjeta en tu base de datos. Activa SSL en toda la web, mantén WooCommerce y sus extensiones al día, exige 2FA a los administradores y revisa los logs de pedidos por si aparecen patrones raros (mismas IPs, importes idénticos, intentos fallidos masivos).
Para una web personal o un blog que no maneja datos sensibles, Cloudflare gratuito ya frena la mayoría de los ataques DDoS pequeños, oculta la IP real del servidor y permite reglas básicas de firewall. Si tienes una tienda, una membresía o cualquier proyecto que pierda dinero cuando se cae, el plan Pro a 20 dólares al mes con WAF gestionado merece la pena.
