Objetivo del panel interno
Un panel interno suele tocar lo más sensible: usuarios, contenidos, ajustes, precios, datos de clientes. Si alguien entra sin permiso, el daño puede ser real. La buena noticia: con PHP nativo puedes hacer un panel muy sólido si te apoyas en bases simples y bien implementadas.
1) Autenticación: contraseñas bien (sin inventos)
- Guarda contraseñas con password_hash() (bcrypt/argon2).
- Verifica con password_verify().
- No hagas “hash casero” ni guardes sal manual.
- Evita mensajes de error que revelen si el usuario existe.
Extra: si puedes, añade 2FA (aunque sea opcional) para cuentas admin.
2) Sesiones seguras: donde se caen muchos paneles
Sesión segura no es solo “session_start()”. Aplica:
- Regenerar ID tras login: session_regenerate_id(true).
- Cookie con
httponly,secure(si HTTPS) ysamesite. - Timeout por inactividad (ej: 30 min) y cierre automático.
- Opcional: “relogin” para acciones críticas (cambiar password/borrar contenido).
3) CSRF: obligatorio en cualquier panel
Si tu panel tiene formularios (editar, borrar, ajustes), necesitas token CSRF. Flujo:
- Generas token aleatorio y lo guardas en sesión.
- Lo incluyes como input hidden en el formulario.
- En POST, comparas token formulario vs token sesión.
Si falla, devuelves 403 y logueas el intento.
4) Roles y permisos: aunque seas tú solo
Hoy eres tú, mañana entra alguien a editar contenido. Define roles:
- admin: todo.
- editor: contenido (blog/slider), sin ajustes críticos.
- viewer: lectura (estadísticas/logs).
Regla práctica: cada página/acción debe llamar a algo como require_role().
5) Rate limiting y bloqueo por intentos
Para reducir fuerza bruta:
- Máximo 5 intentos en 10 minutos por IP/usuario.
- Bloqueo temporal y mensaje neutro.
- Captcha solo cuando detectas abuso (no desde el inicio).
6) Validación y saneado: entrada y salida
- Entrada: valida tipo/longitud/formato. Ej: email válido, slug solo letras/números/guiones, etc.
- SQL: siempre consultas preparadas (PDO/MySQLi).
- Salida: escapa HTML en lo que el usuario pueda escribir para evitar XSS.
7) Subida de archivos: el agujero clásico
Si permites subir imágenes/documentos, protege:
- Permitir solo extensiones esperadas (webp/jpg/png) y comprobar MIME real.
- Renombrar archivo (no usar el nombre original).
- Guardar fuera de la carpeta ejecutable o bloquear ejecución con configuración.
- Limitar tamaño y dimensiones.
8) Logs y auditoría: te salva cuando pasa algo
Loguea eventos importantes:
- Login OK / login fallido / logout.
- Cambios de ajustes.
- Creación/edición/borrado de contenido.
Guarda: usuario, IP, user-agent, fecha/hora, acción, y un payload mínimo (sin datos sensibles).
9) Cabeceras de seguridad recomendadas
- Content-Security-Policy (CSP) para reducir XSS.
- frame-ancestors (anti clickjacking) o X-Frame-Options.
- X-Content-Type-Options: nosniff
- Referrer-Policy
Checklist final
- Passwords hash/verify + session_regenerate_id.
- Cookie segura + timeout + logout completo.
- CSRF en formularios.
- Roles/permisos por acción.
- Rate limit login.
- PDO y escape anti-XSS.
- Subida de archivos controlada.
- Logs de auditoría.