Validação de formulários PHP

Esta seção e a seção seguinte explicam como usar PHP para validar dados de formulários.

Validação de formulários PHP

Dica:Dê atenção à segurança ao lidar com formulários PHP!

Essas páginas mostrarão como lidar de maneira segura com formulários PHP. Validar os dados do formulário HTML é importante para prevenir hackers e spam!

Os formulários HTML que usaremos mais tarde contêm vários campos de entrada: campos de texto obrigatórios e opcionais, botões de opção e botão de envio:

O formulário acima usa as seguintes regras de validação:

Campo Regras de validação
Nome Obrigatório. Deve conter letras e espaços.
E-mail Obrigatório. Deve conter um endereço de e-mail válido (inclusivo de @ e .).
Website Opcional. Se preenchido, deve conter um URL válido.
Comentário Opcional. Campo de entrada de múltiplas linhas (caixa de texto).
Gênero Obrigatório. É necessário selecionar uma opção.

Primeiro vamos olhar para o código HTML puro deste formulário:

Campo de texto

Os campos name, email e website são elementos de entrada de texto, o campo comment é uma caixa de texto. O código HTML é o seguinte:

Nome: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comentário: <textarea name="comment" rows="5" cols="40"></textarea>

Botão de opção

O campo gender é um botão de opção, o código HTML é o seguinte:

Gênero:
<input type="radio" name="gender" value="female">Feminino
<input type="radio" name="gender" value="male">Masculino

Elementos do formulário

O código HTML do formulário é o seguinte:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>

Quando este formulário for submetido, os dados do formulário são enviados via method="post".

O que é a variável $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] é uma variável global, que retorna o nome do arquivo do script em execução.

Portanto, $_SERVER["PHP_SELF"] envia os dados do formulário para a página herself, em vez de redirecionar para outra página. Dessa forma, o usuário pode obter mensagens de erro na página do formulário.

O que é a função htmlspecialchars()?

A função htmlspecialchars() converte caracteres especiais em entidades HTML. Isso significa que caracteres como < e > serão substituídos por < e >. Isso impede que os atacantes utilizem HTML ou JavaScript injetados no formulário (ataques de cross-site scripting) para explorar o código.

Dica importante sobre a segurança de formulários PHP

A variável $_SERVER["PHP_SELF"] pode ser explorada por hackers!

Se sua página usar PHP_SELF, os usuários podem inserir traços e executar scripts cross-site (XSS).

Dica:Cross-site scripting (XSS) é um tipo de vulnerabilidade de segurança de computador, comum em aplicações web. XSS permite que o atacante insira scripts clientes em páginas web visualizadas por outros usuários.

Suponha que uma página chamada "test_form.php" contenha o seguinte formulário:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Agora, se o usuário acessar o URL normal na barra de endereços: "http://www.example.com/test_form.php", o código acima será convertido para:

<form method="post" action="test_form.php">

Até agora, tudo está normal.

No entanto, se o usuário inserir o seguinte URL na barra de endereços:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

Neste caso, o código acima será convertido para:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

Este código adiciona um script e um comando de aviso. E quando esta página for carregada, o código JavaScript será executado (o usuário verá uma janela de aviso). Este é apenas um caso simples e inofensivo sobre como o variável PHP_SELF é utilizada.

Você deve estar ciente de que O tag <script> permite adicionar qualquer código JavaScript.!Hackers can redirect users to a file on another server, where malicious code can change global variables or submit forms to other addresses to save user data, etc.

How to prevent the exploitation of $_SERVER["PHP_SELF"]?

Using the htmlspecialchars() function can prevent the exploitation of $_SERVER["PHP_SELF"]

The form code is like this:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

The htmlspecialchars() function converts special characters to HTML entities. Now, if the user tries to exploit the PHP_SELF variable, it will result in the following output:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

Not usable, no harm!

Validate form data with PHP

The first thing we need to do is pass all variables through the PHP htmlspecialchars() function.

After we use the htmlspecialchars() function, if the user tries to submit the following content in a text field:

<script>location.href('http://www.hacked.com')</script>

- The code will not execute because it will be saved as escaped code, like this:

<script>location.href('http://www.hacked.com')</script>

Now this code is safe to display on a page or in an e-mail.

When the user submits the form, we also need to do two things:

  1. (By using the PHP trim() function) remove unnecessary characters from the user's input data (extra spaces, tabs, new lines, etc.)
  2. (By using the PHP stripslashes() function) remove backslashes (\) from the user's input data

Next, we create a check function (this is more efficient than writing code repeatedly).

We name the function test_input().

Now, we can check each $_POST variable using the test_input() function. The script is like this:

Example

<?php
// Define variables and set them to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

Executar Exemplo

Atenção, no início do script, verificamos se o formulário foi submetido usando $_SERVER["REQUEST_METHOD"]. Se REQUEST_METHOD for POST, o formulário foi submetido e deve ser validado. Se não for submetido, pule a validação e mostre um formulário em branco.

No entanto, no exemplo acima, todos os campos de entrada são opcionais. Mesmo que o usuário não insira nenhum dado, o script funcionará normalmente.

O próximo passo é criar campos de entrada obrigatórios e criar mensagens de erro que sejam necessárias.