O que você precisa saber sobre WordPress Nonces

Conheça e faça uso do WordPress Nonces para garantir segurança para WordPress, evitando ataques do tipo CSRF e protegendo suas informações.

Seus amigos merecem saber desse conteúdo?

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.

Exemplo de mensagem de erro do WordPress Nonces

 

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.

Exemplo de retorno do serviço secret-key do WordPress.org
Exemplo de retorno do serviço secret-key do WordPress.org

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.

Opa! Não conseguimos encontrar o seu formulário.