Por que estudar Segurança Web?
Uma aplicação Web pode funcionar corretamente e ainda possuir vulnerabilidades. Segurança deve fazer parte do desenvolvimento desde o planejamento, passando pelo código, testes, implantação e manutenção.
Nesta aula vamos estudar vulnerabilidades comuns e, principalmente, aprender como pensar na prevenção.
Seu progresso
O modelo mental da Segurança Web
Antes de estudar cada vulnerabilidade, precisamos entender como pensar em segurança.
Segurança não significa apenas colocar uma senha na aplicação. Uma aplicação segura precisa proteger dados, identidade, funcionalidades, sessões, arquivos, APIs e comunicação.
Uma forma simples de analisar qualquer funcionalidade é perguntar:
SQL Injection
Quando dados fornecidos pelo usuário interferem indevidamente na consulta SQL.
Definição
SQL Injection ocorre quando uma aplicação monta consultas SQL utilizando dados externos de forma insegura.
O problema não está no SQL em si. O problema acontece quando dados e comandos SQL são tratados como se fossem a mesma coisa.
Exemplo conceitual vulnerável
const sql =
"SELECT * FROM usuarios WHERE nome = '"
+ nomeUsuario
+ "'";
const sql =
"SELECT * FROM usuarios WHERE nome = ?";
db.query(sql, [nomeUsuario]);
🧪 Laboratório — Separando código e dados
Nesta simulação não executaremos SQL real. Vamos observar a diferença entre concatenar dados em uma consulta e utilizar parâmetros.
Cross-Site Scripting — XSS
Quando conteúdo controlado pelo usuário é interpretado como HTML ou script no navegador.
Definição
XSS ocorre quando uma aplicação permite que conteúdo não confiável seja interpretado pelo navegador como código ou marcação ativa.
Uma das medidas mais importantes é diferenciar texto de HTML.
resultado.innerHTML =
entradaUsuario;
resultado.textContent =
entradaUsuario;
🧪 Laboratório — Texto versus HTML
O texto abaixo representa uma entrada fornecida por um usuário. Observe como o navegador deve tratá-la como texto.
<strong>Texto fornecido pelo usuário</strong>
Cross-Site Request Forgery — CSRF
Quando uma aplicação aceita uma ação sem verificar adequadamente se a requisição foi realmente autorizada pelo usuário.
Definição
Em determinadas arquiteturas, um navegador autenticado pode enviar automaticamente credenciais associadas a uma sessão.
O CSRF procura explorar justamente a ausência de uma confirmação adicional de intenção para determinadas operações.
Defesa tradicional
Uma técnica comum é utilizar um token CSRF imprevisível e verificar esse token no servidor.
<form method="post">
<input
type="hidden"
name="csrf_token"
value="TOKEN-GERADO-PELO-SERVIDOR"
>
<button type="submit">
Confirmar operação
</button>
</form>
🧪 Laboratório — Validação de token
Vamos simular a validação de um token sem enviar nenhuma requisição para um servidor.
Ataques de Força Bruta
Tentativas repetidas de autenticação para descobrir credenciais.
Uma aplicação que permite tentativas ilimitadas de login pode facilitar ataques automatizados.
A defesa não consiste apenas em aumentar a complexidade da senha. É necessário controlar também o comportamento das tentativas.
🧪 Laboratório — Bloqueio após tentativas
A simulação representa um sistema que bloqueia temporariamente o acesso após várias falhas.
if (tentativasFalhas >= limite) {
bloquearTemporariamente();
}
Sequestro de Sessão
Comprometimento de um identificador de sessão utilizado para representar um usuário autenticado.
Aplicações Web frequentemente utilizam um identificador associado à sessão do usuário. Se esse identificador for exposto ou tratado de maneira insegura, a conta pode ficar em risco.
Proteções importantes
- HTTPS.
- Cookies com Secure.
- Cookies com HttpOnly.
- SameSite quando apropriado.
- Regeneração do identificador após autenticação.
- Expiração adequada da sessão.
- Logout correto.
Set-Cookie:
sessao=valor-aleatorio;
Secure;
HttpOnly;
SameSite=Lax;
🧪 Laboratório — Ciclo de uma sessão
Falhas de Autenticação
Problemas no processo de identificação e validação do usuário.
Autenticação responde à pergunta: “Quem é você?”
Falhas podem ocorrer quando a aplicação utiliza senhas fracas, mensagens de erro reveladoras, recuperação insegura de senha, sessões mal implementadas ou ausência de mecanismos adicionais de proteção.
“O usuário existe,
mas a senha está errada.”
“Usuário ou senha
inválidos.”
🧪 Laboratório — Mensagem de autenticação
Controle de Acesso
Garantir que cada usuário possa executar somente as ações permitidas para sua função.
Autenticação e autorização são conceitos diferentes.
Autenticação: quem é o usuário?
Autorização: o usuário pode fazer isso?
if (!usuario.temPermissao("excluir")) {
negarAcesso();
return;
}
excluirRegistro();
🧪 Laboratório — Perfil e permissão
Upload de Arquivos
Como receber arquivos de usuários com segurança.
Upload de arquivos é uma funcionalidade que exige atenção porque o arquivo recebido passa a fazer parte da infraestrutura da aplicação.
Validações importantes
- Extensão permitida.
- Tipo MIME esperado.
- Tamanho máximo.
- Nome gerado pelo servidor.
- Local de armazenamento adequado.
- Permissões corretas.
- Verificação adicional quando necessária.
if (arquivo.nome.endsWith(".jpg")) {
aceitarArquivo();
}
validarTamanho(arquivo);
validarTipo(arquivo);
validarConteudo(arquivo);
gerarNomeSeguro(arquivo);
armazenarForaDaÁreaExecutável();
🧪 Laboratório — Validação de arquivo
Clickjacking
Técnica que procura induzir o usuário a clicar em uma interface diferente daquela que acredita estar utilizando.
Uma defesa importante é impedir que páginas sensíveis sejam incorporadas em frames de origens não autorizadas.
Exemplo de cabeçalho
Content-Security-Policy:
frame-ancestors 'self';
X-Frame-Options: SAMEORIGIN
🧪 Laboratório — Política de enquadramento
Segurança de APIs
Proteção de endpoints, dados, autenticação e autorização.
Uma API expõe funcionalidades da aplicação para outros sistemas, aplicativos ou interfaces. Cada endpoint precisa considerar autenticação, autorização, validação e tratamento de erros.
GET /api/produtos
1. Autenticar usuário
2. Autorizar operação
3. Validar parâmetros
4. Executar operação
5. Retornar somente os dados necessários
6. Registrar evento relevante
🧪 Laboratório — Pipeline de segurança da API
Rate Limiting
Controle da quantidade de requisições que podem ser realizadas em determinado intervalo.
Rate limiting ajuda a controlar abuso, excesso de requisições, automações indesejadas e determinados tipos de ataques.
O limite deve ser definido de acordo com a funcionalidade. Um endpoint de login pode possuir uma política diferente de um endpoint de consulta pública.
if (requisicoesNoPeriodo >= limite) {
retornarErro429();
} else {
processarRequisicao();
}
🧪 Laboratório — Simulação de Rate Limit
Criptografia e Hash de Senhas
Como proteger credenciais e diferenciar criptografia de hashing.
Criptografia
Criptografia normalmente permite que um dado seja transformado e posteriormente recuperado utilizando uma chave apropriada.
Hash
Hash é uma transformação de mão única. Em sistemas de autenticação, senhas não devem ser armazenadas em texto puro.
Para senhas, aplicações modernas devem utilizar algoritmos específicos para armazenamento de senhas, como Argon2id, bcrypt ou scrypt, com parâmetros adequados.
$senha = $_POST['senha'];
INSERT INTO usuarios
(senha)
VALUES
('$senha');
$hash = password_hash(
$senha,
PASSWORD_DEFAULT
);
password_verify(
$senha,
$hash
);
🧪 Laboratório — Hash de demonstração
Checklist de Segurança
Revise os principais pontos estudados.
Auditoria de Segurança
Imagine que você recebeu um pequeno sistema Web para avaliar. Analise cada item e identifique qual mecanismo de segurança deveria ser utilizado.
- Controle de tentativas
- Senha com hash adequado
- MFA quando apropriado
- Prepared statements
- Privilégio mínimo
- Validação de entrada
- Limite de tamanho
- Validação de tipo
- Armazenamento seguro
- Autenticação
- Autorização
- Rate limiting
Security Review
Realize uma análise de segurança de uma aplicação Web didática. O objetivo é identificar riscos, explicar o impacto e propor medidas de proteção.
Resumo da Aula
Aula concluída!
Você estudou os principais conceitos de segurança Web abordados nesta aula e realizou simulações práticas.
Continue praticando a identificação de riscos e, principalmente, a implementação das correções.