Recebendo dados: GET e POST
A aula explica como receber dados no PHP via GET e POST, abordando as superglobais $_GET e $_POST, a criação de formulários HTML, as diferenças entre os métodos HTTP e noções básicas de segurança para evitar vulnerabilidades comuns.
Nesta aula, vamos aprender como receber dados enviados por formulários HTML ou por URLs no PHP. As superglobais $_GET e $_POST são os principais mecanismos para capturar essas informações, e entender suas diferenças é essencial para construir aplicações web interativas e seguras.
Além disso, abordaremos boas práticas de segurança inicial, como validação e sanitização, para evitar ataques como XSS e injeção de código. Vamos começar com os fundamentos dos formulários HTML e dos métodos HTTP.
$_GET e $_POST
No PHP, as superglobais $_GET e $_POST são arrays associativos que contêm os dados enviados pelo cliente. $_GET recebe dados da query string da URL (método GET), enquanto $_POST recebe dados do corpo da requisição (método POST).
$_GET é usado para requisições que não alteram o estado do servidor (como buscas) e os dados ficam visíveis na URL. $_POST é usado para enviar dados sensíveis ou grandes volumes, pois não aparecem na URL e não têm limite de tamanho tão restrito.
Formulários HTML
Formulários HTML são a forma mais comum de enviar dados para o servidor. O atributo action define o URL de destino, e method especifica o método HTTP (GET ou POST). Cada campo de entrada (input, select, etc.) deve ter um atributo name, que será a chave no array $_GET ou $_POST.
Exemplo de formulário que envia dados via POST:
No PHP, os dados são acessados assim:
Métodos
O método HTTP determina como os dados são enviados. GET anexa os dados à URL (query string), tem limite de tamanho (cerca de 2048 caracteres) e não é seguro para dados sensíveis. POST envia os dados no corpo da requisição, sem limite prático de tamanho, e é mais adequado para formulários que alteram dados (cadastro, login).
Outros métodos como PUT e DELETE são usados em APIs REST, mas não são suportados diretamente por formulários HTML. No PHP, você pode acessar dados de qualquer método usando $_REQUEST, mas é melhor usar $_GET e $_POST explicitamente.
Segurança inicial
Nunca confie em dados recebidos do usuário. Sempre valide e sanitize as entradas para evitar vulnerabilidades como Cross-Site Scripting (XSS) e SQL Injection. Use funções como htmlspecialchars() para exibir dados, filter_var() para validar emails, e prepared statements para consultas ao banco.
Exemplo de sanitização para exibição segura:
Além disso, evite expor caminhos de arquivos ou mensagens de erro detalhadas. Sempre valide se os campos esperados existem com isset() ou filter_has_var().
Boas práticas e observações finais
Sempre defina o atributo name nos campos do formulário; sem ele, o dado não é enviado. Use method="POST" para formulários que alteram dados. Para uploads de arquivos, o formulário deve ter enctype="multipart/form-data". Verifique o método da requisição antes de processar os dados para evitar acessos indevidos.
Referências
- PHP Manual: $_GET
- PHP Manual: $_POST
- MDN: Elemento form
- MDN: Métodos de requisição HTTP
- PHP Manual: htmlspecialchars
- PHP Manual: filter_input
- OWASP: Cross-Site Scripting (XSS)
Exercícios
- Crie um formulário HTML que envie o nome e a idade via GET para a mesma página. No PHP, exiba os dados recebidos de forma segura.
- Escreva um script PHP que receba um email via POST, valide-o e exiba uma mensagem de sucesso ou erro.
- Explique a diferença entre GET e POST em termos de segurança e visibilidade dos dados.
- Modifique o formulário do exercício 1 para usar POST e adicione validação no PHP para garantir que o nome não está vazio.
- Crie um formulário que permita ao usuário selecionar uma cor (vermelho, verde, azul) via GET e exiba o texto "Cor selecionada: X" na página. Use htmlspecialchars para segurança.
<?php
if (isset($_GET['nome']) && isset($_GET['idade'])) {
$nome = htmlspecialchars($_GET['nome'], ENT_QUOTES, 'UTF-8');
$idade = (int)$_GET['idade'];
echo "Nome: $nome, Idade: $idade";
}
?>
<form method="GET" action="">
Nome: <input type="text" name="nome"><br>
Idade: <input type="number" name="idade"><br>
<button type="submit">Enviar</button>
</form><?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = $_POST['email'] ?? '';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Email válido: " . htmlspecialchars($email);
} else {
echo "Email inválido.";
}
}
?>
<form method="POST" action="">
Email: <input type="email" name="email"><br>
<button type="submit">Enviar</button>
</form><?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nome = trim($_POST['nome'] ?? '');
$idade = (int)($_POST['idade'] ?? 0);
if (empty($nome)) {
echo "Nome é obrigatório.";
} else {
echo "Nome: " . htmlspecialchars($nome) . ", Idade: $idade";
}
}
?>
<form method="POST" action="">
Nome: <input type="text" name="nome"><br>
Idade: <input type="number" name="idade"><br>
<button type="submit">Enviar</button>
</form><?php
if (isset($_GET['cor'])) {
$cor = htmlspecialchars($_GET['cor'], ENT_QUOTES, 'UTF-8');
echo "Cor selecionada: $cor";
}
?>
<form method="GET" action="">
<select name="cor">
<option value="vermelho">Vermelho</option>
<option value="verde">Verde</option>
<option value="azul">Azul</option>
</select>
<button type="submit">Enviar</button>
</form>