Conhecer e fazer uso do recurso de WordPress Nonces é garantir mais segurança para WordPress, evitar ataques do tipo CSRF e proteger suas informações. Muitos desenvolvedores não conhecem essa funcionalidade e através deste artigo tenho a intenção de explicar o que você precisar saber sobre o assunto.
A definição de Nonce
Literalmente falando, Nonce quer dizer um número utilizado uma única vez. Em inglês teríamos algo como number used once ou number once. É um tipo de criptografia onde um determinado número, ou hash, é utilizado apenas uma única vez e muito adotado em sistemas de autenticação e na prevenção dos ataques do tipo CSRF.
In cryptography, a nonce is an arbitrary number that may only be used once. It is similar in spirit to a nonce word, hence the name. It is often a random or pseudo-random number issued in an authentication protocol to ensure that old communications cannot be reused in replay attacks…
https://en.wikipedia.org/wiki/Cryptographic_nonce
A definição de Nonces no contexto do WordPress
O token de segurança do WordPress é chamado Nonces. Por isso há particularidades e especificidades nesse mecanismo na plataforma. Sua principal utilidade é proteger URLs e formulários contra usos maliciosos ou suspeitos.
Embora a letra “N” venha de Number, o WordPress faz uso de números e letras para a composição de valor dos Nonces gerados. Além disso ele tem um tempo de vida específico ao contrário de ser utilizado uma única vez e também é único para cada usuário de acordo com o seu contexto.
Em resumo, é preciso que fique bem claro a tratativa de Nonces no WordPress:
- É o mecanismo de token da plataforma que se chama Nonces;
- Não é somente número, e sim letras e números;
- Ele não é utilizado uma única vez;
- O token é específico para cada usuário por um período de tempo e contexto;
- Ele protege contra vários tipos de ataques e o principal deles é o CSRF;
- Não protege contra ataque repetitivo, uma vez que não há uma checkagem de utilização única.
Uma abordagem super breve sobre o ataque do tipo CSRF
Cross-Site Request Forgery (CSRF) ou Falsificação de Solicitação entre Sites, em linhas gerais, é um tipo de ataque em que uma interface maliciosa (site, e-mail, mensagem instantânea e etc) executa uma ação insperada para um site confiável para executar ações como troca de senha, transferência de valores monetários ou a submissão de um formulário qualquer.
Para se aprofundar mais sobre o assunto considere a leitura dos links abaixo:
- https://pt.wikipedia.org/wiki/Cross-site_request_forgery
- https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) (inglês);
Como funciona o WordPress Nonces
O WordPress Nonces é implementado em todo o core da plataforma, mas os plugins e temas ativados também precisam fazer uso do recurso, caso contrário algumas partes e funcionalidades adicionadas por eles ficarão descobertas.
O valor dos tokens, ou melhor dos Nonces, são alterados a cada 12 horas e são válidos por 24. Logo, a chave atual e a penúltima são consideradas válidas. Isso evita que alguém possa copiar o valor de um Nonce antigo e reutilizá-lo na URL de uma operação de requisição HTTP.
Observe a URL abaixo utilizada para mover um Post para a lixeira, por exemplo.
/wp-admin/post.php?post=99&action=trash&_wpnonce=d4e7c84572
d4e7c84572 é o valor do Nonce informado no parâmetro de URL padrão do WordPress chamado _wpnonce. Agora observe uma outra para limpar o post do cache através do plugin W3 Total Cache.
/wp-admin/admin.php?page=w3tc_dashboard&w3tc_flush_pgcache_purge_page&post_id=99&_wpnonce=85c93a8183
O parâmetro de URL é o mesmo, _wpnonce. Mas o valor do Nonce é diferente. E como falamos no início deste artigo, os Nonces são únicos por usuário e contexto. Em ambos exemplos de URL temos o mesmo usuário, mas contextos diferentes. Um contexto de mover o Post para a lixeira e outro para limpá-lo do cache.
Caso o Nonce tenha expirado ou seja inválido, o WordPress exibirá uma mensagem de erro como demonstrado na imagem abaixo.
A aplicação do WordPress Nonces é realizada em todas as URLs que executam uma ação, nas requisições AJAX e formulários. Volto a repetir, os plugins e temas que adicionam funcionalidades extras na administração devem implementar os Nonces para maior segurança, mas infelizmente nem todos o fazem. Conhecendo o funcionamento você conseguirá validar se o recurso está sendo aplicado ou não.
Como alterar o mecanismo de Nonces do WordPress
Se você não gosta da implementação de Nonce do WordPress, é possível substituí-lo por completo ou alterar funcionalidades específicas. A API do WordPress te permite essas personalizações e sua extensibilidade é incrível, e todas as funções do core para implementar os Nonces são pluggable.
Basicamente você precisará substituir cinco funções. Duas específicas para as requisições em AJAX e outras três para o mecanismo como um tudo. São elas:
- check_admin_referrer();
- check_ajax_referrer();
- wp_create_nonce();
- wp_verify_nonce();
- wp_nonce_tick();
O arquivo wp-config.php e os Nonces do WordPress
O WordPress através do arquivo wp-config.php armazena constantes PHP com hashes que são utilizados em todas as tratativas de senha e criptografia, e claro para os Nonces através das contantes NONCE_KEY e NONCE_SALT.
A imagem abaixo ilustra esse exemplo.
O WordPress.org disponibiliza uma API que gera esses códigos através do serviço secret-key.
Agora que você conhece o WordPress Nonces exija que os temas e plugins em uso no seu site façam uso do recurso, caso contrário delete e se recuse a utilizá-lo. Fazer uso do mecanismo de Nonce é garantir mais segurança e evitar ataques do tipo CSRF como mencionado. E considere proteger o arquivo wp-config.php.