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',
    ]
];