Skip to content

Instantly share code, notes, and snippets.

@nunesfb
Last active August 21, 2025 14:53
Show Gist options
  • Select an option

  • Save nunesfb/8a50bd95fd93edfca9f543dd9e705b70 to your computer and use it in GitHub Desktop.

Select an option

Save nunesfb/8a50bd95fd93edfca9f543dd9e705b70 to your computer and use it in GitHub Desktop.
Prática com Desenvolvimento de Software

🌐 Exemplos Práticos de Riscos no Frontend (Web)

Este documento mostra exemplos práticos dos principais riscos de segurança em aplicações Web (frontend), incluindo código vulnerável, ataques e formas de prevenção.


1. 🚨 Cross-Site Scripting (XSS)

Cenário Vulnerável

<!-- Comentários exibidos sem sanitização -->
<input id="comentario" placeholder="Digite um comentário" />
<div id="feed"></div>

<script>
  function postar() {
    const comentario = document.getElementById("comentario").value;
    document.getElementById("feed").innerHTML += `<p>${comentario}</p>`;
  }
</script>

Ataque

Um atacante insere:

<script>alert('Hacked!')</script>

Quando renderizado:

<p><script>alert('Hacked!')</script></p>

⚠️ Executa JavaScript no navegador da vítima.

Prevenção

  • Usar escape de HTML:
function sanitize(input) {
  return input.replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
  • Usar libs seguras (DOMPurify, React JSX → já faz escape automático).

2. 🛑 Cross-Site Request Forgery (CSRF)

Cenário Vulnerável

Formulário de alteração de senha:

<form action="/alterar-senha" method="POST">
  <input type="hidden" name="novaSenha" value="123456" />
  <button type="submit">Alterar Senha</button>
</form>

Ataque

O atacante cria um site com:

<body onload="document.forms[0].submit()">
  <form action="https://meusite.com/alterar-senha" method="POST">
    <input type="hidden" name="novaSenha" value="hacked123" />
  </form>
</body>

⚠️ Se o usuário estiver logado no meusite.com, o navegador envia os cookies automaticamente, alterando a senha sem consentimento.

Prevenção

  • Tokens CSRF (ex.: csrf_token escondido no form e validado no backend).
  • SameSite nos cookies:
Set-Cookie: sessionId=abc123; SameSite=Strict; Secure

3. 🔑 Exposição de Dados Sensíveis

Cenário Vulnerável

// Arquivo público: config.js
const API_KEY = "ABCD-1234-SECRET-KEY";
fetch(`https://api.pagamentos.com/?key=${API_KEY}&user=1`);

⚠️ Qualquer pessoa pode abrir o DevTools e ver a chave.

Prevenção

  • Nunca expor chaves no frontend.
  • Usar backend intermediário que guarda a chave com segurança:
fetch("/api/pagamentos?user=1"); // backend adiciona API_KEY

4. 🖼️ Clickjacking

Cenário Vulnerável

Um site legítimo pode ser embutido em um iframe:

<iframe src="https://banco.com" width="100%" height="600"></iframe>

O atacante sobrepõe botões invisíveis (ex.: "Transferir dinheiro").

Prevenção

Adicionar cabeçalho HTTP no servidor:

X-Frame-Options: DENY

ou

Content-Security-Policy: frame-ancestors 'none';

5. 🔧 Manipulação de DOM

Cenário Vulnerável

<button id="comprar" onclick="comprarProduto(100)">Comprar por R$100</button>

<script>
  function comprarProduto(valor) {
    alert("Produto comprado por R$" + valor);
  }
</script>

Ataque

No console do navegador:

document.getElementById("comprar").setAttribute("onclick", "comprarProduto(1)");

⚠️ O botão agora vende por R$1.

Prevenção

  • Nunca confiar apenas no frontend.
  • Validar regras no backend (ex.: preço real do produto).
  • Usar event listeners em vez de onclick inline.

✅ Resumo de Boas Práticas

  • XSS → sanitizar entradas e usar frameworks que escapam HTML.
  • CSRF → tokens anti-CSRF e SameSite cookies.
  • Exposição de Dados → nunca expor chaves/tokens no frontend.
  • ClickjackingX-Frame-Options / CSP frame-ancestors.
  • Manipulação de DOM → sempre validar no backend.

⚙️ Exemplos Práticos de Riscos no Backend (APIs e Servidores)

Este documento mostra exemplos práticos dos principais riscos de segurança em APIs e servidores backend, incluindo código vulnerável, ataques e formas de prevenção.


1. 💉 Injeções (SQL, NoSQL, LDAP, Command Injection)

Cenário Vulnerável (SQL Injection em API Node.js)

app.get("/user", (req, res) => {
  const id = req.query.id;
  db.query(`SELECT * FROM usuarios WHERE id = ${id}`, (err, result) => {
    res.json(result);
  });
});

Ataque

GET /user?id=1 OR 1=1

⚠️ Retorna todos os usuários.

Prevenção

  • Queries parametrizadas:
db.query("SELECT * FROM usuarios WHERE id = $1", [req.query.id]);
  • Usar ORMs seguros (Sequelize, TypeORM).

2. 🔑 Autenticação e Autorização Fracas

Cenário Vulnerável (JWT sem expiração)

const token = jwt.sign({ id: user.id }, "segredo_super_fraco");

⚠️ Token sem expiresIn nunca expira → invasor pode usar indefinidamente.

Prevenção

  • Usar tokens com expiração curta:
const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: "15m" });
  • Renovação via refresh token seguro.
  • Revogar tokens comprometidos (blacklist/Redis).

3. 🛠️ Exposição de Endpoints Sensíveis

Cenário Vulnerável

// Rota de debug deixada exposta
app.get("/debug", (req, res) => {
  res.json(process.env); // mostra variáveis sensíveis
});

⚠️ Atacante descobre chaves de API, credenciais etc.

Prevenção

  • Nunca expor endpoints de debug em produção.
  • Usar feature flags ou habilitar só em dev:
if (process.env.NODE_ENV === "development") {
  app.get("/debug", ...);
}

4. 🚫 Quebra de Controle de Acesso (Broken Access Control)

Cenário Vulnerável

// API retorna dados de qualquer usuário pelo ID
app.get("/user/:id", (req, res) => {
  db.query("SELECT * FROM usuarios WHERE id = $1", [req.params.id], (err, result) => {
    res.json(result.rows[0]);
  });
});

Ataque

GET /user/2

⚠️ Usuário mal-intencionado acessa dados de outro usuário.

Prevenção

  • Validar ownerId:
app.get("/user/:id", (req, res) => {
  if (req.user.id != req.params.id) return res.status(403).send("Acesso negado");
});

5. 📦 Deserialização Insegura

Cenário Vulnerável (Node.js)

app.post("/data", (req, res) => {
  const objeto = eval("(" + req.body.payload + ")"); // péssima prática!
  res.json(objeto);
});

⚠️ Um atacante pode enviar:

{ "payload": "process.exit()" }

➡️ O servidor desliga.

Prevenção

  • Usar JSON.parse ou libs seguras de deserialização.
  • Validar payloads com Joi, Yup, Zod.

6. 📤 Exposição Excessiva de Dados (Overexposure)

Cenário Vulnerável

// Retorna tudo do usuário
app.get("/profile", (req, res) => {
  res.json(user); // inclui senha, tokens, etc.
});

⚠️ API retorna campos sensíveis desnecessários.

Prevenção

  • Retornar apenas os dados necessários:
res.json({ id: user.id, nome: user.nome, email: user.email });
  • Usar DTOs/serializers para controlar o que vai na resposta.

7. ⚠️ Configurações Padrão

Cenário Vulnerável

  • Banco de dados acessível em root/root.
  • Painel admin sem senha.

⚠️ Atacante acessa sem esforço.

Prevenção

  • Alterar credenciais padrão.
  • Desabilitar usuários de superadmin em produção.
  • Usar cofre de segredos (Vault, AWS Secrets Manager, .env).

✅ Resumo de Boas Práticas

  • Injeções → queries parametrizadas, ORM, validação de input.
  • Autenticação → tokens com expiração, MFA, refresh tokens.
  • Endpoints Sensíveis → nunca expor debug/admin sem auth.
  • Access Control → validar ownerId, RBAC/ABAC.
  • Deserialização → nunca usar eval, sempre validar payload.
  • Exposição de Dados → retornar só o necessário.
  • Configurações → evitar credenciais default, usar cofre de segredos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment