Formulários de contacto no WordPress: uma lista de verificação de segurança
Contact Form 7, WPForms, Gravity Forms, Ninja Forms ou Fluent Forms – o plugin importa menos do que a forma como é configurado e mantido. Eis o que verificar, e o que voltar a verificar após cada atualização.
A maioria dos sítios WordPress utiliza um de um pequeno número de plugins de formulários: Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Fluent Forms e alguns outros. Qualquer um deles pode ser utilizado de forma segura ou deixado escancarado. A diferença raramente está no próprio plugin, mas sim nas suas definições, nos extras à sua volta, na forma como o correio sai do servidor e no que acontece às mensagens quando chegam.
- Mantenha atualizados o plugin de formulários e todos os extras, e apague os que já não utiliza.
- Ative o antispam do próprio plugin – honeypot, integração de CAPTCHA, Akismet quando adequado – e confirme que funciona realmente.
- Envie as notificações por SMTP autenticado a partir de um endereço do seu próprio domínio.
- Restrinja os carregamentos por tipo e tamanho, e impeça que os ficheiros carregados sejam listados ou navegáveis publicamente.
- Mantenha o endereço de e-mail do destinatário fora da página e do respetivo código-fonte.
- Guarde apenas as entradas de que precisa, e apenas durante o tempo necessário.
- Faça uma breve verificação após cada atualização do WordPress, do tema ou de qualquer plugin.
Atualizações: o plugin de formulários e tudo o que o rodeia
Os plugins de formulários são alvos populares porque aceitam dados de qualquer pessoa na Internet. As correções de segurança chegam como atualizações normais, por isso atualize rapidamente – e não apenas o plugin principal. Os extras para pagamentos, carregamentos, ligações a CRM, lógica condicional ou fornecedores adicionais de CAPTCHA são código separado, com as suas próprias vulnerabilidades. O mesmo se aplica a plugins que instalou um dia para um teste e esqueceu. Desativar não basta: os plugins desativados continuam no servidor, e os seus ficheiros podem, em alguns casos, ser acedidos diretamente. Se não o utiliza, apague-o.
Antispam: ative-o e depois comprove que funciona
A maioria dos plugins de formulários tem as suas próprias opções antispam ou integra-se com serviços externos: um campo honeypot que os bots preenchem e as pessoas nunca veem, CAPTCHAs como reCAPTCHA, hCaptcha ou Cloudflare Turnstile, e o Akismet, que compara o conteúdo das mensagens com uma base de dados de spam. As opções variam consoante o plugin e a versão, por isso verifique as definições em vez de presumir. Os CAPTCHAs externos carregam scripts de terceiros, e o Akismet envia o conteúdo submetido para um serviço externo – ambos devem constar da sua política de privacidade e, consoante a sua configuração, da sua gestão de consentimentos.
O problema mais comum é uma proteção que está ativada mas não funciona. Um CAPTCHA a funcionar com chaves de teste públicas deixa passar tudo. Um widget cujo script é bloqueado por um plugin de cache ou de otimização, ou por um erro de JavaScript, não trava nada. Um campo honeypot sem os estilos que o ocultam é lido pelos leitores de ecrã e preenchido por visitantes reais. Por isso, após qualquer alteração, abra o formulário numa janela privada, verifique a consola do navegador e o código-fonte da página e envie uma mensagem de teste. Se quiser uma proteção que não dependa da Google, o plugin gratuito da formexposed para WordPress acrescenta um honeypot, uma verificação de tempo e proof-of-work e volta a verificar o sítio após as atualizações de plugins – uma opção entre várias.
Correio: como é enviado e para onde vai
Por predefinição, o WordPress entrega o correio à função de correio do PHP do servidor e, em muitos alojamentos, essas mensagens estão mal autenticadas e acabam no spam – ou desaparecem silenciosamente. Em vez disso, envie através de um plugin SMTP ou do serviço de correio do seu alojamento, utilizando uma caixa de correio real com nome de utilizador e palavra-passe e um endereço de remetente do seu próprio domínio, como um endereço forms@ dedicado. Os registos SPF, DKIM e DMARC do domínio têm de abranger este remetente. Não coloque o endereço do visitante no campo From: não é o seu domínio, pelo que a mensagem não consegue passar no alinhamento DMARC e, consoante a política do domínio do visitante, acaba no spam ou é rejeitada. Defina-o como Reply-To e continuará a poder responder com um clique.
O endereço do destinatário pertence às definições do plugin, não à página. Verifique o código-fonte da sua página de contacto: uma ligação mailto junto ao formulário, ou um campo oculto com o endereço do destinatário, entrega esse endereço a todos os bots recolectores. Em formulários mais antigos ou feitos à medida pode ser pior – se o servidor confiar num campo oculto de destinatário, qualquer pessoa pode alterá-lo e utilizar o seu formulário para enviar correio para endereços arbitrários.
Carregamentos e entradas guardadas
O carregamento de ficheiros é a funcionalidade de formulário mais arriscada, por isso pergunte-se primeiro se precisa dela. Se precisar, permita apenas os tipos que efetivamente espera – por exemplo, PDF e formatos de imagem comuns – em vez de bloquear alguns tipos perigosos, e defina um limite de tamanho. Verifique onde o plugin guarda os carregamentos: não podem ser listáveis num diretório público e, idealmente, não devem sequer ser acessíveis num endereço adivinhável. Apague-os depois de tratados, ou envie-os como anexos em vez de os manter no servidor.
Muitos plugins de formulários ou os respetivos extras guardam cada submissão na base de dados do WordPress, muitas vezes incluindo o spam. É uma cópia de segurança útil quando o correio falha, mas também uma pilha crescente de dados pessoais. Ao abrigo do princípio da limitação da conservação do RGPD (art. 5(1)(e)), esses dados não devem ser conservados por mais tempo do que o necessário. Decida se precisa de entradas guardadas, de que campos e durante quanto tempo e, depois, utilize a definição de apagamento automático do plugin, se existir, ou apague regularmente as entradas antigas. As cópias de segurança da base de dados contêm os mesmos dados.
Após cada atualização
- 1Abra a página de contacto numa janela privada: o formulário e o respetivo elemento antispam são apresentados corretamente e a consola do navegador não mostra erros.
- 2Veja o código-fonte da página: o campo honeypot e o script do CAPTCHA continuam lá, e o endereço do destinatário não.
- 3Envie uma mensagem de teste: chega à caixa de entrada, não ao spam, e os cabeçalhos mostram SPF, DKIM e DMARC aprovados.
- 4Verifique as definições que importam: destinatário, endereço do remetente, tipos e tamanhos de carregamento permitidos, durante quanto tempo as entradas são conservadas.
- 5Verifique se a ligação para a política de privacidade e qualquer texto de consentimento continuam a ser apresentados junto ao formulário.
- 6Anote a data e o que verificou, para saber quando o formulário funcionou comprovadamente pela última vez.
Uma vez tornado rotina, isto demora pouco tempo e apanha exatamente as falhas silenciosas que, de outra forma, passam despercebidas durante semanas. Para uma visão externa, uma verificação gratuita em formexposed.com analisa as páginas de formulários públicas de um sítio sem submeter nada e mostra se a proteção que espera está implementada e configurada de forma eficaz – sem necessidade de conta.