Tutorial PHP

PHP INÍCIO Introdução ao PHP Instalação do PHP Sintaxe PHP Comentários PHP Variáveis ​​PHP PHP Eco/Impressão Tipos de dados PHP Strings PHP Números PHP Matemática PHP Constantes PHP Operadores PHP PHP If...Else...Elseif Chave PHP Loops PHP Funções PHP Matrizes PHP PHP Superglobais PHP RegEx

Formulários PHP

Manipulação de formulários PHP Validação de formulário PHP Formulário PHP obrigatório URL/e-mail do formulário PHP Formulário PHP completo

PHP Avançado

Data e hora do PHP Incluir PHP Manipulação de arquivos PHP Arquivo PHP Abrir/Ler Arquivo PHP Criar/Gravar Upload de arquivo PHP Cookies PHP Sessões PHP Filtros PHP Filtros PHP Avançados Funções de retorno de chamada do PHP PHP JSON Exceções do PHP

PHP OOP

PHP O que é POO Classes/objetos PHP Construtor PHP Destruidor PHP Modificadores de acesso PHP Herança PHP Constantes PHP Classes abstratas PHP Interfaces PHP Características PHP Métodos estáticos PHP Propriedades estáticas do PHP Namespaces PHP Iteráveis ​​PHP

Banco de dados MySQL

Banco de dados MySQL MySQL Connect MySQL Criar banco de dados MySQL Criar Tabela Dados de inserção do MySQL MySQL Obter Último ID MySQL Inserir Múltiplo Preparado para MySQL Dados de seleção do MySQL MySQL Onde MySQL Ordenar por Dados de exclusão do MySQL Dados de atualização do MySQL Dados de limite do MySQL

PHP XML

Analisadores XML PHP Analisador PHP SimpleXML PHP SimpleXML - Obter PHP XML Expatriado PHP XML DOM

PHP - AJAX

Introdução AJAX PHP AJAX Banco de dados AJAX XML AJAX Pesquisa em tempo real AJAX Enquete AJAX

Exemplos PHP

Exemplos PHP Compilador PHP Teste PHP Exercícios PHP Certificado PHP

Referência PHP

Visão geral do PHP Matriz PHP Calendário PHP Data do PHP Diretório PHP Erro PHP Exceção PHP Sistema de arquivos PHP Filtro PHP PHP FTP PHP JSON Palavras-chave PHP PHP Libxml Correio PHP Matemática PHP PHP Diversos PHP MySQLi Rede PHP Controle de saída PHP PHP RegEx PHP SimpleXML Fluxo PHP String PHP Manipulação de variáveis ​​PHP Analisador XML PHP PHP Zip Fusos horários PHP

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
E-mail 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/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

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:

  1. Retire caracteres desnecessários (espaço extra, tabulação, nova linha) dos dados de entrada do usuário (com a função PHP trim())
  2. 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.