Autorização e autenticação em PHP: como proteger seu site
Segurança é um dos aspectos-chave de qualquer aplicação web. Em PHP, a autenticação (verificação da identidade do usuário) e a autorização (determinação de seus direitos de acesso) são implementadas usando ferramentas integradas: sessões, cookies, hash de senhas e trabalho com bancos de dados. Neste artigo, abordaremos o ciclo completo de criação de um sistema de login, registro e controle de acesso em PHP.
1. Conceitos básicos
- Autenticação — processo de verificar se o usuário é quem diz ser (geralmente por login e senha).
- Autorização — verificação se o usuário autenticado tem permissão para realizar uma determinada ação (por exemplo, acesso ao painel de administração).
- Sessão — armazenamento temporário de dados no servidor, vinculado a um visitante específico por meio de um identificador único (ID de sessão).
- Hash de senhas — transformação da senha em uma string irreversível para armazenamento seguro no banco de dados.
2. Registro de usuário
O primeiro passo é criar um formulário de registro e um manipulador. A senha nunca é armazenada em texto simples — usamos a função password_hash().
2.1. Formulário de registro (register.php)
<form method="post" action="register_handler.php"> <input type="text" name="username" placeholder="Usuário" required> <input type="email" name="email" placeholder="Email" required> <input type="password" name="password" placeholder="Senha" required> <button type="submit">Registrar</button></form>2.2. Manipulador de registro (register_handler.php)
<?php// Conexão ao BD (PDO)$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$username = $_POST['username'];$email = $_POST['email'];$password = password_hash($_POST['password'], PASSWORD_BCRYPT); // faz o hash
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");$stmt->execute([$username, $email, $password]);
header('Location: login.php');?>Use
PASSWORD_BCRYPT— ele gera automaticamente um salt e é considerado bastante seguro.
3. Autenticação (login no sistema)
Ao fazer login, comparamos a senha inserida com o hash do banco de dados usando password_verify() e criamos uma sessão.
3.1. Formulário de login (login.php)
<form method="post" action="login_handler.php"> <input type="text" name="username" placeholder="Usuário" required> <input type="password" name="password" placeholder="Senha" required> <button type="submit">Entrar</button></form>3.2. Manipulador de login (login_handler.php)
<?phpsession_start();$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$username = $_POST['username'];$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");$stmt->execute([$username]);$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) { // Autenticação bem-sucedida $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; $_SESSION['role'] = $user['role']; // para autorização header('Location: dashboard.php');} else { echo "Usuário ou senha inválidos";}?>4. Autorização (controle de acesso)
Após a autenticação, o usuário recebe uma função (por exemplo, 'user', 'admin', 'moderator'). A autorização verifica essa função antes de executar ações.
4.1. Verificação simples de função
<?phpsession_start();
// Verifica se o usuário está autenticado Também na biblioteca
Trabalhando com YAML em Rust: biblioteca serde_yaml
Envio de SMS em C++: API das bibliotecas libcurl e cpprestsdk
Trabalho com S3 e armazenamentos em nuvem em Java: AWS SDK e MinIO
node-cache: Cacheamento Simples e Eficiente em Node.js