Validação de formulário PHP
Este e os próximos capítulos mostram como usar o PHP para validar dados de formulários.
Validação de formulário PHP
Pense em SEGURANÇA ao processar formulários PHP!
Estas páginas mostrarão como processar formulários PHP com segurança em mente. A validação adequada dos dados do formulário é importante para proteger seu formulário contra hackers e spammers!
O formulário HTML em que trabalharemos nestes capítulos contém vários campos de entrada: campos de texto obrigatórios e opcionais, botões de opção e um botão de envio:
As regras de validação para o formulário acima são as seguintes:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
Primeiro, veremos o código HTML simples para o formulário:
Campos de texto
Os campos de nome, email e site são elementos de entrada de texto e o campo de comentário é uma área de texto. O código HTML fica assim:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
Botões do rádio
Os campos de gênero são botões de opção e o código HTML se parece com isso:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
O elemento do formulário
O código HTML do formulário fica assim:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Quando o formulário é enviado, os dados do formulário são enviados com o método="post".
O que é a variável $_SERVER["PHP_SELF"]?
O $_SERVER["PHP_SELF"] é uma super variável global que retorna o nome do arquivo do script atualmente em execução.
Assim, o $_SERVER["PHP_SELF"] envia os dados do formulário enviado para a própria página, em vez de pular para uma página diferente. Dessa forma, o usuário receberá mensagens de erro na mesma página do formulário.
O que é a função htmlspecialchars()?
A função htmlspecialchars() converte caracteres especiais em entidades HTML. Isso significa que ele substituirá os caracteres HTML como < e > por < e >. Isso evita que invasores explorem o código injetando código HTML ou Javascript (ataques de script entre sites) em formulários.
Nota importante sobre segurança de formulários PHP
A variável $_SERVER["PHP_SELF"] pode ser usada por hackers!
Se PHP_SELF for usado em sua página, um usuário poderá inserir uma barra (/) e, em seguida, alguns comandos Cross Site Scripting (XSS) para executar.
Cross-site scripting (XSS) é um tipo de vulnerabilidade de segurança de computador normalmente encontrada em aplicativos da Web. O XSS permite que invasores injetem scripts do lado do cliente em páginas da Web visualizadas por outros usuários.
Suponha que temos o seguinte formulário em uma página chamada "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Agora, se um usuário inserir a URL normal na barra de endereço como "http://www.example.com/test_form.php", o código acima será traduzido para:
<form method="post" action="test_form.php">
Até agora tudo bem.
No entanto, considere que um usuário insira o seguinte URL na barra de endereço:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
Nesse caso, o código acima será traduzido para:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Esse código adiciona uma tag de script e um comando de alerta. E quando a página for carregada, o código JavaScript será executado (o usuário verá uma caixa de alerta). Este é apenas um exemplo simples e inofensivo de como a variável PHP_SELF pode ser explorada.
Esteja ciente de que qualquer código JavaScript pode ser adicionado dentro da tag <script>! Um hacker pode redirecionar o usuário para um arquivo em outro servidor, e esse arquivo pode conter código malicioso que pode alterar as variáveis globais ou enviar o formulário para outro endereço para salvar os dados do usuário, por exemplo.
Como evitar explorações de $_SERVER["PHP_SELF"]?
As explorações de $_SERVER["PHP_SELF"] podem ser evitadas usando a função htmlspecialchars().
O código do formulário deve ficar assim:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
A função htmlspecialchars() converte caracteres especiais em entidades HTML. Agora, se o usuário tentar explorar a variável PHP_SELF, isso resultará na seguinte saída:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
A tentativa de exploração falha e nenhum dano é causado!
Validar dados de formulário com PHP
A primeira coisa que faremos é passar todas as variáveis através da função htmlspecialchars() do PHP.
Quando usamos a função htmlspecialchars(); então, se um usuário tentar enviar o seguinte em um campo de texto:
<script>location.href('http://www.hacked.com')</script>
- isso não seria executado, porque seria salvo como código de escape HTML, assim:
<script>location.href('http://www.hacked.com')</script>
O código agora está seguro para ser exibido em uma página ou dentro de um e-mail.
Também faremos mais duas coisas quando o usuário enviar o formulário:
- Retire caracteres desnecessários (espaço extra, tabulação, nova linha) dos dados de entrada do usuário (com a função PHP trim())
- Remova as barras invertidas (\) dos dados de entrada do usuário (com a função PHP stripslashes())
O próximo passo é criar uma função que fará toda a verificação para nós (o que é muito mais conveniente do que escrever o mesmo código repetidamente).
Vamos nomear a função test_input().
Agora, podemos verificar cada variável $_POST com a função test_input(), e o script fica assim:
Exemplo
<?php
// define variables and set 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;
}
?>
Observe que no início do script, verificamos se o formulário foi enviado usando $_SERVER["REQUEST_METHOD"]. Se o REQUEST_METHOD for POST, o formulário foi enviado - e deve ser validado. Se não tiver sido enviado, ignore a validação e exiba um formulário em branco.
No entanto, no exemplo acima, todos os campos de entrada são opcionais. O script funciona bem mesmo que o usuário não insira nenhum dado.
A próxima etapa é tornar os campos de entrada obrigatórios e criar mensagens de erro, se necessário.