Superglobais
Esta aula aborda as superglobais $_SERVER, $_REQUEST, $_FILES, $_ENV e a função getenv em PHP, explicando seus usos, diferenças e cuidados de segurança. Inclui exemplos práticos e exercícios com respostas detalhadas.
As superglobais são variáveis internas do PHP que estão disponíveis em todos os escopos do script. Elas fornecem informações sobre o ambiente do servidor, dados de requisições HTTP, arquivos enviados e variáveis de ambiente. Nesta aula, vamos explorar as superglobais $_SERVER, $_REQUEST, $_FILES e $_ENV, além da função getenv, com foco em seus usos práticos e cuidados necessários para evitar vulnerabilidades.
Entender essas variáveis é essencial para desenvolver aplicações web seguras e eficientes, pois elas permitem acessar dados do cliente e do servidor de forma padronizada. Veremos exemplos de código e boas práticas para manipular esses dados corretamente.
$_SERVER, $_REQUEST, $_FILES
$_SERVER contém informações do ambiente do servidor e da requisição atual. É um array associativo com chaves como 'HTTP_HOST', 'REQUEST_URI', 'REQUEST_METHOD', 'REMOTE_ADDR', entre outras. Por exemplo, $_SERVER['HTTP_USER_AGENT'] retorna o user-agent do navegador do cliente. É muito útil para depuração e para adaptar o comportamento da aplicação com base no servidor.
$_REQUEST combina os dados de $_GET, $_POST e $_COOKIES (dependendo da configuração request_order no php.ini). Ela é conveniente, mas menos segura, pois não permite saber a origem dos dados. Recomenda-se usar $_GET ou $_POST explicitamente sempre que possível para evitar confusão e possíveis ataques.
$_FILES é usada para upload de arquivos. Contém informações como nome, tipo, tamanho, nome temporário e código de erro do arquivo enviado via formulário com enctype="multipart/form-data". Exemplo: $_FILES['arquivo']['name'] retorna o nome original do arquivo. É crucial validar e sanitizar esses dados para evitar riscos de segurança.
// Exemplo de uso de $_SERVER e $_REQUEST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nome = $_REQUEST['nome'] ?? '';
echo "Olá, " . htmlspecialchars($nome, ENT_QUOTES, 'UTF-8');
}
// Exemplo de upload com $_FILES
if (isset($_FILES['arquivo'])) {
$erro = $_FILES['arquivo']['error'];
if ($erro === UPLOAD_ERR_OK) {
$tmp = $_FILES['arquivo']['tmp_name'];
$destino = 'uploads/' . basename($_FILES['arquivo']['name']);
move_uploaded_file($tmp, $destino);
echo "Arquivo salvo em: $destino";
} else {
echo "Erro no upload: código $erro";
}
}
$_ENV e getenv
$_ENV é uma superglobal que contém variáveis de ambiente do sistema operacional. Seu conteúdo depende do ambiente onde o PHP está sendo executado. Por exemplo, $_ENV['PATH'] pode conter o caminho do sistema. No entanto, essa superglobal nem sempre está populada, dependendo da configuração variables_order no php.ini. Para maior confiabilidade, use a função getenv().
getenv() retorna o valor de uma variável de ambiente específica, ou todas se chamada sem argumentos. Exemplo: getenv('DB_HOST') para obter o host do banco de dados configurado no ambiente. Essa abordagem é preferível a $_ENV porque funciona independentemente da configuração do php.ini e é mais explícita.
// Obtendo variável de ambiente com $_ENV
$path = $_ENV['PATH'] ?? 'não definido';
echo "PATH: $path";
// Usando getenv
$dbHost = getenv('DB_HOST');
if ($dbHost === false) {
echo "Variável DB_HOST não definida";
} else {
echo "DB_HOST: $dbHost";
}
Cuidados
Ao trabalhar com superglobais, a segurança é primordial. Dados vindos do cliente (como $_GET, $_POST, $_COOKIE, $_FILES) nunca devem ser confiados sem validação e sanitização. Sempre use funções como htmlspecialchars() para saída em HTML, filter_input() para validação, e evite incluir diretamente esses dados em consultas SQL ou comandos do sistema.
Com $_SERVER, tome cuidado com cabeçalhos HTTP que podem ser falsificados (ex.: HTTP_HOST, HTTP_X_FORWARDED_FOR). Prefira usar variáveis de servidor confiáveis como REMOTE_ADDR para obter o IP real do cliente, considerando proxies reversos. Além disso, não exiba $_SERVER em logs ou telas sem filtrar informações sensíveis.
Para $_FILES, nunca confie no tipo MIME informado pelo cliente (['type']). Valide o arquivo usando funções como finfo ou verificando a extensão real. Armazene arquivos fora da raiz do documento ou com nomes aleatórios para evitar execução de scripts maliciosos.
Exemplos
Vamos ver um exemplo completo que combina várias superglobais para processar um formulário de contato com upload de arquivo. O script verifica o método da requisição, captura os dados do formulário e faz o upload seguro.
// processa_contato.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if (!$nome || !$email) {
die('Dados inválidos.');
}
if (isset($_FILES['anexo']) && $_FILES['anexo']['error'] === UPLOAD_ERR_OK) {
$extensoesPermitidas = ['pdf', 'doc', 'docx'];
$extensao = strtolower(pathinfo($_FILES['anexo']['name'], PATHINFO_EXTENSION));
if (!in_array($extensao, $extensoesPermitidas)) {
die('Tipo de arquivo não permitido.');
}
$destino = 'uploads/' . uniqid() . '.' . $extensao;
move_uploaded_file($_FILES['anexo']['tmp_name'], $destino);
echo "Arquivo salvo: $destino";
}
echo "Contato de $nome ($email) recebido.";
}
Boas Práticas
Prefira usar funções de filtro (filter_input, filter_var) em vez de acessar superglobais diretamente. Isso torna o código mais seguro e explícito. Além disso, configure o php.ini para limitar o tamanho máximo de upload e o tempo de execução. Sempre trate os erros de upload verificando o código de erro em $_FILES['arquivo']['error'].
Referências
- PHP: $_SERVER - Manual
- PHP: $_REQUEST - Manual
- PHP: $_FILES - Manual
- PHP: $_ENV - Manual
- PHP: getenv - Manual
- PHP: Upload de arquivos - Manual
Exercícios
Crie um script que exiba o endereço IP do cliente usando $_SERVER.
✓ Resposta:echo "IP: " . $_SERVER['REMOTE_ADDR'];Usando $_REQUEST, escreva um código que receba um campo 'nome' via GET ou POST e o exiba sanitizado.
✓ Resposta:$nome = htmlspecialchars($_REQUEST['nome'] ?? '', ENT_QUOTES, 'UTF-8'); echo "Olá, $nome";Implemente um upload seguro de imagem (extensões jpg, png, gif) usando $_FILES, validando tipo e tamanho máximo de 2MB.
✓ Resposta:if ($_FILES['imagem']['error'] === UPLOAD_ERR_OK) { $extensoes = ['jpg', 'jpeg', 'png', 'gif']; $ext = strtolower(pathinfo($_FILES['imagem']['name'], PATHINFO_EXTENSION)); if (!in_array($ext, $extensoes)) { die('Extensão não permitida.'); } if ($_FILES['imagem']['size'] > 2 * 1024 * 1024) { die('Arquivo muito grande.'); } $destino = 'uploads/' . uniqid() . '.' . $ext; move_uploaded_file($_FILES['imagem']['tmp_name'], $destino); echo "Imagem salva em: $destino"; }Use getenv() para ler a variável de ambiente 'APP_ENV' e exibir uma mensagem diferente se for 'production' ou 'development'.
✓ Resposta:$env = getenv('APP_ENV'); if ($env === 'production') { echo "Ambiente de produção"; } elseif ($env === 'development') { echo "Ambiente de desenvolvimento"; } else { echo "Ambiente não reconhecido"; }Escreva um script que liste todas as variáveis de ambiente usando getenv() sem argumentos.
✓ Resposta:$envs = getenv(); foreach ($envs as $key => $value) { echo "$key: $value\n"; }