<?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>DEV Community: Bryan Rafael</title>
    <description>The latest articles on DEV Community by Bryan Rafael (@bryanrafaelbueno).</description>
    <link>https://dev.to/bryanrafaelbueno</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4110662%2F7db9e6fd-ea01-4c7c-bfe6-2ae01a3938dc.png</url>
      <title>DEV Community: Bryan Rafael</title>
      <link>https://dev.to/bryanrafaelbueno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bryanrafaelbueno"/>
    <language>en</language>
    <item>
      <title>CI de segurança em 10 minutos: workflows prontos (audit semanal + SBOM + secret scan)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 07:26:04 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/ci-de-seguranca-em-10-minutos-workflows-prontos-audit-semanal-sbom-secret-scan-2eli</link>
      <guid>https://dev.to/bryanrafaelbueno/ci-de-seguranca-em-10-minutos-workflows-prontos-audit-semanal-sbom-secret-scan-2eli</guid>
      <description>&lt;p&gt;Segurança em CI é daquelas coisas que todo mundo concorda que é necessário mas ninguém tem pronto. Em vez de montar do zero, aqui vão 3 workflows que você copia para &lt;code&gt;.github/workflows/&lt;/code&gt; e ajusta uma URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Auditoria passiva semanal (headers/TLS/CORS/expostos)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Security audit semanal&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[{&lt;/span&gt; &lt;span class="nv"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;8&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt; &lt;span class="pi"&gt;}]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;audit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bryanrafaelbueno/reconpp-action@main&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://SEU-SITE.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gera relatório Markdown por site com severidade + correção — a cada segunda-feira você vê a evolução da postura.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. SBOM e dependências
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SBOM&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm audit --audit-level=high || &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install pip-audit &amp;amp;&amp;amp; pip-audit || &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Secret scan
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret scan&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;docker run --rm -v "$PWD:/code" \&lt;/span&gt;
      &lt;span class="s"&gt;trufflesecurity/trufflehog:latest filesystem /code --fail=yes || true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pega chaves e credenciais commitadas antes de virar incidente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que passivo importa
&lt;/h2&gt;

&lt;p&gt;O audit semanal usa só leitura de cabeçalhos — sem fuzzing, sem brute force. Não vai derrubar site nem alertar seu SRE à toa. É a primeira camada que qualquer auditoria profissional verifica.&lt;/p&gt;

&lt;p&gt;Os três workflows juntos (com os detalhes de licença e variáveis) estão no meu &lt;strong&gt;CI Security Kit&lt;/strong&gt; — prontos, comentados e com o fluxo de auditoria incluído:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loja (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ferramenta grátis: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/header-checker.html" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/header-checker.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Segurança boa é a que roda em todo push. 🛡️&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>ci</category>
    </item>
    <item>
      <title>Como transformar uma auditoria passiva em um plano de ação em 30 minutos</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:59:27 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/como-transformar-uma-auditoria-passiva-em-um-plano-de-acao-em-30-minutos-102</link>
      <guid>https://dev.to/bryanrafaelbueno/como-transformar-uma-auditoria-passiva-em-um-plano-de-acao-em-30-minutos-102</guid>
      <description>&lt;p&gt;Você rodou a auditoria passiva (ex.: o &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt;) e o relatório veio cheio de achados. Para onde olhar primeiro? Este é o caminho de 30 minutos que uso para transformar o relatório em ação.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Separe por severidade (5 min)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Severidade&lt;/th&gt;
&lt;th&gt;Exemplo típico&lt;/th&gt;
&lt;th&gt;Prazo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;td&gt;RCE, SQLi, IDOR financeiro&lt;/td&gt;
&lt;td&gt;72h ou quarentena&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Média&lt;/td&gt;
&lt;td&gt;XSS armazenado, SSRF limitada&lt;/td&gt;
&lt;td&gt;&amp;lt; 14 dias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baixa&lt;/td&gt;
&lt;td&gt;CSP faltando, headers fracos&lt;/td&gt;
&lt;td&gt;&amp;lt; 60 dias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Info&lt;/td&gt;
&lt;td&gt;Server header, sem security.txt&lt;/td&gt;
&lt;td&gt;próximo ciclo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  2. Identifique os quick wins (10 min)
&lt;/h2&gt;

&lt;p&gt;Coisas que se resolvem em minutos no orquestrador/servidor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Strict-Transport-Security: max-age=31536000; includeSubDomains&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Frame-Options: DENY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Referrer-Policy: strict-origin-when-cross-origin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cookie flags: &lt;code&gt;Secure; HttpOnly; SameSite=Lax&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;security.txt&lt;/code&gt; (RFC 9116)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Monte o plano (10 min)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hoje:&lt;/strong&gt; todos os quick wins (30 min de trabalho).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esta semana:&lt;/strong&gt; CSP estrito (migre com nonces), 401/403 em arquivos expostos, remova fingerprinting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Próximos 14 dias:&lt;/strong&gt; rate limiting, erros genéricos, revisar auth/OAuth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Próximos 60 dias:&lt;/strong&gt; dependências no CI, secrets no CI, SBOM.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Documente como código
&lt;/h2&gt;

&lt;p&gt;Coloque os headers num config-as-code (nginx/CI/CD) — não numa caixa de comentários. Se não houver CI, o checklist vira lista de issue do projeto.&lt;/p&gt;




&lt;p&gt;Esse é exatamente o fluxo que o meu ebook &lt;strong&gt;"Web Security Audit na Prática"&lt;/strong&gt; ensina com o modelo de relatório e a matriz de priorização. Se quiser levá-lo para o seu fluxo, além do ebook (R$49,90) existe o &lt;strong&gt;Kit de Auditoria&lt;/strong&gt; (R$39,90) com a matriz editável e o modelo de relatório em Word:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loja (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amostra grátis: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Auditorias sempre com autorização escrita — mesmo quando passivas. 🛡️&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Como conseguir o primeiro emprego como dev no Brasil: currículo, LinkedIn e portfólio (guia rápido)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:51:51 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/como-conseguir-o-primeiro-emprego-como-dev-no-brasil-curriculo-linkedin-e-portfolio-guia-rapido-17h6</link>
      <guid>https://dev.to/bryanrafaelbueno/como-conseguir-o-primeiro-emprego-como-dev-no-brasil-curriculo-linkedin-e-portfolio-guia-rapido-17h6</guid>
      <description>&lt;p&gt;Não conta os 10 cursos com certificado. Conta o projeto público, a comunicação e o LinkedIn minimamente otimizado. Este é o guia de bolso que usei (e que cobra é mais caro) — organizado em 5 partes.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Currículo BR que recrutadores aprovam
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 coluna, máx. 2 páginas.&lt;/strong&gt; Recrutadores leem ~7 segundos.&lt;/li&gt;
&lt;li&gt;Bloco 1: nome + cidade + e-mail + GitHub + LinkedIn.&lt;/li&gt;
&lt;li&gt;Bloco 2: título em 1 linha — "Desenvolvedor Python focado em APIs e automação".&lt;/li&gt;
&lt;li&gt;Bloco 3: 3 projetos. Formato: &lt;strong&gt;nome — o que resolve — stack — link&lt;/strong&gt;. Projeto com usuário real vale 5x mais.&lt;/li&gt;
&lt;li&gt;Bloco 4: formação e cursos (só a ordem superior).&lt;/li&gt;
&lt;li&gt;Sem bloco de soft skills nem "objetivo" genérico.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. LinkedIn em 30 minutos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Capa limpa, foto, título igual ao currículo.&lt;/li&gt;
&lt;li&gt;Intro: 2 frases de valor + o que procura.&lt;/li&gt;
&lt;li&gt;1 post por semana (progresso de um projeto).&lt;/li&gt;
&lt;li&gt;5 conexões/dia com recrutadores + 1 frase personalizada (não pitch).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Portfólio que funciona
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1 produto com usuário real &amp;gt; 5 clones de tutorial.&lt;/li&gt;
&lt;li&gt;Deploy público (GitHub Pages / Vercel/Render) + README detalhado + print/vídeo curto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Entrevistas técnicas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;20 LeetCode fáceis/médios/mês + 3 histórias STAR prontas.&lt;/li&gt;
&lt;li&gt;Não finja: "ainda não sei, mas sei onde procurar" passa melhor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. O ciclo que funciona
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;20 inscrições/semana (LinkedIn + plataformas + indicações) ≈ 3% de retorno.&lt;/li&gt;
&lt;li&gt;Acompanhe tudo numa planilha — meta, não "apliquei quando lembrei".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A parte prática (modelos de mensagem de conexão, textos de intro completo, planilha de candidaturas) está no meu guia em PDF + CSV — se quiser o guia completo e a planilha:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bryanrafaelbueno.github.io/emprego-dev/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/emprego-dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também publico ferramentas de segurança em &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;github.com/bryanrafaelbueno&lt;/a&gt;. Boa sorte na candidatura! 🚀&lt;/p&gt;

</description>
      <category>career</category>
      <category>brazil</category>
      <category>devops</category>
    </item>
    <item>
      <title>SameSite cookies and CSRF: what auditors actually check</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:25:48 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/samesite-cookies-and-csrf-what-auditors-actually-check-ghd</link>
      <guid>https://dev.to/bryanrafaelbueno/samesite-cookies-and-csrf-what-auditors-actually-check-ghd</guid>
      <description>&lt;p&gt;CSRF is mostly dead — thanks to SameSite. But "mostly" carries a lot of weight in an audit report: cookies missing &lt;code&gt;SameSite&lt;/code&gt;, or set to &lt;code&gt;None&lt;/code&gt; without &lt;code&gt;Secure&lt;/code&gt;, are the most common session findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  SameSite, quickly
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Cookie sent on&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Lax&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Top-level navigations (and same-site) — NOT on subresource requests from other sites&lt;/td&gt;
&lt;td&gt;Default for most apps ✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Strict&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same-site requests only&lt;/td&gt;
&lt;td&gt;Where you never need external links to carry state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;None&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always (ignores site) — MUST have &lt;code&gt;Secure&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Cross-site embed/subdomain auth flows (legacy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What fails an audit
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Cookie without &lt;code&gt;SameSite&lt;/code&gt; at all → cross-site state still possible&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SameSite=None&lt;/code&gt; without &lt;code&gt;Secure&lt;/code&gt; → &lt;strong&gt;browser rejects the cookie entirely&lt;/strong&gt; (and the app breaks silently without anyone noticing)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SameSite=None&lt;/code&gt; used defensively for everything → CSRF surface recreated&lt;/li&gt;
&lt;li&gt;CSRF tokens missing on mutation endpoints that rely only on SameSite (defense-in-depth check)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The passive check
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://your-site.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; set-cookie
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;reconpp&lt;/code&gt; reads every &lt;code&gt;Set-Cookie&lt;/code&gt; and reports missing/incorrect flags (Secure, HttpOnly, SameSite) with the exact fix per cookie:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://your-site.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; report.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Recommendation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SameSite=Lax&lt;/code&gt; by default; &lt;code&gt;Strict&lt;/code&gt; for banking-type apps&lt;/li&gt;
&lt;li&gt;Keep anti-CSRF tokens anyway (defense in depth)&lt;/li&gt;
&lt;li&gt;Never &lt;code&gt;None&lt;/code&gt; unless there's a verified cross-site need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 70+ point checklist (sessions, headers, API, auth, CI/CD) is in the pt-BR ebook — free sample at the store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Free sample: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Clickjacking: o que é e como proteger seu site (pt-BR, com verificação automática)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:24:31 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/clickjacking-o-que-e-e-como-proteger-seu-site-pt-br-com-verificacao-automatica-3kh9</link>
      <guid>https://dev.to/bryanrafaelbueno/clickjacking-o-que-e-e-como-proteger-seu-site-pt-br-com-verificacao-automatica-3kh9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Clickjacking&lt;/strong&gt; é o ataque em que um site malicioso carrega a sua página dentro de um iframe transparente e engana o usuário para clicar em botões que ele acha que são dele. Duas defesas existem — e uma delas está saindo de cena.&lt;/p&gt;

&lt;h2&gt;
  
  
  As duas defesas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mecanismo&lt;/th&gt;
&lt;th&gt;Como funciona&lt;/th&gt;
&lt;th&gt;Situação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X-Frame-Options: DENY / SAMEORIGIN&lt;/td&gt;
&lt;td&gt;Header: navegador recusa carregar em iframe&lt;/td&gt;
&lt;td&gt;Legado, ainda suportado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSP frame-ancestors&lt;/td&gt;
&lt;td&gt;Diretiva: &lt;code&gt;frame-ancestors 'none'&lt;/code&gt; / &lt;code&gt;'self'&lt;/code&gt; / allowlist&lt;/td&gt;
&lt;td&gt;Moderno e mais flexível&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Erros que reprovam
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;X-Frame-Options: ALLOWALL&lt;/code&gt; — libera explicitamente o framing (falha direta)&lt;/li&gt;
&lt;li&gt;CSP com &lt;code&gt;frame-ancestors *&lt;/code&gt; — mesma coisa&lt;/li&gt;
&lt;li&gt;Nenhum dos dois — página fica "apertável"&lt;/li&gt;
&lt;li&gt;Só XFO quando a página usa widgets de terceiros (empurra você a liberar demais)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como verificar (passivo)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://seu-site.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s2"&gt;"x-frame-options|content-security-policy"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem os dois headers (ou com ALLOWALL) a página é frameável. A CLI &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt; marca isso automaticamente com correção sugerida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://seu-site.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; relatorio.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[WARN] headers | Clickjacking (X-Frame-Options / frame-ancestors)
Fix: Adicione 'X-Frame-Options: DENY' ou CSP 'frame-ancestors 'none''.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Recomendação
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sistemas novos: só CSP (&lt;code&gt;frame-ancestors 'none'&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Legados: mantém XFO até ter CSP válido&lt;/li&gt;
&lt;li&gt;Nunca ALLOWALL; allowlist mínima e documentada se o site realmente precisa ser incorporado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adividade de segurança completa (70+ pontos) no ebook pt-BR — amostra grátis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loja (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amostra: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>X-Frame-Options vs CSP frame-ancestors: protecting against clickjacking (with a passive check)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:20:14 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/x-frame-options-vs-csp-frame-ancestors-protecting-against-clickjacking-with-a-passive-check-1oob</link>
      <guid>https://dev.to/bryanrafaelbueno/x-frame-options-vs-csp-frame-ancestors-protecting-against-clickjacking-with-a-passive-check-1oob</guid>
      <description>&lt;p&gt;Clickjacking is the attack where a malicious site loads your page in a transparent iframe and tricks the victim into clicking buttons they believe belong to the attacker. Two mechanisms stop it — and one of them is being deprecated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two defenses
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X-Frame-Options: DENY / SAMEORIGIN&lt;/td&gt;
&lt;td&gt;Header: browser refuses to frame the page&lt;/td&gt;
&lt;td&gt;Legacy, well supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSP frame-ancestors&lt;/td&gt;
&lt;td&gt;CSP directive: &lt;code&gt;frame-ancestors 'none'&lt;/code&gt; / &lt;code&gt;'self'&lt;/code&gt; / allowlist&lt;/td&gt;
&lt;td&gt;Modern, more flexible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What gets it wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;X-Frame-Options: ALLOWALL&lt;/code&gt; — explicitly allows framing; instant FAIL.&lt;/li&gt;
&lt;li&gt;CSP with &lt;code&gt;frame-ancestors *&lt;/code&gt; — same as ALLOWALL.&lt;/li&gt;
&lt;li&gt;Only XFO while adding third-party widgets that need framing (you'll be forced to loosen CSP or drop XFO — do the reverse: keep CSP strict and use allowlists).&lt;/li&gt;
&lt;li&gt;Nothing: no XFO + no frame-ancestors = unprotected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The passive check
&lt;/h2&gt;

&lt;p&gt;Send the request and look for both headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://your-site.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s2"&gt;"x-frame-options|content-security-policy"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see neither (or ALLOWALL), your page is frameable. My CLI &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt; flags this automatically with a suggested fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://your-site.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; report.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[WARN] headers | Clickjacking (X-Frame-Options / frame-ancestors)
Fix: Add 'X-Frame-Options: DENY' or CSP 'frame-ancestors 'none''.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Recommendation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;New systems: CSP only (&lt;code&gt;frame-ancestors 'none'&lt;/code&gt;), no XFO.&lt;/li&gt;
&lt;li&gt;Legacy: keep XFO until the CSP is enforceable.&lt;/li&gt;
&lt;li&gt;Never ALLOWALL; never frame-ancestors * (even for "trusted" embedders, use the explicit allowlist).&lt;/li&gt;
&lt;li&gt;If your site is embedded intentially (payment widgets etc.), document it and keep the allowlist minimal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More pass/fail/repair items in the full 70+ point checklist — free sample at the store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Free sample PDF: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Modelo pronto de relatório de pentest (estrutura + template de achado)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:17:05 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/modelo-pronto-de-relatorio-de-pentest-estrutura-template-de-achado-42ka</link>
      <guid>https://dev.to/bryanrafaelbueno/modelo-pronto-de-relatorio-de-pentest-estrutura-template-de-achado-42ka</guid>
      <description>&lt;p&gt;O que separa um relatório "amador" de um que cliente respeita não é achar mais bugs — é &lt;strong&gt;organizar&lt;/strong&gt; o que achou. Esta é a estrutura que uso, com o template de achado pronto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura de um relatório profissional
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Escopo&lt;/strong&gt; — URLs/hosts, período, objetivo. Também diga o que &lt;em&gt;não&lt;/em&gt; foi testado (limitações evitam disputa de expectativa).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metodologia&lt;/strong&gt; — passiva/ativa, ferramentas, janela de execução.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resumo executivo&lt;/strong&gt; — 5 a 8 linhas para quem decide: total de achados e a proporção por severidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tabela de achados&lt;/strong&gt; — ID, severidade, título, impacto, afeta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detalhamento&lt;/strong&gt; — um bloco por achado (template abaixo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anexos&lt;/strong&gt; — evidências (request/response), saída de ferramentas, checklist pontuado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Template de achado (copiar)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ID-01 | Média | Cookie de sessão sem Secure e HttpOnly

Componente: https://cliente.com/login

Descrição:
O cookie de sessão JSESSIONID é emitido sem os atributos Secure e HttpOnly.
- Sem Secure: pode ser interceptado em rede não confiável (downgrade/HTTP).
- Sem HttpOnly: é lido por qualquer XSS, permitindo roubo de sessão.

Evidência (curl -i):
Set-Cookie: JSESSIONID=ABC123; Path=/; HttpOnly  &amp;lt;- sem Secure

Reprodução:
1. POST /login com credenciais válidas
2. Inspecionar o cabeçalho Set-Cookie da resposta
3. Observar ausência de Secure

Correção:
Configurar os atributos no servidor de aplicação:
server.servlet.session.cookie.secure=true
server.servlet.session.cookie.http-only=true
Reteste em 14 dias.

Bibliografia: OWASP Session Management Cheat Sheet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Regras de evidência
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nunca altere dados de produção para provar; crie dados de teste seus.&lt;/li&gt;
&lt;li&gt;Guarde request/response completos (&lt;code&gt;curl -i&lt;/code&gt; ou proxy).&lt;/li&gt;
&lt;li&gt;Severidade = contexto de negócio: um IDOR em dados financeiros é Média/Alta; em um blog, Informativa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gerando o grosso do relatório em 60s
&lt;/h2&gt;

&lt;p&gt;A CLI &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt; produz o relatório de configuração (headers/TLS/cookies/CORS/expostos) já no formato acima, com severidade e correção por achado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://cliente.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; relatorio.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ebook &lt;strong&gt;"Web Security Audit na Prática"&lt;/strong&gt; traz o checklist 70+, a metodologia em 5 fases e um relatório de exemplo — amostra grátis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loja (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amostra: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Relatório bom = cliente que contrata o reteste. 🛡️&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Tabela de headers de segurança HTTP com valores prontos para copiar (pt-BR)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:14:57 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/tabela-de-headers-de-seguranca-http-com-valores-prontos-para-copiar-pt-br-352d</link>
      <guid>https://dev.to/bryanrafaelbueno/tabela-de-headers-de-seguranca-http-com-valores-prontos-para-copiar-pt-br-352d</guid>
      <description>&lt;p&gt;Guia de bolso dos headers que qualquer auditoria de segurança verifica. Copie, aplique no servidor (nginx/Apache/CDN) e confira com a ferramenta ao final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabela resumo
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Valor recomendado&lt;/th&gt;
&lt;th&gt;Protege contra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strict-Transport-Security&lt;/td&gt;
&lt;td&gt;&lt;code&gt;max-age=31536000; includeSubDomains; preload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;downgrade HTTPS→HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content-Security-Policy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'none'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XSS, injeção de conteúdo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-Content-Type-Options&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nosniff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MIME sniffing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X-Frame-Options&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DENY&lt;/code&gt; (ou &lt;code&gt;SAMEORIGIN&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;clickjacking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referrer-Policy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;strict-origin-when-cross-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;vazamento de referrer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions-Policy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;camera=(), microphone=(), geolocation=()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;abuso de APIs do navegador&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Nginx de exemplo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Strict-Transport-Security&lt;/span&gt; &lt;span class="s"&gt;"max-age=31536000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;includeSubDomains&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;preload"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt; &lt;span class="s"&gt;"default-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;script-src&lt;/span&gt; &lt;span class="s"&gt;'self'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;object-src&lt;/span&gt; &lt;span class="s"&gt;'none'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;frame-ancestors&lt;/span&gt; &lt;span class="s"&gt;'none'"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Content-Type-Options&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;X-Frame-Options&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Referrer-Policy&lt;/span&gt; &lt;span class="s"&gt;strict-origin-when-cross-origin&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Permissions-Policy&lt;/span&gt; &lt;span class="s"&gt;"camera=(),&lt;/span&gt; &lt;span class="s"&gt;microphone=(),&lt;/span&gt; &lt;span class="s"&gt;geolocation=()"&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Erros que reprovam em auditoria
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HSTS sem &lt;code&gt;includeSubDomains&lt;/code&gt; quando há subdomínios&lt;/li&gt;
&lt;li&gt;CSP com &lt;code&gt;unsafe-inline&lt;/code&gt; e &lt;code&gt;unsafe-eval&lt;/code&gt; (anula quase toda a proteção)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Frame-Options: ALLOWALL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cookie sem &lt;code&gt;Secure&lt;/code&gt;/&lt;code&gt;HttpOnly&lt;/code&gt;/&lt;code&gt;SameSite&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verificando em 60 segundos
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://seu-site.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; relatorio.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada achado sai com severidade + correção recomendada. A versão completa (checklist 70+ pontos e modelo de relatório) tem amostra grátis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loja (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amostra: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Coloque os headers primeiro; eles são o "quick win" mais barato de qualquer programa de segurança. 🛡️&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>security.txt (RFC 9116): o que é, como publicar e como checar em segundos</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:08:45 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/securitytxt-rfc-9116-o-que-e-como-publicar-e-como-checar-em-segundos-1k7m</link>
      <guid>https://dev.to/bryanrafaelbueno/securitytxt-rfc-9116-o-que-e-como-publicar-e-como-checar-em-segundos-1k7m</guid>
      <description>&lt;p&gt;&lt;strong&gt;security.txt&lt;/strong&gt; (RFC 9116) é um arquivo de texto no seu site que diz quem contatar quando alguém encontrar uma falha. Custou 3 minutos para publicar — e é um dos primeiros itens que qualquer auditor procura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como publicar
&lt;/h2&gt;

&lt;p&gt;Crie o arquivo em &lt;code&gt;/.well-known/security.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contact: mailto:security@suaempresa.com
Expires: 2027-01-01T00:00:00.000Z
Preferred-Languages: pt, en
Canonical: https://suaempresa.com/.well-known/security.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regras que reprovam em auditoria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Expires&lt;/code&gt; no passado (sem data futura o arquivo perde validade)&lt;/li&gt;
&lt;li&gt;sem &lt;code&gt;Contact:&lt;/code&gt; (obrigatório)&lt;/li&gt;
&lt;li&gt;caminho errado: &lt;code&gt;/security.txt&lt;/code&gt; raiz ajuda, mas o RFC exige &lt;code&gt;/.well-known/security.txt&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Checando automaticamente
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt; verifica os dois caminhos, além de headers, TLS, cookies, CORS e arquivos expostos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://suaempresa.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; relatorio.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída para o bloco well-known:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[PASS] well-known: /.well-known/security.txt | RFC 9116 disclosure contact: present (HTTP 200)
[INFO] well-known: /security.txt | Vulnerability disclosure contact: HTTP 404
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Por que isso vende a auditoria?
&lt;/h2&gt;

&lt;p&gt;Empresas que já têm security.txt demonstram maturidade — e o relatório ganha um item verde imediato. Empresas sem o arquivo ganham um "quick win" de 3 minutos que parece um grande avanço no resumo executivo.&lt;/p&gt;

&lt;p&gt;O checklist completo de auditoria (70+ pontos) está no ebook pt-BR — amostra grátis na loja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loja (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amostra: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Modelo pronto: carta de autorização para auditoria de segurança (escopo + regras de engajamento)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:07:53 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/modelo-pronto-carta-de-autorizacao-para-auditoria-de-seguranca-escopo-regras-de-engajamento-5boa</link>
      <guid>https://dev.to/bryanrafaelbueno/modelo-pronto-carta-de-autorizacao-para-auditoria-de-seguranca-escopo-regras-de-engajamento-5boa</guid>
      <description>&lt;p&gt;Toda auditoria começa por um documento que quase ninguém tem pronto: a &lt;strong&gt;autorização por escrito&lt;/strong&gt;. Sem ela, você não testa — e com ela, o cliente leva a sério. Este é o modelo que uso em auditorias &lt;strong&gt;passivas&lt;/strong&gt; de configuração web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelo de autorização (copiar e adaptar)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TERMO DE AUTORIZAÇÃO DE AUDITORIA DE SEGURANÇA (ESCOPO PASSIVO)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Entre &lt;a href="https://dev.to"&gt;EMPRESA/PESSOA&lt;/a&gt; e &lt;a href="https://dev.to"&gt;VOCÊ&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Objetivo:&lt;/strong&gt; avaliação de configuração de segurança do(s) ativo(s) abaixo, exclusivamente por técnicas passivas (leituras de respostas HTTP normais). Sem fuzzing, sem brute force, sem tentativas de exploração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escopo:&lt;/strong&gt; [URL(s)/domínio(s)/IP(s)] — nada além disso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janela:&lt;/strong&gt; [data início] a [data fim].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limites:&lt;/strong&gt; nenhuma modificação de dados; nenhum impacto de disponibilidade; nenhum teste contra terceiros.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidências:&lt;/strong&gt; capturas de requisições/respostas; achados serão reportados só ao Autorizador.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidencialidade:&lt;/strong&gt; achados sob sigilo até correção (prazo sugerido 60 dias).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autorização:&lt;/strong&gt; o Autorizador declara ser dono/ter poderes sobre o escopo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Assinaturas: ____________________ / ____________________&lt;/p&gt;

&lt;h2&gt;
  
  
  O que anexar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Lista de hosts com owner de cada um&lt;/li&gt;
&lt;li&gt;Contatos de emergência (quem avisar se algo estranho aparecer)&lt;/li&gt;
&lt;li&gt;Regra de reteste (ex.: 1 reteste gratuito em 14 dias)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automatizando o escopo passivo
&lt;/h2&gt;

&lt;p&gt;Com o &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt;, o levantamento do bloco A (headers/TLS/cookies/CORS/arquivos expostos) sai em 60 segundos e já gera o relatório com severidades e correções:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://escopo.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; relatorio.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ebook &lt;strong&gt;"Web Security Audit na Prática"&lt;/strong&gt; (pt-BR) traz o checklist completo de 70+ pontos, os modelos de achado e a metodologia em 5 fases — amostra grátis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loja (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amostra grátis: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Segurança com papel assinado primeiro. Sempre. 🛡️&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>TLS hardening checklist: expiry, legacy protocols and weak ciphers (passive audit)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:00:06 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/tls-hardening-checklist-expiry-legacy-protocols-and-weak-ciphers-passive-audit-4lm2</link>
      <guid>https://dev.to/bryanrafaelbueno/tls-hardening-checklist-expiry-legacy-protocols-and-weak-ciphers-passive-audit-4lm2</guid>
      <description>&lt;p&gt;You don't need a scanner to catch most TLS failures. A &lt;strong&gt;passive&lt;/strong&gt; review of your certificate chain and protocol negotiation finds the issues clients (and auditors) care about:&lt;/p&gt;

&lt;h2&gt;
  
  
  What fails a TLS review
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Certificate expiring in &amp;lt; 14 days&lt;/strong&gt; (or already expired). Renewal must be automated — ACME clients are free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TLS 1.0 / 1.1 still accepted&lt;/strong&gt;. Legacy protocol support is a fast-track FAIL in any serious audit (PCI-DSS banned TLS 1.0 in 2018).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weak cipher suites&lt;/strong&gt; (&amp;lt; 128-bit, RC4, 3DES, CBC beasts). Modern stacks should negotiate AES-GCM/ChaCha20 only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No HSTS / short max-age&lt;/strong&gt;: transport security is only as strong as the enforcement header.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Checking without third-party tools
&lt;/h2&gt;

&lt;p&gt;Python's stdlib does all of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;
&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SSLContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROTOCOL_TLS_CLIENT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verify_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CERT_NONE&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ver&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TLSVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TLSVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TLSv1_1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TLSVersion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TLSv1_2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;minimum_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maximum_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ver&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wrap_socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yoursite.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;server_hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yoursite.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cipher&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&amp;gt; rejected (good)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt; CLI packages this (plus cert expiry via &lt;code&gt;ssl._ssl._test_decode_cert&lt;/code&gt;, headers, cookies, CORS, exposed files) into one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://yoursite.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; relatorio.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Baseline to adopt today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HSTS: &lt;code&gt;max-age=31536000; includeSubDomains; preload&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;TLS 1.2/1.3 only; AES-GCM/ChaCha20 ciphers&lt;/li&gt;
&lt;li&gt;Automatic renewal with 30-day buffer (Let's Encrypt + ACME)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full 70+ point checklist (transport, headers, sessions, API, auth, dependencies, CI/CD) is in my pt-BR ebook — free sample:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Free sample PDF: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>CORS misconfigurations: how to audit and fix them (passive checks included)</title>
      <dc:creator>Bryan Rafael</dc:creator>
      <pubDate>Sat, 05 Sep 2026 05:29:15 +0000</pubDate>
      <link>https://dev.to/bryanrafaelbueno/cors-misconfigurations-how-to-audit-and-fix-them-passive-checks-included-1jgl</link>
      <guid>https://dev.to/bryanrafaelbueno/cors-misconfigurations-how-to-audit-and-fix-them-passive-checks-included-1jgl</guid>
      <description>&lt;p&gt;CORS (Cross-Origin Resource Sharing) is one of the most misunderstood security features. A misconfigured CORS turns a browser into a free data-exfiltration proxy for any site that visits your API. Here's how to audit it &lt;strong&gt;passively&lt;/strong&gt; — no exploits, just reading headers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three deadly patterns
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Origin reflection&lt;/strong&gt;: the server echoes &lt;code&gt;Access-Control-Allow-Origin: &amp;lt;whatever the browser sent&amp;gt;&lt;/code&gt; instead of an allow-list. Any malicious site can read responses with the victim's cookies (if &lt;code&gt;Access-Control-Allow-Credentials: true&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wildcard + credentials&lt;/strong&gt;: &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; combined with credentials is rejected by modern browsers (good), but servers doing reflection with credentials are worse — the browser &lt;em&gt;does&lt;/em&gt; accept those.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;null origin&lt;/strong&gt;: sandboxed iframes and some redirects send &lt;code&gt;Origin: null&lt;/code&gt;; naive servers allow it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The passive check
&lt;/h2&gt;

&lt;p&gt;Send a normal GET with a hostile &lt;code&gt;Origin&lt;/code&gt; header and inspect the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Origin: https://evil.example.com"&lt;/span&gt; https://api.target.com/me
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Findings to flag:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Access-Control-Allow-Origin: https://evil.example.com&lt;/code&gt; → FAIL (reflection)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Access-Control-Allow-Credentials: true&lt;/code&gt; + reflected origin → FAIL (authenticated data leak)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; (no credentials) → WARN (non-authenticated data readable by any origin)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My CLI &lt;a href="https://github.com/bryanrafaelbueno/reconpp" rel="noopener noreferrer"&gt;reconpp&lt;/a&gt; runs both probes (&lt;code&gt;Origin: https://evil.example.org&lt;/code&gt; and &lt;code&gt;Origin: null&lt;/code&gt;) automatically, together with headers/TLS/cookies/сookie checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/bryanrafaelbueno/reconpp
reconpp &lt;span class="nt"&gt;-u&lt;/span&gt; https://api.target.com &lt;span class="nt"&gt;-f&lt;/span&gt; md &lt;span class="nt"&gt;-o&lt;/span&gt; relatorio.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Allow-list trusted origins explicitly — never echo the Origin header&lt;/li&gt;
&lt;li&gt;Don't use &lt;code&gt;*&lt;/code&gt; with credentials; don't reflect &lt;code&gt;null&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Vary on Origin when the resource is shared&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full 70+ point audit checklist (headers, TLS, sessions, API, auth, CI/CD) in my pt-BR ebook — free sample at the store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store (Pix): &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Free sample PDF: &lt;a href="https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf" rel="noopener noreferrer"&gt;https://bryanrafaelbueno.github.io/audit-br-store/sample.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
    </item>
  </channel>
</rss>
