wp-config.php es el archivo más sensible de una instalación de WordPress. Guarda en texto plano el nombre, el usuario, la contraseña y el host de la base de datos, además de las claves de autenticación y los salts que WordPress usa para firmar las cookies de sesión. Quien pueda leerlo puede leer toda tu base de datos. Merece una protección más estricta que el esquema 644 y 755 que se aplica al resto.
Endurece sus permisos
El valor por defecto suele ser 644, que permite a todos los usuarios del servidor leer el archivo. En un hosting compartido, «todos los usuarios» no es una hipótesis. Endurécelo:
- 600 (el propietario lee y escribe) es la opción común más estricta.
chmod 600 wp-config.php - 640 (el propietario lee y escribe, el grupo lee) hace falta en algunos hostings donde el servidor web se ejecuta con el grupo del archivo y no con su propietario.
- 440 o 400 (solo lectura) también sirve y evita que el archivo se edite por accidente o por un script. Entonces hay que aflojarlo brevemente para editarlo.
La prueba es sencilla: aplica el valor más estricto y carga el sitio. Si muestra un error de base de datos o una página en blanco, PHP no pudo leer el archivo, así que sube a 640. No saltes a 777, que hace el archivo escribible por cualquiera. La guía de permisos de archivos cubre el resto del sitio.
Muévelo por encima de la raíz web
WordPress busca wp-config.php primero en su propia carpeta y luego una carpeta más arriba. Si subes el archivo un nivel, deja de estar dentro del directorio que publica el servidor web. Aunque un error de configuración sirviera algún día el código PHP como texto en lugar de ejecutarlo, el archivo no estaría ahí para encontrarlo.
Funciona cuando WordPress está en la raíz web y nada más en la carpeta superior es una instalación de WordPress. Algunos hostings compartidos restrictivos bloquean el acceso fuera de la raíz web; en ese caso déjalo donde está y apóyate en los permisos y en la regla del servidor de abajo.
Bloquea las peticiones directas en el servidor web
En Apache, una regla en .htaccess puede rechazar cualquier petición del archivo por URL. Añade esto cerca del principio del archivo en la raíz de tu sitio:
<Files wp-config.php> Require all denied </Files>
En Nginx, el equivalente es un bloque location = /wp-config.php que devuelva un 404 o deniegue la petición. El soporte de tu hosting puede añadirlo si no gestionas la configuración del servidor.
Rota las claves secretas tras un incidente
El archivo contiene además ocho claves de autenticación y salts. WordPress los usa para firmar las cookies de sesión. Si sospechas que alguien tuvo acceso, genera un conjunto nuevo y sustituye los valores antiguos. Todas las sesiones existentes se invalidan, de modo que quien tenga una cookie robada queda desconectado, sin que nadie tenga que cambiar una contraseña. Con WP-CLI es un solo comando: wp config shuffle-salts. Si no, usa el generador oficial de claves secretas de WordPress y pega el resultado.
Algunos ajustes seguros que añadir
- Desactiva el editor de archivos integrado.
define( 'DISALLOW_FILE_EDIT', true );quita los editores de temas y plugins de wp-admin, para que un acceso de administrador robado no sirva para editar PHP desde el navegador. - Mantén la depuración desactivada en producción.
WP_DEBUGdebe estar en false en un sitio en línea. Si necesitas registros, envíalos a un archivo conWP_DEBUG_LOGy ponWP_DEBUG_DISPLAYen false, porque los errores en pantalla pueden revelar rutas de archivos. - Fuerza HTTPS para los accesos.
define( 'FORCE_SSL_ADMIN', true );mantiene el área de administración y el inicio de sesión en HTTPS. - Da al usuario de la base de datos solo lo que necesita. Debe tener acceso a la base de datos de este sitio y a nada más, y su contraseña debe ser única, como aconseja la lista de seguridad.
Cómo comprobarlo
Pide el archivo como lo haría un extraño. Ejecuta curl -I https://tusitio.example/wp-config.php. Quieres un 403 o un 404, o un 200 con el cuerpo vacío (PHP se ejecutó y no imprimió nada). Si alguna vez ves el texto del archivo, detente y cambia de inmediato la contraseña de la base de datos y las claves secretas. Después comprueba los permisos con ls -l wp-config.php y confirma que el sitio sigue cargando.
Qué no hacer
No aflojes los permisos del archivo para «arreglar» un plugin que dice no poder leerlo. Casi siempre es un problema en otro sitio, y 777 en el archivo que guarda la contraseña de tu base de datos es uno de los peores lugares para cometer un error. Tampoco dejes copias en carpetas públicas. Un wp-config.php.bak o wp-config.old olvidado en la raíz del sitio o en uploads/ es una forma común de filtrar este archivo, porque el servidor lo entrega como texto plano. Borra las copias o guárdalas fuera de la raíz web.
SiftWP comprueba los permisos y la ubicación de wp-config.php en su escaneo semanal y señala el archivo si alguna vez queda legible por todos o está donde no debe. Los escaneos se ejecutan por SSH, sin ningún plugin en el sitio.