El componente de seguridad crea una forma de integrar seguridad de forma más estricta en tu aplicación. Proporciona métodos para diversas tareas como:
Restringir qué métodos HTTP acepta tu aplicación.
Protección contra manipulación de formularios.
Requerir que se utilice SSL.
Limitación de la comunicación entre controladores.
Como todos los componentes, se configura a través de varios parámetros configurables.
Todas estas propiedades se pueden establecer directamente o a través de métodos setter
del mismo nombre en beforeFilter()
de tu controlador.
Al usar el componente de seguridad, obtienes automáticamente protección contra la manipulación de formularios. Los campos token ocultos se insertarán automáticamente en los formularios y serán verificados por el componente de seguridad.
Si estas utilizando las funciones de protección de formularios del componente de
seguridad y otros componentes que procesan datos de formularios en tus devoluciones
de llamada startup()
, asegúrate de colocar el componente de seguridad antes de
esos componentes en tu método initialize()
.
Nota
Al usar el componente de seguridad, debes usar FormHelper para crear tus
formularios. Además, no debes reescribir ninguno de los «nombres» de los
campos. El componente de seguridad busca ciertos indicadores que son creados
y manejados por FormHelper (especialmente esos creados en
create()
y
end()
). Es probable que la modificación
dinámica de los campos que se envían en una solicitud POST, como deshabilitar,
borrar o crear nuevos campos a través de JavaScript, haga que la solicitud se
envíe a la devolución de llamada de blackhole.
Siempre debes verificar el método HTTP que se utiliza antes de ejecutarlo para
evitar efectos secundarios. Debes verificar el método HTTP
o usar Cake\Http\ServerRequest::allowMethod()
para asegurarte
de que se utiliza el método HTTP correcto.
Si una acción está restringida por el componente de seguridad, es “black-holed”
como una solicitud no válida que dará como resultado un error 400 por defecto.
Puedes configurar este comportamiento seteando la opción de configuración
blackHoleCallback
para una función de devolución de llamada en el controlador.
Al configurar un método de devolución de llamada, puedes personalizar como el proceso blackhole funciona:
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
$this->Security->setConfig('blackHoleCallback', 'blackhole');
}
public function blackhole($type, SecurityException $exception)
{
if ($exception->getMessage() === 'Request is not SSL and the action is required to be secure') {
// Reformule el mensaje de excepción con un string traducible.
$exception->setMessage(__('Please access the requested page through HTTPS'));
}
// Vuelve a lanzar la excepción reformulada condicionalmente.
throw $exception;
// Alternativamente, maneja el error. Por ejemplo, configura un mensaje flash &
// redirige a la versión HTTPS de la página solicitada.
}
El parámetro $type
puede tener los siguientes valores:
“auth” Indica un error de validación de formulario o un error de discrepancia entre controlador y acción.
“secure” Indica un error de restricción del método SSL.
Por defecto, SecurityComponent
evita que los usuarios alteren los formularios
de formas específicas. El SecurityComponent
evitará las siguientes cosas:
Los campos desconocidos no podrán ser agregados al formulario.
Los campos no pueden ser eliminados del formulario.
Los valores en las entradas ocultas no podrán ser modificadas.
La prevención de este tipo de manipulación se logra trabajando con FormHelper
y rastreando qué campos hay en un formulario. También se realiza un seguimiento
de los valores de los campos ocultos. Todos estos datos se combinan y se convierten
en un hash. Cuando un formulario es enviado, SecurityComponent
usará los datos
POST para construir la misma estructura y comparar el hash.
Nota
SecurityComponent no evitará que se agreguen/cambien opciones seleccionadas. Tampoco impedirá que se agreguen/cambien opciones de radio.
Establecer en una lista de campos de formulario para excluir de la validación
POST. Los campos se pueden desbloquear en el componente o con FormHelper::unlockField()
.
Los campos que han sido desbloqueados no están obligados a ser parte del POST
y los campos desbloqueados ocultos no tienen su valores verificados.
Establece en false
para omitir por completo la validación de las solicitudes
POST, esencialmente desactivando las validaciones de los formularios.
La configuración del componente de seguridad generalmente se realiza en las
devoluciones de llamada initialize
o beforeFilter()
del controlador:
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\EventInterface;
class WidgetsController extends AppController
{
public function initialize(): void
{
parent::initialize();
$this->loadComponent('Security');
}
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
if ($this->request->getParam('prefix') === 'Admin') {
$this->Security->setConfig('validatePost', false);
}
}
}
El ejemplo anterior deshabilitaría la prevención de manipulación de formularios para rutas con prefijo de administrador.
CSRF o Cross Site Request Forgery es una vulnerabilidad común en las aplicaciones web. Permite a un atacante capturar y reproducir una solicitud anterior, y a veces, enviar solicitudes de datos utilizando etiquetas de imagen o recursos en otros dominios. Para habilitar las funciones de protección CSRF.
Hay muchos casos en los que querrías deshabilitar la prevención de manipulación
de formularios para una acción (por ejemplo, solicitudes AJAX). Puedes «desbloquear»
estas acciones enumerándolas en $this->Security->unlockedActions
en tu
beforeFilter()
:
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\EventInterface;
class WidgetController extends AppController
{
public function initialize(): void
{
parent::initialize();
$this->loadComponent('Security');
}
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
$this->Security->setConfig('unlockedActions', ['edit']);
}
}
Este ejemplo deshabilitaría todas las comprobaciones de seguridad para las acciones de edición.