42 controles de seguridad · 7 categorías · 3 niveles de dificultad
| ✓ | Control | Dificultad |
|---|---|---|
Content-Security-Policy (CSP) configuradoSin unsafe-eval. Idealmente sin unsafe-inline en script-src. Ver artículo CSP en WordPress en el blog de Asentic. |
Avanzado | |
Strict-Transport-Security (HSTS) activomax-age ≥ 31536000 (1 año). Agrega includeSubDomains si aplica. |
Medio | |
| X-Frame-Options: DENY o SAMEORIGINPreviene clickjacking. DENY si no usas iframes propios. | Fácil | |
| X-Content-Type-Options: nosniffEvita que el navegador adivine el MIME type de las respuestas. | Fácil | |
Referrer-Policy configuradostrict-origin-when-cross-origin es el valor recomendado para la mayoría de los sitios. |
Fácil | |
| Permissions-Policy sin accesos innecesariosRestringe geolocation, microphone, camera, interest-cohort según lo que el sitio realmente necesita. | Fácil | |
Header Server oculto o genéricoNo debe revelar versión exacta de Apache/nginx. Configurable en .htaccess o nginx.conf. |
Medio | |
X-Powered-By eliminadoNo debe revelar versión de PHP. Se puede eliminar con Header unset X-Powered-By en Apache. |
Fácil |
| ✓ | Control | Dificultad |
|---|---|---|
| Autenticación de dos factores (2FA) activa para administradoresPlugins recomendados: WP 2FA, Two Factor. Usar TOTP (app como Google Authenticator o Authy). | Fácil | |
URL de login cambiadaNo usar /wp-admin/ ni /wp-login.php públicamente accesibles. Plugin: WPS Hide Login. |
Fácil | |
| Límite de intentos de login configuradoBloquear IP tras N fallos consecutivos (recomendado: 5 intentos). Plugin: Limit Login Attempts Reloaded. | Fácil | |
| XML-RPC deshabilitado si no se usaVector de ataques de fuerza bruta y DDoS. Si no usas Jetpack o apps móviles WP, desactívalo. | Fácil | |
Enumeración de usuarios bloqueada/?author=1 no debe redirigir ni revelar nombres de usuario. Bloquear en .htaccess o con plugin. |
Medio | |
| Ningún usuario administrador se llama "admin"Es el primer usuario que los atacantes prueban en ataques de fuerza bruta. Renombrar si existe. | Fácil | |
| Contraseñas de administradores ≥ 16 caracteresUsar el generador de contraseñas de WordPress o un gestor (Bitwarden, 1Password). Sin reutilización. | Fácil |
| ✓ | Control | Dificultad |
|---|---|---|
| Sin plugins inactivos instaladosLos plugins desactivados siguen siendo código ejecutable. Eliminar los que no se usen. | Fácil | |
| Todos los plugins actualizados a la última versiónLa mayoría de compromisos de WordPress ocurren por plugins desactualizados con CVEs conocidos. | Fácil | |
| Sin temas inactivos instaladosMantener solo el tema activo (y Twenty Twenty-X si es el parent theme). Eliminar el resto. | Fácil | |
| Plugins instalados solo desde fuentes oficialesWordPress.org o el desarrollador original. Sin plugins "nulled" ni de fuentes desconocidas. | Fácil | |
| Ningún plugin activo con CVE público sin parcheVerificar en WPScan Vulnerability Database (wpscan.com) o Wordfence Intelligence. Revisar mensualmente. | Medio | |
| Plugin de seguridad activo y configuradoWordfence (gratuito), iThemes Security o Solid Security. Configurar al menos escaneo de archivos y alertas. | Fácil |
| ✓ | Control | Dificultad |
|---|---|---|
WordPress core en última versión estableVerificar en el panel o con WP-CLI: wp core check-update. Actualizar si hay versión disponible. |
Fácil | |
Actualizaciones automáticas menores habilitadasLas actualizaciones de seguridad de parche (5.x.y) deben aplicarse automáticamente. Verificar en wp-config.php: define('WP_AUTO_UPDATE_CORE', 'minor'); |
Fácil | |
| Revisión mensual de actualizaciones mayores agendadaLas versiones mayores (6.x) requieren revisión manual. Agendar revisión el primer lunes de cada mes. | Fácil | |
| Entorno de staging para probar actualizaciones antes de producciónEspecialmente importante antes de actualizaciones mayores. Muchos hostings ofrecen staging con un click. | Medio |
| ✓ | Control | Dificultad |
|---|---|---|
Prefijo de tabla distinto al predeterminado wp_Cambiarlo reduce el impacto de ataques SQLi automatizados. Configurable en instalación o con plugin WP-DBManager. |
Medio | |
| Usuario de base de datos con mínimos privilegiosSolo necesita SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER sobre su propia DB. No usar root. | Medio | |
Base de datos no accesible desde internetMySQL/MariaDB debe hacer bind a 127.0.0.1. Verificar con netstat -tlnp | grep 3306. |
Medio | |
| Backup de DB diario con retención mínima 30 díasPlugin UpdraftPlus o BackWPup. Almacenar en destino remoto (S3, Google Drive, Dropbox). | Fácil | |
wp-config.php con permisos 600 y protegidoMover un directorio por encima del webroot si el hosting lo permite. Permisos: chmod 600 wp-config.php. |
Medio |
| ✓ | Control | Dificultad |
|---|---|---|
Carpetas con permisos 755, archivos con 644El servidor web necesita leer los archivos pero no escribirlos. Verificar con find . -type f ! -perm 644. |
Medio | |
Edición de archivos desde el panel deshabilitadaAgregar a wp-config.php: define('DISALLOW_FILE_EDIT', true);. Previene edición en caso de compromiso de credenciales. |
Fácil | |
Versión de WordPress ocultaEliminar <meta name="generator"> del head y del feed RSS con remove_action en functions.php. |
Fácil | |
.htaccess protege wp-config.php y wp-includes/Bloquear acceso directo a wp-config.php y a archivos PHP dentro de wp-includes/ vía Apache rules. |
Medio | |
Directorio /wp-content/uploads/ sin ejecución PHPAgregar a .htaccess dentro de uploads: php_flag engine off. Evita que archivos subidos se ejecuten como scripts. |
Fácil | |
Instalación de plugins/temas deshabilitada desde el panelEn entornos de producción estables: define('DISALLOW_FILE_MODS', true);. Actualizar vía WP-CLI o staging. |
Avanzado |
| ✓ | Control | Dificultad |
|---|---|---|
| Backup completo (DB + archivos) con frecuencia diariaUsar UpdraftPlus, BackWPup o snapshot del hosting. Al menos 1 backup completo por día para sitios activos. | Fácil | |
| Backup almacenado en ubicación remotaNo solo en el propio servidor. Si el servidor es comprometido o falla el disco, el backup local no sirve. Usar S3, Google Drive, Dropbox o Backblaze B2. | Fácil | |
| Restauración de backup probada en los últimos 90 díasUn backup no verificado no es un backup. Restaurar en staging y confirmar que el sitio funciona correctamente. | Medio | |
| Monitoreo de integridad de archivos activoWordfence o iThemes Security generan una firma de los archivos core y alertan si alguno cambia inesperadamente. | Fácil | |
| Alertas configuradas ante cambios en archivos coreEl monitoreo debe notificar por email (o Slack/webhook) cuando detecta cambios. Verificar que las alertas lleguen. | Fácil | |
| HTTPS forzado en todas las URLs del sitioSin mixed content (recursos HTTP en página HTTPS). Verificar con herramientas como Why No Padlock. Redirigir HTTP → HTTPS en .htaccess. | Fácil |