Conexão Segura ao MySQL em PHP Usando PDO e Prepared Statements
Garantir a segurança no acesso ao banco de dados é um requisito fundamental para prevenir ataques do tipo SQL Injection em aplicações web. O uso da extensão PDO (PHP Data Objects) associada a Prepared Statements (declarações preparadas) isola as instruções SQL dos dados enviados pelos usuários, garantindo consultas eficientes e protegidas.
PHP
<?php
/**
* Estabelece conexão com o banco de dados via PDO e executa uma consulta segura.
*
* @param string $host Endereço do servidor do banco de dados.
* @param string $db Nome do banco de dados.
* @param string $user Usuário do banco de dados.
* @param string $pass Senha do banco de dados.
* @return PDO Instância de conexão PDO configurada.
*/
function getDatabaseConnection(string $host, string $db, string $user, string $pass): PDO
{
$dsn = "mysql:host={$host};dbname={$db};charset=utf8mb4";
// Configurações globais para segurança e tratamento de erros
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Lança exceções em caso de erros
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Retorna resultados como array associativo
PDO::ATTR_EMULATE_PREPARES => false, // Desativa emulação para usar prepared statements reais
];
return new PDO($dsn, $user, $pass, $options);
}
// --- Exemplo de Uso Prático ---
try {
// 1. Criar a conexão segura
$pdo = getDatabaseConnection('127.0.0.1', 'sistema_db', 'app_user', 'senha_segura_123');
// 2. Consulta com placeholders nomeados para prevenir SQL Injection
$sql = "SELECT id, nome, email FROM usuarios WHERE status = :status AND nivel = :nivel";
// 3. Preparar a instrução no servidor do banco de dados
$stmt = $pdo->prepare($sql);
// 4. Executar passando os parâmetros de entrada de forma isolada
$stmt->execute([
':status' => 'ativo',
':nivel' => 'admin'
]);
// 5. Obter os resultados formatados
$usuarios = $stmt->fetchAll();
echo "Usuários encontrados: " . count($usuarios) . PHP_EOL;
print_r($usuarios);
} catch (PDOException $e) {
// Em produção, nunca exiba $e->getMessage() diretamente ao usuário
error_log("Erro de conexão/consulta no banco: " . $e->getMessage());
echo "Ocorreu uma falha no processamento dos dados." . PHP_EOL;
}
- Parametrização Nativa (
ATTR_EMULATE_PREPARES => false): Força o driver do PDO a utilizar o recurso nativo do banco de dados para preparar as consultas, garantindo que o código SQL e os dados fornecidos pelo usuário sejam enviados em etapas totalmente separadas. - Codificação UTF-8 (
charset=utf8mb4): Definir a codificação diretamente na DSN (Data Source Name) previne inconsistências de caracteres e neutraliza vetores de ataques de injeção que se aproveitam de descompassos de encoding. - Tratamento de Exceções (
ERRMODE_EXCEPTION): Transforma qualquer falha de sintaxe SQL ou falha de conexão em uma exceção que pode ser capturada em blocostry-catch, evitando o vazamento de credenciais ou estrutura de tabelas em ambientes de produção. - Segurança de Execução: O envio de parâmetros via array no método
$stmt->execute()desinfeta automaticamente as entradas do usuário, dispensando o uso de rotinas manuais de limpeza comoaddslashesou sanitização regex.
