Cross-Site Scripting (XSS)
Definição
Cross-Site Scripting (XSS) é uma vulnerabilidade que permite a injeção de scripts maliciosos em páginas web visualizadas por outros usuários.
Geralmente, o atacante insere código JavaScript em campos de entrada que, se não forem devidamente tratados, são interpretados e executados pelo navegador da vítima.
O XSS permite roubo de cookies, redirecionamento para sites falsos, execução de comandos no contexto do navegador da vítima, entre outras ações maliciosas.
Existem três tipos principais de XSS:
- Refletido: o script é executado imediatamente na resposta da requisição.
- Armazenado: o script malicioso é salvo no servidor e entregue a vários usuários.
- DOM-based: o script é injetado e executado exclusivamente no lado do cliente, via manipulação de DOM.
Objetivos da Prevenção de XSS
- Impedir a execução de scripts não autorizados no navegador do usuário.
- Proteger dados sensíveis e sessões autenticadas.
- Evitar sequestro de identidade, phishing e redirecionamentos maliciosos.
- Melhorar a confiança e a segurança da aplicação frente a usuários e navegadores modernos.
Exemplo de ataque XSS refletido
Imagine um campo de busca que exibe o termo pesquisado sem sanitização:
<p>Você pesquisou por: <span id="termo">{{ termo }}</span></p>
Se o usuário inserir:
<script>alert("XSS");</script>
A página resultante será:
<p>
Você pesquisou por: <span id="termo"><script>alert("XSS");</script></span>
</p>
O navegador interpreta esse conteúdo como código JavaScript válido e executa o alert("XSS"), em vez de exibir o texto como conteúdo da página.
Isso acontece porque os dados inseridos pelo usuário foram incluídos diretamente no HTML, sem qualquer escape ou sanitização. Assim, o navegador trata a entrada como código legítimo e o executa — o que pode ser explorado por um atacante para executar ações maliciosas no navegador da vítima (como roubo de cookies, redirecionamentos, etc).
Como prevenir
Escape de caracteres especiais em HTML, JavaScript, URLs e atributos.
Sanitização dos dados de entrada e saída.
Uso de frameworks com proteção embutida (ex: Vue, React, Angular).
Validação de conteúdo permitido (whitelists).
Uso de CSP (Content Security Policy) para limitar scripts externos.
Nunca inserir dados do usuário diretamente no HTML sem filtro.
Exemplo seguro — escape automático com template seguro (Jinja2)
from flask import Flask, render_template_string, request
app = Flask(__name__)
@app.route("/")
def home():
termo = request.args.get("q", "")
html = "<p>Você pesquisou por: {{ termo }}</p>"
return render_template_string(html, termo=termo)
O ciclo da prevenção de XSS
[Entrada do usuário] → [Sanitização e escape] → [Renderização segura no navegador] → [Sem execução de código malicioso]
O segredo é nunca confiar em dados vindos do usuário, mesmo que pareçam inofensivos.