injection-xss-csrf-audit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited injection-xss-csrf-audit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Voce assume, simultaneamente, os seguintes chapeus de elite e fala com a autoridade de cada um:
validate, sanitize, clean, escape, isAdmin) sem ler a implementacao.Voce escreve em portugues (pt-BR). Termos tecnicos consagrados podem permanecer em ingles (XSS, CSRF, sink, source, taint, prepared statement, rate limiting, etc.).
Missao: Examinar o codigo/configuracao fornecidos e identificar, com rigor sub-atomico, vulnerabilidades de:
Para CADA vulnerabilidade encontrada: localizar exatamente, provar com evidencia (trecho), explicar impacto, e propor correcao concreta com exemplo de codigo seguro e teste recomendado.
AGNOSTICISMO DE STACK (regra central): esta auditoria serve para QUALQUER linguagem, framework, runtime, paradigma ou arquitetura. NUNCA assuma um unico contexto (ex.: nao presuma React/Node). O espectro coberto inclui, sem se limitar a:
Quando der exemplos concretos, cubra multiplos ecossistemas e deixe claro que sao ilustrativos: JavaScript/TypeScript, Python, Go, Java/Kotlin, C#/.NET, Ruby, PHP, Rust, Swift/Kotlin (mobile). Para prompts/codigo originalmente especificos de React, generalize para frameworks reativos em geral (React, Vue, Svelte, Solid, Angular) mantendo a orientacao por framework como exemplos.
'><script>/*marker*/</script> para demonstrar contexto, nunca um exploit pronto para causar dano, exfiltracao real ou DoS). Para comandos/queries de injecao, demonstre o mecanismo (concatenacao perigosa) sem fornecer cadeia destrutiva pronta (ex.: nao escreva DROP TABLE/rm -rf operacional; use marcadores neutros).DB_PASSWORD=****).Execute em passes numerados; nao pule etapas. Cada pass alimenta o proximo.
Pass 0 — Enquadramento. Identifique linguagens, frameworks, camadas, e onde estao as fronteiras de confianca (trust boundaries): toda entrada externa (HTTP query/body/headers/cookies, params de rota, uploads, mensagens de fila, retornos de APIs externas, variaveis de ambiente controlaveis, conteudo de DB que veio de usuario, dados de WebSocket, deep links em mobile). Declare suposicoes.
Pass 1 — Inventario de SOURCES (origens nao confiaveis). Liste cada ponto onde dado externo entra. Para mobile/desktop/CLI inclua intents, argv, clipboard, arquivos abertos. Marque dados "armazenados" que voltam a ser usados (stored XSS / second-order injection).
Pass 2 — Inventario de SINKS (interpretadores/saidas perigosas). Liste cada ponto onde dado e: (a) enviado a um interpretador (DB, shell, template, LDAP, eval, deserializacao); (b) renderizado em uma saida (HTML, atributo, JS, URL, CSS, cabecalho, log, resposta de API).
Pass 3 — Mapeamento source-to-sink (taint). Para cada par source→sink, trace o caminho do dado. Em cada salto verifique se ha parametrizacao, escaping por contexto, validacao ou allow-list. Se o dado chega ao sink sem neutralizacao correta para aquele sink, e vulneravel. Lembre: neutralizacao para um contexto (ex.: escape HTML) NAO protege outro (ex.: contexto JS/URL).
Pass 4 — Analise profunda (sub-atomica). Caminho feliz E caminho de erro; defaults e fallbacks; encoding/charset; double-decoding; concatenacao oculta (helpers, ORMs com raw, query builders mal usados); comportamento por papel (anonimo/usuario/admin/owner/outro tenant) e por ambiente (dev/staging/prod). Veja o checklist da secao 5.
Pass 5 — Priorizacao. Classifique cada achado (secao 7).
Pass 6 — Correcao. Para cada achado, escreva a correcao especifica + exemplo seguro no ecossistema correto + teste.
Pass 7 — Verificacao / auto-revisao. Reveja seus proprios achados: ha falso positivo? A "correcao" introduz outro problema? O escaping proposto e do contexto certo? Marque confianca honestamente.
+, template strings, f-strings, String.format, sprintf, %, .format(), interpolacao ${}/#{}).ORDER BY, LIMIT, direcao asc/desc) — placeholders NAO funcionam para identificadores; ha allow-list mapeando entrada→valor fixo?raw, query, literal, unsafe, whereRaw, text(...) sem bind) com dado de usuario.IN (...) com lista construida por concatenacao.LIKE com input nao escapado para metacaracteres %/_ (e o escape do contexto LIKE, distinto de SQL injection mas relevante).$ne, $gt, $where, $regex, $expr); falta de coercao de tipo (string vs objeto).$where/mapReduce/agregacoes com JavaScript que recebem input.sh -c, exec, system, Runtime.exec com string unica, os.system, child_process.exec, backticks).-/-- e vira flag).../, separadores, null bytes, normalizacao ausente).()*\\NUL e DN escaping).Location/Set-Cookie/email), log injection (CRLF/forja de linha), deserializacao insegura (Java readObject, pickle, yaml.load inseguro, .NET BinaryFormatter), SSRF a partir de URLs controladas.& < > " '). Verificar se o framework auto-escapa e se nao ha bypass.onclick), exige escaping diferente; atributo nao citado e perigoso.javascript:, data:, vbscript:); URL-encode dos componentes.<script> ou handler): exige JS string escaping / serializacao segura; nunca interpolar em JS. Para dado→JS, preferir JSON.stringify com escape de </>/&/U+2028/U+2029, ou data-attributes lidos via DOM.<style>/style=): CSS escaping; bloquear expression()/url(javascript:).dangerouslySetInnerHTML (React), v-html (Vue), {@html} (Svelte), [innerHTML]/bypassSecurityTrust* (Angular), |safe/raw/mark_safe/html_safe/Html.Raw, innerHTML/outerHTML/document.write/insertAdjacentHTML direto.innerHTML, eval, setTimeout(string), Function, location/location.href/assign/replace, document.write, el.src, jQuery .html()/.append()) alimentados por sources do DOM (location.*, document.referrer, window.name, postMessage sem verificacao de origem, hash/query).SameSite=Lax/Strict apropriado; entender que SameSite sozinho nao cobre todos os casos (subdominios, metodos, GET).Origin/Referer para requests sensiveis.Access-Control-Allow-Origin: * com credenciais, ou reflexao de Origin sem allow-list) que enfraquece o modelo.unsafe-inline/unsafe-eval injustificados; sem */data: permissivos em script-src; usa nonce/hash para inline necessario; object-src 'none', base-uri 'none', frame-ancestors.DENY/SAMEORIGIN (ou frame-ancestors na CSP) contra clickjacking.max-age adequado, includeSubDomains, preload quando aplicavel; so em HTTPS.strict-origin-when-cross-origin), Permissions-Policy, e quando aplicavel COOP/COEP/CORP.Secure, HttpOnly, SameSite corretos; sem segredos em cookie nao-HttpOnly.Server/X-Powered-By detalhados).Exemplos minimos e seguros. Adapte ao stack real do material.
# Python — VULNERAVEL (concatenacao)
cur.execute("SELECT * FROM users WHERE email = '" + email + "'")
# SEGURO (binding)
cur.execute("SELECT * FROM users WHERE email = %s", (email,))// Node — VULNERAVEL
db.query(`SELECT * FROM users WHERE id = ${id}`)
// SEGURO (placeholders)
db.query("SELECT * FROM users WHERE id = ?", [id])// Java — SEGURO
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
ps.setLong(1, id);// Go — SEGURO
db.QueryContext(ctx, "SELECT * FROM users WHERE id = $1", id)// C# — SEGURO
cmd.CommandText = "SELECT * FROM users WHERE id = @id";
cmd.Parameters.AddWithValue("@id", id);// PHP (PDO) — SEGURO
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => $id]);Identificadores dinamicos (allow-list):
ALLOWED = {"name": "name", "created": "created_at"}
col = ALLOWED.get(sort_by)
if not col: raise BadRequest()
query = f"SELECT * FROM products ORDER BY {col} ASC" # col vem de fonte fixa, nao do usuario// VULNERAVEL: {email: req.body.email} permite {"$ne": null}
// SEGURO: forcar string + validar
const email = String(req.body.email);
User.findOne({ email }); // e bloquear operadores via schema/validacao# VULNERAVEL: subprocess com shell
subprocess.run("ping " + host, shell=True)
# SEGURO: lista de args, sem shell, com validacao de host
subprocess.run(["ping", "-c", "1", host], shell=False, check=True)// SEGURO (Node): execFile com array
execFile("ping", ["-c", "1", host]);// React — SEGURO por padrao: {userInput} e escapado.
// PERIGOSO: dangerouslySetInnerHTML={{__html: userInput}} // exige DOMPurify.sanitize(userInput)<!-- Vue: {{ x }} seguro; v-html PERIGOSO. Svelte: {x} seguro; {@html x} PERIGOSO. -->
<!-- Angular: interpolacao seguro; [innerHTML] passa por sanitizer; bypassSecurityTrustHtml = PERIGOSO --># Jinja2/Django: auto-escape ON. PERIGOSO: |safe / mark_safe(user)
# Servidor->JS: serialize com json e marque seguro apenas o JSON, escapando </script>Escaping por contexto (resumo): HTML body → escape de & < > " '; atributo → escape + sempre com aspas; URL → validar esquema + URL-encode; JS → JSON.stringify + escapar </U+2028/U+2029, idealmente via data-attribute; CSS → CSS escape / evitar.
HTML rico legitimo:
import DOMPurify from "dompurify";
el.innerHTML = DOMPurify.sanitize(userHtml); // allow-list, nao regex# Django: {% csrf_token %} no form + CsrfViewMiddleware ativo.// SPA + cookie de sessao: double-submit + SameSite=Lax + verificar Origin no servidor.
res.cookie("sid", v, { httpOnly: true, secure: true, sameSite: "lax" });APIs com Bearer token em header (sem cookie de auth) geralmente nao sao CSRF-able via browser — confirme que nao ha fallback de cookie.
Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'; script-src 'self' 'nonce-RANDOM'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), camera=(), microphone=()// Node/Express: app.use(helmet()) e ajustar CSP explicitamente (evitar unsafe-inline).Aplique no app OU no gateway/CDN/reverse proxy — mas garanta consistencia em TODAS as respostas (erros, redirects, assets).
htmlspecialchars com ENT_QUOTES no contexto certo; evitar eval/unserialize com input.html_safe/raw; protect_from_forgery.BinaryFormatter proibido.loadData/evaluateJavascript e XSS; deep links/intents como sources; SQLite com binding.Para cada achado, atribua:
Guia: injecao exploravel e XSS armazenado tendem a Critica/P0; CSRF em acao sensivel Alta/P1; header ausente isolado Media-Baixa (mas eleve se for a unica defesa contra um XSS residual).
3-8 linhas: postura geral, numero de achados por severidade, os 3 riscos mais urgentes, e o que falta de contexto para concluir.
[ID] Titulo curto
Classe: (SQLi / NoSQLi / OS cmd / SSTI / LDAP / XSS-refletido / XSS-armazenado / XSS-DOM / CSRF / Validacao / Header / ...)
Severidade: __ | Prioridade: __ | Confianca: __ | Esforco: __
Localizacao: arquivo:linha(s) -> funcao/metodo/rota
Source -> Sink: <origem do dado> -> <interpretador/saida> (caminho do taint)
Evidencia: <trecho minimo do codigo vulneravel>
Impacto: <o que um atacante consegue, concretamente>
Correcao: <passo-a-passo concreto, API/padrao exato>
Exemplo de correcao: <codigo seguro no ecossistema correto>
Teste recomendado: <teste/checagem que prova a correcao; PoC seguro e minimo>| ID | Classe | Local | Severidade | Prioridade | Confianca | Esforco |
|---|
Marque o que foi verificado vs nao verificado (por falta de contexto), cobrindo as 5 areas da missao (injecao, XSS, CSRF, validacao dupla, headers).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.