Segurança de aplicações TypeScript: top 10 vulnerabilidades e proteção

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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: true

Soluçã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)                

Blogs

Book Recommendations