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

Exercícios

  1. 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.
  2. ✓ Resposta:
    <?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>
  3. Escreva um script PHP que receba um email via POST, valide-o e exiba uma mensagem de sucesso ou erro.
  4. ✓ Resposta:
    <?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>
  5. Explique a diferença entre GET e POST em termos de segurança e visibilidade dos dados.
  6. ✓ Resposta: GET envia dados na URL, ficando visíveis no histórico e logs, e tem limite de tamanho. POST envia dados no corpo da requisição, não ficando visíveis na URL, mas ainda podem ser interceptados se não usar HTTPS. Para dados sensíveis, sempre use POST com HTTPS.
  7. 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.
  8. ✓ Resposta:
    <?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>
  9. 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.
  10. ✓ Resposta:
    <?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>