Introdução: por que a segurança de aplicações TypeScript é crítica
TypeScript é uma extensão do JavaScript que adiciona tipagem estática e recursos modernos. No entanto, a tipagem não garante segurança. Erros de validação, tratamento incorreto de entrada do usuário e vulnerabilidades em dependências podem levar a ataques graves. Neste artigo, abordaremos as 10 vulnerabilidades mais comuns em aplicações TypeScript, com exemplos de código e como evitá-las.
1. Cross-Site Scripting (XSS)
Ataques XSS ocorrem quando um invasor insere um script malicioso em uma página web. TypeScript não protege automaticamente contra isso.
Exemplo de código vulnerável
function renderUserInput(input: string): string { return `<div>${input}</div>`;}
// O invasor envia: <script>alert('XSS')</script>Solução
Use escape de caracteres HTML ou bibliotecas como DOMPurify:
import DOMPurify from 'dompurify';
function renderUserInputSafe(input: string): string { const sanitized = DOMPurify.sanitize(input); return `<div>${sanitized}</div>`;}2. Injeção de SQL
Se você usa TypeScript com bancos de dados, a concatenação não controlada de strings em consultas SQL pode causar vazamento de dados.
Exemplo de código vulnerável
async function getUser(id: string): Promise<User | null> { const query = `SELECT * FROM users WHERE id = '${id}'`; return await db.query(query);}Solução
Use consultas parametrizadas (prepared statements):
async function getUserSafe(id: string): Promise<User | null> { const query = 'SELECT * FROM users WHERE id = $1'; return await db.query(query, [id]);}3. Prototype Pollution
Esta vulnerabilidade é característica do JavaScript/TypeScript. O invasor pode modificar o protótipo de um objeto, afetando todos os objetos em tempo de execução.
Exemplo de código vulnerável
function merge(target: any, source: any) { for (const key in source) { if (source.hasOwnProperty(key)) { target[key] = source[key]; } }}
const user = { name: 'Alice' };merge(user, JSON.parse('{"__proto__": {"isAdmin": true}}'));// Agora todos os objetos têm isAdmin: trueSolução
Verifique chaves perigosas e use utilitários seguros:
function safeMerge(target: Record<string, any>, source: Record<string, any>) { for (const key in source) { if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue; target[key] = source[key]; }}4. Cross-Site Request Forgery (CSRF)
Ataques CSRF forçam o usuário a executar ações indesejadas em um site onde está autenticado.
Solução em TypeScript
// Geração de token CSRFimport crypto from 'crypto';
function generateCsrfToken(): string { return crypto.randomBytes(32).toString('hex');}
// Verificação no middlewarefunction csrfMiddleware(req: Request, res: Response, next: NextFunction) { const token = req.headers['x-csrf-token']; if (token !== req.session.csrfToken) { return res.status(403).json({ error: 'CSRF validation failed' }); } next();}5. Desserialização insegura
O uso de JSON.parse() ou eval() em dados não verificados pode levar à execução de código arbitrário.
Exemplo vulnerável
function processData(data: string) { const obj = eval('(' + data + ')'); // ...}Abordagem segura
function processDataSafe(data: string) { try { const obj = JSON.parse(data); // Validação adicional de tipo if (typeof obj !== 'object' || obj === null)