Segurança em JavaScript: Como proteger seu site contra injeções SQL e XSS

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

Segurança em JavaScript: Proteção contra injeções SQL e XSS — Guia completo para o desenvolvedor

\n\n

Você já se perguntou por que os hackers gostam tanto de aplicações web? A resposta é simples: os desenvolvedores frequentemente deixam as "portas" abertas. As duas brechas mais populares são as injeções SQL e o XSS (Cross-Site Scripting). Mesmo que você escreva em JavaScript, isso não significa que está protegido contra ataques no lado do servidor. Neste artigo, vamos analisar como reconhecer vulnerabilidades e, principalmente, como corrigi-las, usando práticas modernas de segurança.

\n\n

Por que um desenvolvedor JavaScript deve pensar em segurança?

\n

Muitos iniciantes pensam: "Eu programo no frontend, não mexo com bancos de dados — não corro risco". Isso é um equívoco perigoso. O JavaScript hoje funciona em todos os lugares: no cliente (navegador), no servidor (Node.js) e até em bancos de dados (MongoDB). E, portanto, a responsabilidade pela segurança recai sobre você. Injeções SQL e XSS não são apenas termos chatos de livros didáticos, são ameaças reais que podem destruir seu projeto, roubando dados de usuários ou transformando seu site em um criadouro de vírus.

\n\n

Injeções SQL: A ameaça invisível ao seu banco de dados

\n

Injeção SQL é um ataque no qual um invasor "injeta" código SQL malicioso através de campos de entrada (formulários, URLs, cabeçalhos). Se você usa Node.js com PostgreSQL, MySQL ou qualquer outro banco de dados relacional, você está em risco.

\n\n

Como é uma injeção SQL em JavaScript?

\n

Imagine que você tem um formulário de login e escreve a consulta assim:

\n
// ❌ PERIGOSO: vulnerável a injeção SQL\nconst username = req.body.username;\nconst password = req.body.password;\nconst query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
\n

Agora imagine que um invasor insere no campo username: admin' --. A consulta se torna:

\n
SELECT * FROM users WHERE username = 'admin' --' AND password = '';
\n

-- é um comentário em SQL. Tudo depois disso é ignorado. O hacker fez login como admin sem senha. E se ele inserir '; DROP TABLE users; --? Você perderia toda a tabela de usuários.

\n\n

Proteção: consultas parametrizadas (prepared statements)

\n

A melhor forma de proteção contra injeções SQL é nunca inserir dados do usuário diretamente na string da consulta. Use consultas parametrizadas. Veja como fazer isso em Node.js com a biblioteca pg (PostgreSQL):

\n\n
// ✅ SEGURO: consulta parametrizada\nconst { Pool } = require('pg');\nconst pool = new Pool();\n\napp.post('/login', async (req, res) => {\n  const { username, password } = req.body;\n  \n  // Os sinais $1 e $2 são placeholders\n  const query = 'SELECT * FROM users WHERE username = $1 AND password = $2';\n  const values = [username, password];\n  \n  try {\n    const result = await pool.query(query, values);\n    // processamento do resultado...\n  } catch (error) {\n    console.error('Erro na consulta:', error);\n  }\n});
\n

A biblioteca faz o escape dos valores automaticamente. Mesmo que o invasor envie admin' --, isso será tratado como uma string comum, e não como um comando SQL.

\n\n

Medidas adicionais de proteção

\n
    \n
  • Validação no servidor: verifique o tipo e o comprimento dos dados de entrada. Se for esperado um email, certifique-se de que é realmente um email.
  • \n
  • Princípio do menor privilégio: não use o usuário root do banco de dados na aplicação. Crie um usuário separado com permissões apenas nas tabelas necessárias.
  • \n
  • Bibliotecas ORM: use Prisma, Sequelize ou TypeORM. Elas automatizam a parametrização, mas não se esqueça de que também é possível escrever código inseguro com elas (por exemplo, usando sequelize.query com concatenação).
  • \n
\n\n

XSS (Cross-Site Scripting): Quando seu site ataca a si mesmo

\n

XSS é um ataque no qual um invasor insere código JavaScript malicioso em uma página, que é então executado no navegador da vítima. Isso pode ser usado para roubar cookies, redirecionar o usuário para sites maliciosos ou modificar o conteúdo da página.

Blogs

Book Recommendations