23 de março de 2025

Segurança em Aplicações Web

A segurança em aplicações web é um tópico crítico para desenvolvedores, empresas e usuários finais. Com o aumento de ataques cibernéticos, proteger sua aplicação não é mais uma opção, mas uma necessidade. Neste post, vamos explorar boas práticas de segurança que você pode implementar para proteger sua aplicação web de vulnerabilidades comuns.


1. Proteja-se Contra Injeção de SQL

O que é?

A injeção de SQL ocorre quando um atacante insere comandos SQL maliciosos em campos de entrada, manipulando o banco de dados da aplicação.

Boa Prática:

Use consultas parametrizadas ou ORM (Object-Relational Mapping) para evitar a execução de comandos SQL não sanitizados.

Exemplo:

 
# Ruim (vulnerável a SQL injection)
query = "SELECT * FROM users WHERE username = '" + username + "';"

# Bom (usando consultas parametrizadas)
query = "SELECT * FROM users WHERE username = %s;"
cursor.execute(query, (username,))

2. Valide e Sanitize Entradas de Usuário

O que é?

Entradas de usuário não validadas podem levar a vulnerabilidades como XSS (Cross-Site Scripting) e injeção de código.

Boa Prática:

Sempre valide e sanitize dados de entrada no lado do servidor. Use bibliotecas de validação e escape de caracteres especiais.

Exemplo:

// Validando um e-mail
function validateEmail(email) {
    const regex = /^[^s@]+@[^s@]+.[^s@]+$/;
    return regex.test(email);
}

// Sanitizando HTML para evitar XSS
const sanitizeHTML = (str) => {
    return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
};

3. Proteja-se Contra Cross-Site Scripting (XSS)

O que é?

XSS ocorre quando um atacante injeta scripts maliciosos em páginas web, que são executados no navegador de outros usuários.

Boa Prática:

Use Content Security Policy (CSP) e escape dados renderizados no frontend.

Exemplo:

<!-- Configurando CSP no cabeçalho HTTP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://apis.google.com;">

4. Use HTTPS para Proteger Dados em Trânsito

O que é?

HTTP não criptografado permite que atacantes interceptem dados sensíveis, como senhas e informações de cartão de crédito.

Boa Prática:

Configure seu servidor para usar HTTPS, que criptografa a comunicação entre o cliente e o servidor.

Como Implementar:

  • Obtenha um certificado SSL/TLS (gratuito com Let's Encrypt).

  • Configure redirecionamento de HTTP para HTTPS.

Exemplo (Nginx):

server {
    listen 80;
    server_name exemplo.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name exemplo.com;
    ssl_certificate /caminho/para/certificado.crt;
    ssl_certificate_key /caminho/para/chave-privada.key;
}

5. Implemente Autenticação Segura

O que é?

Autenticação vulnerável pode permitir que atacantes acessem contas de usuários.

Boas Práticas:

  • Use hash com salt para senhas (ex: bcrypt, Argon2).

  • Implemente autenticação de dois fatores (2FA).

  • Limite tentativas de login para prevenir ataques de força bruta.

Exemplo (Usando bcrypt em Node.js):

const bcrypt = require('bcrypt');
const saltRounds = 10;

// Hash da senha
bcrypt.hash('senha123', saltRounds, (err, hash) => {
    // Armazene o hash no banco de dados
});

// Verificação da senha
bcrypt.compare('senha123', hash, (err, result) => {
    if (result) {
        // Senha correta
    } else {
        // Senha incorreta
    }
});

6. Proteja-se Contra Cross-Site Request Forgery (CSRF)

O que é?

CSRF ocorre quando um atacante envia solicitações maliciosas em nome de um usuário autenticado.

Boa Prática:

Use tokens CSRF para garantir que as solicitações venham de fontes confiáveis.

Exemplo (Em um formulário HTML):

<form action="/update-profile" method="POST">
    <input type="hidden" name="_csrf" value="<%= csrfToken %>">
    <input type="text" name="username">
    <button type="submit">Atualizar</button>
</form>

7. Mantenha Dependências Atualizadas

O que é?

Bibliotecas e frameworks desatualizados podem conter vulnerabilidades conhecidas.

Boa Prática:

Use ferramentas como npm audit ou Dependabot para identificar e corrigir vulnerabilidades em dependências.

Exemplo (Usando npm audit):

npm audit
npm audit fix

8. Proteja Dados Sensíveis

O que é?

Dados como senhas, tokens e informações de cartão de crédito devem ser protegidos.

Boas Práticas:

  • Nunca armazene senhas em texto.

  • Use criptografia para dados sensíveis.

  • Restrinja o acesso a logs e backups.

Exemplo (Criptografando dados com Node.js):

const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
    let cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
    let encrypted = cipher.update(text);
    encrypted = Buffer.concat([encrypted, cipher.final()]);
    return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') };
}

9. Monitore e Registre Atividades Suspeitas

O que é?

Monitoramento ajuda a detectar e responder a ataques em tempo real.

Boa Prática:

Use ferramentas de monitoramento e logging para rastrear atividades suspeitas, como múltiplas tentativas de login falhas.

Exemplo (Usando Winston para logging em Node.js):

const winston = require('winston');

const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }),
        new winston.transports.File({ filename: 'combined.log' }),
    ],
});

logger.error('Tentativa de login falha para o usuário admin');

Conclusão

A segurança em aplicações web é um processo contínuo que requer atenção constante. Ao seguir essas boas práticas, você pode proteger sua aplicação contra vulnerabilidades comuns e garantir a segurança dos dados dos usuários.

Se você gostou deste post, compartilhe com seus amigos. E não se esqueça de explorar outros tutoriais aqui no blog para continuar aprendendo!

E aí, pronto para tornar sua aplicação mais segura?

Visualizações: 42



Diversos

28 de março de 2025

Regex

Entendendo Expressões Regulares com Exemplos Práticos

21 de março de 2025

Domain-Driven Design

Atacando as Complexidades no Coração do Software

18 de março de 2025

Conceitos Básicos da Internet

Tudo o que Você Precisa Saber para Entender como a Internet Funciona

14 de março de 2025

Como Escrever Código Limpo e Fácil de Manter

Dicas Essenciais para Desenvolvedores.

03 de março de 2025

Introdução ao Docker

Simplificando Ambientes de Desenvolvimento com Docker.

27 de fevereiro de 2025

Introdução ao Git e GitHub para Iniciantes

Comece a versionar seu código hoje!

05 de abril de 2016

Inserir botão Doar do Pagseguro em seu Wordpress

Aprenda a inserir o botão Doar do Pagseguro em seu hospedado no Wordpress.com

Sérgio Toledo | Engenheiro de Software | LinkedIn | GitHub | YouTube

Todos os direitos reservados ©