Aula 23: Segurança no PHP: Protegendo Dados e Implementando Boas Práticas

Por: Nerd Toolkit Postado em: Outubro 21, 2024 Visto por: 683

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:
  1. Gerando o Token: No início da sessão, gere um token exclusivo para o usuário:

    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
  2. 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']; ?>">
  3. 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() e password_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.

Tags:
#segurança PHP  # SQL Injection PHP  # XSS PHP  # CSRF PHP  # proteção de dados PHP  # hash de senha PHP  # prepared statements PHP  # boas práticas de segurança 

Notícias Relacionadas

Aula 23: Segurança no PHP: Protegendo Dados e Implementando Boas Práticas
  Contato
  • support@nerdtoolkit.com.br
Mapa do Site
Mostrar mapa do site
  Sobre

Feito de programadores para programadores.

Este site utiliza cookies. Ao continuar a utilizar este site, você concorda com a nossa utilização de cookies e política de privacidade.
Leia mais Concordo