Seguridad
1Introducción
Temma proporciona de forma nativa un conjunto de herramientas para proteger tus aplicaciones web: autenticación y control de acceso, validación de los datos entrantes, protección contra inyecciones SQL, XSS y CSRF, sesiones seguras…
Esta página ofrece una visión general de las mejores prácticas de seguridad en una aplicación Temma. Cada sección enlaza con las páginas de documentación detalladas.
2Autenticación y control de acceso
Temma proporciona un sistema completo de autenticación de usuarios, así como un mecanismo de control de acceso basado en roles y servicios.
- La página Autenticación explica paso a paso cómo configurar un sistema de autenticación sin contraseña.
- El controlador/plugin Auth gestiona el formulario de acceso, el envío de enlaces mágicos por correo electrónico y la sesión del usuario.
- El atributo Auth restringe el acceso a los controladores y las acciones en función de la autenticación, los roles y los servicios del usuario.
- El plugin API protege las APIs con autenticación mediante claves pública/privada.
3Validación de los datos entrantes
Cualquier dato que provenga del exterior (parámetros de URL, variables GET y POST, payload JSON, archivos subidos) debe validarse antes de ser usado.
- La página Validación de datos presenta el sistema completo de validación de Temma, tanto para los datos entrantes como para los salientes.
- Los atributos Check validan los datos entrantes de forma declarativa, directamente en los controladores y las acciones.
- El helper DataFilter valida y filtra los datos a partir de un contrato que define el tipo y las restricciones esperados.
4Inyecciones SQL
Una inyección SQL consiste en ejecutar consultas arbitrarias aprovechando datos insertados en una consulta sin escapar. Nunca construyas una consulta SQL concatenando datos sin escapar.
La fuente de datos SQL proporciona todo lo necesario para protegerte:
- El parámetro parameters de los métodos exec(), queryOne() y queryAll(), que escapa automáticamente los valores.
- Las consultas preparadas, cuyos parámetros también se escapan automáticamente.
- Los métodos quote() y quoteNull() para el escapado explícito.
5Cross-site scripting (XSS)
Un ataque XSS consiste en hacer que el sitio muestre código HTML o JavaScript malicioso, generalmente inyectado a través de contenido proporcionado por el usuario.
- La vista Smarty activa el escapado automático por defecto: todas las variables mostradas en las plantillas se escapan, salvo que se use explícitamente el modificador |raw. Usa este modificador solo en contenido seguro.
- El helper HTMLCleaner limpia los flujos HTML proporcionados por los usuarios (por ejemplo, provenientes de un editor WYSIWYG), eliminando cualquier código prohibido.
6Cross-site request forgery (CSRF)
Un ataque CSRF consiste en hacer que un usuario autenticado ejecute sin saberlo una acción sensible, provocando una solicitud hacia tu sitio desde un sitio de terceros.
Tres mecanismos se combinan para proteger contra esto:
- Acepta solo solicitudes POST para las acciones sensibles, gracias al atributo Method.
- Las cookies de sesión creadas por Temma tienen el parámetro SameSite=Lax: no se envían en las solicitudes POST provenientes de otro dominio. Una solicitud POST falsificada desde un sitio de terceros llega, por tanto, sin sesión, y la acción protegida por autenticación es denegada.
- El atributo Referer comprueba que la solicitud proviene realmente de una página de tu propio sitio.
7Server-side request forgery (SSRF)
Un ataque SSRF consiste en hacer que el propio servidor realice solicitudes hacia un objetivo controlado por el atacante (por ejemplo, un servicio interno inaccesible desde el exterior), manipulando datos entrantes utilizados para construir la solicitud.
La principal protección es la validación estricta de los datos entrantes utilizados para construir las solicitudes del lado del servidor. En la medida de lo posible, no dejes que el usuario proporcione una URL libre: prefiere una lista blanca de valores permitidos (por ejemplo, con el tipo enum del DataFilter), a partir de la cual el propio servidor construye la URL final.
8Sesiones y cookies
Las sesiones gestionadas por Temma son seguras por defecto:
- Las cookies de sesión se crean con los parámetros httponly (inaccesible desde JavaScript), secure (a través de HTTPS) y SameSite=Lax (consulta la sección CSRF anterior).
- Los identificadores de sesión se generan mediante un generador pseudoaleatorio criptográficamente seguro.
- Los datos de sesión se almacenan en el lado del servidor (mediante el motor de sesiones de PHP, o en una fuente de datos como Redis o Memcache); solo el identificador de sesión viaja en la cookie.
9La configuración x-security
Las directivas de configuración relacionadas con la seguridad se agrupan en la configuración extendida x-security del archivo etc/temma.php.
| Clave | Función | Usada por |
|---|---|---|
| redirect | URL de redirección por defecto cuando se deniega el acceso | atributos Auth, Method, Referer y Check |
| authRedirect | URL de redirección específica cuando se deniega la autenticación | atributo Auth |
| authVariable | Nombre de la variable de plantilla que contiene al usuario actual | atributo Auth |
| methodRedirect | URL de redirección específica cuando se deniega el método HTTP | atributo Method |
| refererRedirect, refererDomain, refererUrl, refererPath | Criterios de redirección y de verificación del referer | atributo Referer |
| auth | Subconfiguración del sistema de autenticación (personalización de correos electrónicos, tablas, etc.) | controlador/plugin Auth y plugin API |
Ejemplo:
<?php
return [
'x-security' => [
// redirección por defecto cuando se deniega el acceso
'redirect' => '/',
// redirección al formulario de acceso cuando no está autenticado
'authRedirect' => '/auth/login',
]
];