Neste artigo usaremos como base o código do post anterior e melhorar a segurança do formulário de contato, clique aqui para conferir. Primeiras coisas, primeiro, proponho passarmos por todas as falhas que aquele código possuí. Vamos lá!
<?php // Recuperando os dados do formulário $nome = $_POST["nome"]; $email = $_POST["email"]; $mensagem = $_POST["mensagem"]; // Configurando o e-mail a ser enviado $to = "[email protected]"; $subject = "Mensagem de contato"; $message = "Nome: $nome\nE-mail: $email\nMensagem: $mensagem"; $headers = "From: $email"; // Enviando o e-mail mail($to, $subject, $message, $headers); // Redirecionando o usuário para uma página de agradecimento header("Location: agradecimento.html"); exit; ?>
Existem alguns problemas com o código acima:
- Falta de validação dos dados do formulário: o código não verifica se os campos obrigatórios foram preenchidos, se o endereço de e-mail é válido ou se a mensagem não ultrapassa o tamanho máximo permitido. Isso pode levar a problemas de segurança, como ataques de injeção de código, e a erros de processamento do formulário.
- Falta de sanitização dos dados do formulário: o código não limpa os dados do formulário antes de processá-los. Isso pode deixar o script vulnerável a ataques de cross-site scripting (XSS) e outros tipos de vulnerabilidades de segurança.
- Usando o endereço de e-mail do usuário como remetente: o código usa o endereço de e-mail do usuário como o remetente do e-mail. Isso pode deixar o script vulnerável a abuso por parte de spammers.
- Falta de autenticação: o código não inclui nenhuma camada de autenticação para proteger o script. Isso significa que qualquer pessoa pode enviar dados pelo formulário.
- Falta de manutenção: o código não está sendo mantido atualizado com as últimas correções de segurança e não faz backup regularmente. Isso pode deixar o script vulnerável a novas vulnerabilidades de segurança que possam surgir.
Vamos reescrever o código melhorando ele:
<?php // 1 Recuperando os dados do formulário $nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING); $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); $mensagem = filter_input(INPUT_POST, 'mensagem', FILTER_SANITIZE_STRING); // 2 Verificando se os campos obrigatórios foram preenchidos if (empty($nome) || empty($email) || empty($mensagem)) { header("Location: formulario.php?erro=1"); exit; } // 2 Verificando se o endereço de e-mail é válido if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { header("Location: formulario.php?erro=2"); exit; } // 2 Verificando se a mensagem não ultrapassa o tamanho máximo permitido if (strlen($mensagem) > 500) { header("Location: formulario.php?erro=3"); exit; } // 3 Configurando o e-mail a ser enviado $to = "[email protected]"; $subject = "Mensagem de contato"; $message = "Nome: $nome\nE-mail: $email\nMensagem: $mensagem"; $headers = "From: [email protected]\r\nReply-To: $email"; // 3 Enviando o e-mail mail($to, $subject, $message, $headers); // Redirecionando o usuário para uma página de agradecimento header("Location: agradecimento.html"); exit; ?>
Na primeira parte do código, os dados do formulário são recuperados e passados através da função filter_input
para sanitizá-los. A função filter_input
recebe três parâmetros: o tipo de entrada (nesse caso, INPUT_POST
, que significa que os dados são enviados pelo método POST do formulário), o nome do campo do formulário ('nome'
, 'email'
, 'mensagem'
) e o tipo de filtro a ser aplicado (FILTER_SANITIZE_STRING
, FILTER_SANITIZE_EMAIL
, FILTER_SANITIZE_STRING
). O resultado da função é atribuído às variáveis $nome
, $email
e $mensagem
.
Na segunda parte do código, o script verifica se os campos obrigatórios foram preenchidos. Isso é feito usando a função empty
, que verifica se uma variável é vazia. Se qualquer um dos campos estiver vazio, o script redireciona o usuário para a página do formulário com um código de erro. Em seguida, o script verifica se o endereço de e-mail fornecido pelo usuário é válido. Isso é feito usando a função filter_var
, que recebe dois parâmetros: a variável a ser verificada (nesse caso, $email
) e o tipo de filtro a ser aplicado (nesse caso, FILTER_VALIDATE_EMAIL
, que verifica se o valor é um endereço de e-mail válido). Se o endereço de e-mail for inválido, o script redireciona o usuário para a página do formulário com um código de erro específico (?erro=2
).
Na terceira parte, o e-mail é enviado para o administrador do site com o seu conteúdo assegurado contra as principais formas de ataque usadas.
No próximo tutorial exploraremos como ao invés de apenas enviar um e-mail, também salvar em um banco de dados as informações de contato.