Melhorando a segurança do nosso formulário de contato (Parte 2)

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Related posts

Leave a Comment