Ao habilitar o componente CSRF você obtém proteção contra ataques. CSRF ou Cross Site Request Forgery (Falsificação de solicitação entre sites) é uma vulnerabilidade comum nas aplicações web. Esta brecha permite que o atacante capture e responda uma requisição, e as vezes envie dados através de uma requisição usando tags de imagem ou recursos em outros domínios.
O CsrfComponent trabalha setando um cookie no navegador do usuário. Quando os
formulários são criados com o Cake\View\Helper\FormHelper
, um input
hidden é adicionado contendo o token CSRF. Durante o evento Controller.startup
,
se a requisição for POST, PUT, DELETE ou PATCH o componente irá comparar os dados da
requisição e o valor do cookie. Se um deles estiver faltando ou os dois valores forem
imcompatíveis o componente lançará um
Cake\Network\Exception\InvalidCsrfTokenException
.
Nota
Você sempre deve verificar o método HTTP que está sendo usado antes de
tomar uma ação. Você deve verificar o método HTTP
ou usar Cake\Http\ServerRequest::allowMethod()
para garantir que o
método HTTP correto está sendo usado.
Novo na versão 3.1: O tipo da exceção foi mudado de
Cake\Network\Exception\ForbiddenException
para
Cake\Network\Exception\InvalidCsrfTokenException
.
Obsoleto desde a versão 3.5.0: Você deve usar Cross Site Request Forgery (CSRF) Middleware ao invés do
CsrfComponent
.
Simplismente adicionando o CsrfComponent
ao array de componentes,
você pode se beneficiar da proteção contra CSRF fornecida:
public function initialize()
{
parent::initialize();
$this->loadComponent('Csrf');
}
As configurações podem ser passadas ao componente através das configurações de componentes. As configurações disponiveis são:
cookieName
O nome do cookie a ser enviado. O padrão é csrfToken
.
expiry
Quanto tempo o token CSRF deve durar. Padrão para a sessão no navegador.
Aceita valores strtotime
a partir da versão 3.1
secure
Se o cookie será ou não setado com a flag de Segurança. Isto é, o cookie só será setado em conexão HTTPS e qualquer tentativa sobre uma conexão HTTP normal irá falhar. O padrão é false
.
field
O nome do campo no formulário a ser checado. O padrão é _csrfToken
. Mudar esta opção exigirá também configurações no FormHelper.
Quando habilitado, você pode acessar o CSRF token atual fazendo uma chamada ao objeto:
$token = $this->request->getParam('_csrfToken');
O CsrfComponent integra perfeitamente com o FormHelper
. Toda vez que você
cria um formulário com o FormHelper, ele irá gerar um input hidden contendo o CSRF
token.
Nota
Quando usar o CsrfComponent você sempre deverá iniciar seus formulários com o FormHelper. Senão, você precisará criar o input hidden manualmente para cada formulário que fizer.
Além dos dados da requisição, os tokens CSRF podem ser enviados através
de um cabeçalho especial X-CSRF-Token
. Usar um cabeçalho geralmente
facilita a integração de tokens CSRF com aplicações javascript, ou APIs baseadas
em XML/JSON.
Embora não recomendado, você pode querer desabilitar o CsrfComponent em certas
requisições. Você pode fazer isto usando o event dispatcher
do controller,
no método beforeFilter()
:
public function beforeFilter(Event $event)
{
$this->eventManager()->off($this->Csrf);
}