Neste capítulo apresentaremos como usar PHP para verificar os dados do formulário enviados pelo cliente.
Precisamos considerar a segurança ao lidar com formulários PHP. Neste capítulo demonstraremos o processamento seguro dos dados do formulário PHP. Para evitar hackers e spam, precisamos realizar a verificação de segurança dos dados no formulário. |
O formulário HTML descrito neste capítulo contém os seguintes campos de entrada: Campos de texto obrigatórios e opcionais, botões de opção e botões de envio:
As regras de validação do formulário acima são as seguintes:
Campo | Regras de validação |
---|---|
nome | deve. +pode conter apenas letras e espaços |
deve. + deve ser um endereço de e-mail válido (contém '@' e '.') | |
URL | Opcional. Se presente, deve conter um URL válido |
Observação | Opcional. Campos de entrada multilinha (campos de texto) |
gênero | deve. Deve escolher um |
Primeiro, vamos dar uma olhada no código do formulário HTML puro:
Os campos "Nome", "E-mail" e "Site" são elementos de entrada de texto e o campo "Observações" é uma área de texto. O código HTML fica assim:
"Nome": <input type="text" name="name">E-mail: <input type="text" name="email">Site: <input type="text" name="website">Observações : <textarea name="comment" rows="5" cols="40"></textarea>
O campo "Gênero" é um botão de opção e o código HTML tem a seguinte aparência:
Gênero:<input type="radio" name="gender" value="female">Feminino<input type="radio" name="gender" value="male">Masculino
O código do formulário HTML é assim:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
O formulário usa o método method="post" para enviar dados.
O que é a variável $_SERVER["PHP_SELF"] $_SERVER["PHP_SELF"] é uma variável superglobal que retorna o nome do arquivo do script atualmente em execução e está relacionada à raiz do documento. |
Portanto, $_SERVER["PHP_SELF"] enviará os dados do formulário para a página atual em vez de pular para uma página diferente.
Qual é o método htmlspecialchars()? A função htmlspecialchars() converte alguns caracteres predefinidos em entidades HTML. Os caracteres predefinidos são: & (e comercial) torna-se & "(aspas duplas) torna-se " '(aspas simples) torna-se ' < (menos que) torna-se < > (maior que) tornar-se> |
A variável $_SERVER["PHP_SELF"] pode ser usada por hackers!
Quando os hackers usam links HTTP de script entre sites para atacar, a variável de servidor $_SERVER["PHP_SELF"] também será incorporada ao script. O motivo é que o script entre sites é anexado ao caminho do arquivo executável, portanto, a string $_SERVER["PHP_SELF"] conterá o código do programa JavaScript por trás do link HTTP.
XSS também é chamado de CSS (Cross-Site Script), um ataque de script entre sites. Atacantes maliciosos inserem código HTML malicioso em uma página da Web. Quando um usuário navega na página, o código HTML incorporado na página da Web será executado, atingindo assim o propósito especial do usuário mal-intencionado. |
Especifique o seguinte nome de arquivo de formulário "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Agora, usamos a URL para especificar o endereço de envio “test_form.php”, e o código acima é modificado da seguinte forma:
<form método="post" action="test_form.php">
Isso seria bom.
Porém, considere que o usuário irá inserir o seguinte endereço na barra de endereços do navegador:
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
O URL acima será analisado no seguinte código e executado:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Uma tag de script foi adicionada ao código e um comando de alerta foi adicionado. Este código Javascript será executado quando a página carregar (o usuário verá uma caixa pop-up). Este é apenas um exemplo simples de como a variável PHP_SELF pode ser explorada por hackers.
Observe que qualquer código JavaScript pode ser adicionado à tag <script>! Os hackers podem usar isso para redirecionar a página para uma página em outro servidor. O arquivo de código da página pode proteger o código malicioso. O código pode modificar variáveis globais ou obter os dados do formulário do usuário.
$_SERVER["PHP_SELF"] pode ser evitado usando a função htmlspecialchars().
O código do formulário fica assim:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() converte alguns caracteres predefinidos em entidades HTML. Agora se o usuário quiser utilizar a variável PHP_SELF, o resultado será produzido da seguinte forma:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
A tentativa de explorar esta exploração falhou!
Primeiro, processamos todos os dados enviados pelos usuários através da função htmlspecialchars() do PHP.
Quando usamos a função htmlspecialchars(), o usuário tenta enviar o seguinte campo de texto:
<script>localização.href('http://www.codercto.com')</script>
Este código não será executado, pois será salvo como código de escape HTML como este:
<script>location.href('http://www.codercto.com')</script>
O código acima é seguro e pode ser exibido normalmente na página ou inserido em emails.
Quando o usuário enviar o formulário, faremos as duas coisas a seguir:
Use a função PHP trim() para remover caracteres desnecessários (como espaços, tabulações, novas linhas) nos dados de entrada do usuário.
Use a função PHP stripslashes() para remover barras invertidas () dos dados de entrada do usuário
A seguir, vamos escrever essas funções de filtragem em uma função que nós mesmos definimos, o que pode melhorar muito a capacidade de reutilização do código.
Nomeie a função test_input().
Agora, podemos usar a função test_input() para detectar todas as variáveis em $_POST. O código do script é o seguinte:
<?php//Defina variáveis e defina-as com valores vazios por padrão $name= $email= $gender= $comment= $website= ""; if($_SERVER["REQUEST_METHOD"]== "POST") { $nome= teste_input($_POST["nome"]); $email= teste_input($_POST["email"]); test_input($_POST["website"]); $comment= test_input($_POST["comment"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= trim ($dados); $dados= stripslashes($dados); $dados= htmlspecialchars($dados);
Observe que quando executarmos o script acima, usaremos $_SERVER["REQUEST_METHOD"] para detectar se o formulário foi enviado. Se REQUEST_METHOD for POST, o formulário será enviado - e os dados serão validados. Se o formulário não for enviado, a validação será ignorada e mostrada em branco.
O uso de itens de entrada nos exemplos acima é opcional e pode ser exibido normalmente mesmo que o usuário não insira nenhum dado.
No próximo capítulo apresentaremos como validar os dados inseridos pelo usuário.