Validação de formulário PHP: guia completo
A validação do formulário PHP é um aspecto importante que garante que os dados enviados pelo usuário sejam precisos , completos e seguros . Neste capítulo, mostraremos como validar os dados do formulário por meio do PHP .
Validação de Formulário PHP
Estas páginas mostrarão como processar formulários PHP mantendo a segurança em mente. Para proteger seu formulário contra hackers e spammers, é importante que os dados do formulário sejam validados adequadamente.
Aqui estão alguns dos campos de entrada que trabalharemos nestes capítulos.
Este formulário deve ser validado de acordo com as seguintes regras:
Aqui estão as regras de validação que precisam ser seguidas para o formulário acima:
Campos | Regras de Validação |
Primeiro nome: | Campo obrigatório + Deve haver apenas letras e espaços em branco no texto |
Sobrenome: | Campo obrigatório + Deve haver apenas letras e espaços em branco no texto |
Idade: | Campo obrigatório + Número válido maior que 0 |
Campo obrigatório + O endereço de e-mail deve conter um (@ e .) | |
Ano de Experiência: | Campo opcional + Se tiver experiência, digite um número maior que 0 |
Designação: | Campo obrigatório + Deve haver apenas letras e espaços em branco no texto |
Campo opcional + Se tiver conta no linkedIn, insira-o | |
Escreva suas habilidades: | Campo obrigatório + Deve haver apenas letras e espaços em branco no texto |
Campos de texto
Entre os diferentes campos disponíveis, você encontrará um elemento de entrada de texto para nome , sobrenome , idade , email , designação e linkedin , e uma área de texto para escrever suas habilidades.
Como você pode ver no código HTML, ele se parece com isso:
First name: <input type="text" name="firstname"> Last name: <input type="text" name="lastname"> Age: <input type="text" name="age"> E-mail: <input type="text" name="email"> Designation: <input type="text" name="designation"> LinkedIn: <input type="text" name="linkedin"> Write your Skills: <textarea name="skills" rows="5" cols="40"></textarea>
Botão Selecionar
Os campos do ano de experiência são botões de opção de seleção e o código HTML se parece com isto:
<label for="yrofexp">Year of Experience:</label> <select name="yrofexp" id="yrofexp"> <option value="">Select number</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> </select>
O elemento de formulário
Aqui está o código HTML para o formulário que se parece com isso:
<form method=”post” action=”<?php echo htmlspecialchars($_SERVER[“PHP_SELF”]);?>”>
Qual é o significado da variável $_SERVER[“PHP_SELF”]?
'$_SERVER[“PHP_SELF”]' é uma super variável global que retorna o nome do arquivo que está executando o script no momento atual.
Isso significa que $_SERVER[“PHP_SELF”] envia os dados do formulário enviado para a própria página, em vez de pular para outra página para buscá-los.
Ao fazer isso, você poderá exibir mensagens de erro na mesma página em que o formulário é exibido.
Como funciona a função htmlspecialchars()?
Um caractere especial pode ser convertido em uma entidade HTML usando a função htmlspecialchars().
Isso significa que caracteres HTML como < e > serão substituídos por < e > como resultado.
A vantagem disso é que os hackers não conseguem explorar o código injetando código HTML ou Javascript nele (ataques de script entre sites).
Nota importante sobre segurança de formulário PHP
Os hackers podem usar a variável $_SERVER[“PHP_SELF”] para obter acesso ao seu servidor!
O PHP_SELF de um site pode ser explorado permitindo que um usuário insira uma barra ( / ) na frente da página, e o navegador executará alguns comandos Cross Site Scripting ( XSS ).
Os invasores podem tirar proveito do XSS injetando scripts do lado do cliente na página da Web de um usuário no momento em que a página da Web está sendo visualizada.
Vamos supor que temos o formulário em uma página chamada form.php :
<form method=”post” action=”<?php echo $_SERVER[“PHP_SELF”];?>”>
Um usuário inseriria o URL normal na barra de endereço, como “http://www.mrexample.com/form.php”, que se traduziria no seguinte:
<form method=”post” action=”form.php”>
Tem ido bem até agora.
Suponha que um usuário digite o seguinte URL na barra de endereço do navegador:
http://www.mrexample.com/form.php/%78%2A%3Cscript%3Ealert('PageHacked')%3C/script%3E
Isso resultará na tradução do seguinte código para o seguinte:
<form method=”post” action=”form.php/”><script>alert(‘PageHacked’)</script>
Um comando de alerta é adicionado à tag de script por esse código. Assim que a página carregar, o código JavaScript será executado pelo navegador (uma caixa de alerta será exibida ao usuário).
Neste exemplo, mostramos como a variável PHP_SELF pode ser explorada de forma simples e inofensiva.
Para evitar códigos maliciosos em um sistema, os usuários precisam sempre estar cientes de que os hackers podem redirecionar o arquivo de um usuário para um servidor diferente, alterar uma variável global ou enviar um formulário para outro endereço para roubar informações pessoais.
Como evitar exploits $_SERVER["PHP_SELF"]?
A função htmlspecialchars() pode ser usada para evitar exploits associados a $_SERVER[“PHP_SELF”] .
É assim que o código do formulário deve ficar:
<form method=”post” action=”<?php echo htmlspecialchars($_SERVER[“PHP_SELF”]);?>”>
Esta função converte caracteres especiais em entidades HTML usando a função htmlspecialchars() .
Agora, se o usuário tentar atacar a variável PHP_SELF, a saída que aparecerá será mais ou menos assim:
<form method=”post” action=”form.php/"><script>alert(‘PageHacked’)</script>”>
Valide os dados do formulário por meio do PHP
Começaremos passando todas as variáveis pela função htmlspecialchars() do PHP para convertê-las em caracteres especiais.
Usando a função htmlspecialchars(), vamos supor que o usuário tente inserir o seguinte em uma caixa de texto enquanto usa a função htmlspecialchars():
<script>location.href('http://www.hacked.com')</script> – Por ser salvo como código de escape HTML, o código não poderia ser executado, assim:
<script>location.href(‘http://www.hacked.com’)</script>
Este código agora é seguro para exibição em uma página da web ou dentro de uma mensagem de e-mail.
Além disso, assim que o usuário enviar o formulário, faremos mais duas coisas:
Use a função PHP trim() para remover caracteres desnecessários (espaços extras, tabulações, novas linhas) dos dados de entrada do usuário.
A função PHP stripslashes() pode ser usada para remover barras invertidas () dos dados de entrada do usuário.
A próxima etapa do processo será escrever uma função que cuidará de toda a verificação para nós (o que certamente é muito mais conveniente do que ter que passar pelo mesmo processo de escrever o mesmo procedimento repetidamente).
Input_validation() é como vamos chamar nossa função.
Isso nos permitirá verificar cada variável $_POST usando a função Input_validation(), e o script terá a seguinte aparência:
Gostaríamos de chamar sua atenção para o fato de que, logo no início do script, usamos $_SERVER["REQUEST_METHOD"] para determinar se o formulário foi enviado.
Quando o REQUEST_METHOD for POST , ele deverá ser validado.
Este formulário será exibido em branco se ainda não tiver sido enviado e nenhuma validação tiver ocorrido.
No exemplo acima, no entanto, todos os campos de entrada são opcionais, então o usuário pode inserir o que quiser. Mesmo que o usuário não insira nenhum dado no script, o script ainda funcionará bem.
<?php $firstname = $lastname = $age = $email = $designation = $skills = $linkedin = $yrofexp = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $firstname = input_validation($_POST["firstname"]); $lastname = input_validation($_POST["lastname"]); $age = input_validation($_POST["age"]); $email = input_validation($_POST["email"]); $skills = input_validation($_POST["skills"]); $designation = input_validation($_POST["designation"]); $linkedin = input_validation($_POST["linkedin"]); $yrofexp = input_validation($_POST["yrofexp"]); } function input_validation($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>
Mesclar os códigos HTML e PHP: