Clique aqui e veja todas as aulas
1. O que é Segurança em PHP?
Segurança em PHP envolve práticas para proteger a aplicação contra ataques maliciosos. O PHP é uma linguagem amplamente usada e, por isso, é alvo comum de vulnerabilidades. Implementar segurança desde o início é essencial para proteger os dados e a integridade do sistema.
2. Proteção contra Injeção de SQL
Injeção de SQL (SQL Injection) é um dos ataques mais comuns, onde o invasor pode manipular consultas SQL para acessar ou modificar dados não autorizados.
Como prevenir:
Mesmo sem PDO, ao usar mysqli, devemos sempre usar prepared statements para evitar que os dados do usuário sejam injetados diretamente na consulta SQL.
Exemplo de consulta vulnerável (NUNCA usar dessa forma):
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";Forma segura usando mysqli:
$stmt = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();Aqui, a função bind_param() escapa automaticamente os dados, prevenindo a injeção de SQL.
3. Protegendo Senhas com Hashing
Senhas devem ser hashing antes de serem armazenadas no banco de dados. Nunca armazene senhas em texto puro.
Como fazer:
Use a função password_hash() para criar o hash seguro da senha:
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);Para verificar a senha no login, use password_verify():
if (password_verify($password, $hashedPassword)) {
// Login bem-sucedido
}Essa prática protege o sistema caso o banco de dados seja comprometido, já que o invasor não terá acesso às senhas em texto puro.
4. Prevenção de Cross-Site Scripting (XSS)
XSS ocorre quando um invasor consegue injetar scripts maliciosos (como JavaScript) em páginas web. Para evitar isso, todos os dados que forem exibidos na página devem ser escapados.
Como prevenir:
Sempre que for exibir dados fornecidos pelo usuário, utilize htmlspecialchars() para evitar que scripts sejam executados:
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');Isso transforma caracteres especiais, como < e >, em suas versões HTML seguras (< e >), evitando a execução de código.
5. Proteção contra Cross-Site Request Forgery (CSRF)
CSRF é um ataque em que uma ação não autorizada é realizada em nome de um usuário autenticado, sem seu consentimento. Para prevenir CSRF, é comum usar tokens CSRF, que garantem que a solicitação foi feita de forma legítima.
Como implementar:
Gerando o Token: No início da sessão, gere um token exclusivo para o usuário:
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));Incluindo o Token no Formulário: Em formulários sensíveis, inclua o token CSRF:
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">Validando o Token: No lado do servidor, valide o token recebido com o da sessão:
if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { // Continua o processamento do formulário } else { // Erro de CSRF }
6. Gerenciamento de Erros e Mensagens
Nunca exiba detalhes de erros diretamente para o usuário, pois isso pode fornecer informações úteis a invasores. Use logs para registrar erros e exiba mensagens genéricas para o usuário.
Exemplo:
try {
// Código que pode gerar erro
} catch (Exception $e) {
// Registra o erro em um arquivo de log
error_log($e->getMessage(), 3, 'errors.log');
// Exibe mensagem genérica ao usuário
echo "Algo deu errado. Por favor, tente novamente mais tarde.";
}7. Uso de Cabeçalhos de Segurança
Adicione cabeçalhos HTTP para aumentar a segurança da aplicação. Um exemplo comum é o cabeçalho Content-Security-Policy que restringe o carregamento de scripts externos:
header("Content-Security-Policy: default-src 'self'");Isso garante que apenas scripts carregados do mesmo domínio serão executados, reduzindo a exposição a ataques XSS.
8. Exercício Prático
Como exercício:
- Implemente prepared statements para todas as suas consultas SQL.
- Altere o armazenamento de senhas para usar
password_hash()epassword_verify(). - Adicione
htmlspecialchars()em todas as exibições de dados fornecidos pelo usuário.
9. Próximos Passos
Agora que você conhece as boas práticas de segurança em PHP, podemos avançar para a otimização do projeto, garantindo que ele seja não apenas seguro, mas também eficiente e escalável.
