<?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: Victor Zarzar</title>
    <description>The latest articles on DEV Community by Victor Zarzar (@victorzarzar).</description>
    <link>https://dev.to/victorzarzar</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%2F955878%2Fb80ca8fc-6be3-4d03-8578-19aaee194be0.jpeg</url>
      <title>DEV Community: Victor Zarzar</title>
      <link>https://dev.to/victorzarzar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/victorzarzar"/>
    <language>en</language>
    <item>
      <title>Certificados TLS com SAN (Subject Alternative Name) e suas utilidades em aplicações multidomínio</title>
      <dc:creator>Victor Zarzar</dc:creator>
      <pubDate>Tue, 13 Jan 2026 20:10:22 +0000</pubDate>
      <link>https://dev.to/victorzarzar/certificados-tls-com-san-subject-alternative-name-e-suas-utilidades-em-aplicacoes-multidominio-i2j</link>
      <guid>https://dev.to/victorzarzar/certificados-tls-com-san-subject-alternative-name-e-suas-utilidades-em-aplicacoes-multidominio-i2j</guid>
      <description>&lt;p&gt;Ao solicitar ou emitir um certificado TLS/SSL atualmente, existe um campo obrigatório e fundamental chamado &lt;strong&gt;Subject Alternative Name (SAN)&lt;/strong&gt; — Nome Alternativo do Sujeito.&lt;/p&gt;

&lt;p&gt;Na prática, o SAN define quais nomes de host, domínios ou endereços IP aquele certificado é autorizado a proteger. Desde a descontinuação do uso exclusivo do Common Name (CN) pelos navegadores modernos, o SAN passou a ser o único mecanismo válido para validação de domínio em certificados TLS.&lt;/p&gt;

&lt;p&gt;É justamente esse campo que viabiliza os chamados &lt;strong&gt;certificados multidomínio (SAN)&lt;/strong&gt;, permitindo que um único certificado proteja múltiplos domínios e subdomínios, inclusive domínios completamente distintos entre si.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que pode ser incluído em um SAN?
&lt;/h2&gt;

&lt;p&gt;Um certificado com SAN pode conter, por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domínios completos (&lt;code&gt;example.com&lt;/code&gt;, &lt;code&gt;www.example.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Subdomínios (&lt;code&gt;api.example.com&lt;/code&gt;, &lt;code&gt;admin.example.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Domínios diferentes no mesmo certificado (&lt;code&gt;example.com&lt;/code&gt;, &lt;code&gt;example.net&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Wildcards (&lt;code&gt;*.example.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Endereços IP (menos comum, mas possível em ambientes internos)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso torna o SAN extremamente útil em arquiteturas modernas, especialmente em ambientes com reverse proxy, containers, cloud, multi-tenant ou microserviços.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais formas de uso do Subject Alternative Name (SAN)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Proteger múltiplos domínios base com um único certificado
&lt;/h3&gt;

&lt;p&gt;Um erro comum é assumir que um certificado Wildcard resolve todos os cenários. Na realidade:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;*.example.com&lt;/code&gt; protege apenas subdomínios de primeiro nível&lt;/p&gt;

&lt;p&gt;Ele &lt;strong&gt;não&lt;/strong&gt; cobre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;example.com&lt;/code&gt; (domínio raiz)&lt;/li&gt;
&lt;li&gt;Domínios diferentes como &lt;code&gt;example.net&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com um certificado SAN, você pode combinar tudo isso em um único artefato:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;www.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;example.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;www.example.net&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é extremamente útil para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aplicações white-label&lt;/li&gt;
&lt;li&gt;Ambientes multi-tenant&lt;/li&gt;
&lt;li&gt;Sistemas que atendem múltiplos clientes com domínios próprios&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Hospedar múltiplos sites HTTPS no mesmo IP (Virtual Hosts)
&lt;/h3&gt;

&lt;p&gt;Antes do SNI (Server Name Indication), cada site HTTPS exigia um IP exclusivo. Hoje, com SNI + certificados SAN:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É possível hospedar vários sites HTTPS no mesmo endereço IP&lt;/li&gt;
&lt;li&gt;Um único servidor pode servir múltiplos domínios com segurança&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Servidores como Apache, Nginx e IIS lidam muito bem com certificados SAN, especialmente quando combinados com SNI.&lt;/p&gt;

&lt;p&gt;Esse cenário é comum em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servidores compartilhados&lt;/li&gt;
&lt;li&gt;Ambientes cloud com IPs limitados&lt;/li&gt;
&lt;li&gt;Gateways de entrada (Ingress, Load Balancers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Simplificação real da gestão de TLS/SSL
&lt;/h3&gt;

&lt;p&gt;Menos certificados significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menos renovações manuais ou automáticas&lt;/li&gt;
&lt;li&gt;Menos risco de expiração inesperada&lt;/li&gt;
&lt;li&gt;Menos configurações duplicadas&lt;/li&gt;
&lt;li&gt;Menos erros operacionais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em vez de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vários IPs&lt;/li&gt;
&lt;li&gt;Vários certificados&lt;/li&gt;
&lt;li&gt;Várias cadeias TLS diferentes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você centraliza tudo em um único certificado SAN, mantendo a configuração mais limpa, previsível e fácil de automatizar (especialmente com ACME / Let's Encrypt).&lt;/p&gt;

&lt;h2&gt;
  
  
  Observações importantes (Pontos críticos)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Limite de SANs:&lt;/strong&gt; Autoridades certificadoras impõem limites (por exemplo, 100 SANs por certificado).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Renovação impacta todos os domínios:&lt;/strong&gt; Se um domínio falhar na validação, a emissão inteira pode falhar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Revogação é global:&lt;/strong&gt; Se o certificado for comprometido, todos os domínios protegidos por ele são afetados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nem sempre é a melhor escolha:&lt;/strong&gt; Em ambientes muito grandes, pode ser mais seguro separar certificados por contexto ou aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando um certificado SAN faz mais sentido?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use SAN quando você tem:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infraestrutura compartilhada&lt;/li&gt;
&lt;li&gt;Vários domínios sob o mesmo controle&lt;/li&gt;
&lt;li&gt;Reverse proxies ou API Gateways&lt;/li&gt;
&lt;li&gt;Aplicações SaaS ou multi-tenant&lt;/li&gt;
&lt;li&gt;Forte automação de certificados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Evite SAN quando:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os domínios pertencem a donos diferentes&lt;/li&gt;
&lt;li&gt;Você precisa de isolamento forte por aplicação&lt;/li&gt;
&lt;li&gt;Existe risco operacional em falhas de renovação&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;O SAN (Subject Alternative Name) não é apenas um detalhe técnico, mas um elemento central na arquitetura TLS moderna. Ele permite reduzir complexidade, custos operacionais e pontos de falha, ao mesmo tempo em que se adapta perfeitamente a cenários de cloud, containers e aplicações distribuídas.&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>webdev</category>
      <category>ssl</category>
    </item>
    <item>
      <title># Regra de segurança no Android nativo com SharedPreferences</title>
      <dc:creator>Victor Zarzar</dc:creator>
      <pubDate>Tue, 16 Dec 2025 09:39:57 +0000</pubDate>
      <link>https://dev.to/victorzarzar/-regra-de-seguranca-no-android-nativo-com-sharedpreferences-15m7</link>
      <guid>https://dev.to/victorzarzar/-regra-de-seguranca-no-android-nativo-com-sharedpreferences-15m7</guid>
      <description>&lt;p&gt;Quando instalamos um aplicativo Flutter, por exemplo, no Android, &lt;strong&gt;por baixo dos panos o SharedPreferences é a base de persistência de dados&lt;/strong&gt;. Contudo, em alguns cenários ocorre um comportamento que pode gerar riscos de segurança: &lt;strong&gt;por padrão, determinados dados salvos no app podem ser restaurados automaticamente após a reinstalação&lt;/strong&gt;, mesmo depois de o usuário limpar o cache ou remover completamente o aplicativo.&lt;/p&gt;

&lt;p&gt;Esse comportamento acontece por conta do &lt;strong&gt;Android Auto Backup&lt;/strong&gt;, que pode restaurar dados do aplicativo a partir da conta Google do usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo prático
&lt;/h2&gt;

&lt;p&gt;No exemplo abaixo, é possível observar que informações previamente salvas continuam disponíveis após a reinstalação do aplicativo, o que pode ser problemático quando lidamos com dados sensíveis.&lt;/p&gt;

&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%2Fgdi3i27hh5zinjuyrswe.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%2Fgdi3i27hh5zinjuyrswe.png" alt=" " width="751" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como solucionar
&lt;/h2&gt;

&lt;p&gt;Uma abordagem simples e eficaz é &lt;strong&gt;controlar explicitamente quais arquivos do SharedPreferences podem ou não participar do processo de backup&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Criando a regra de backup
&lt;/h3&gt;

&lt;p&gt;No projeto Android, navegue até o seguinte caminho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android/app/src/main/res
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro de &lt;code&gt;res&lt;/code&gt;, crie uma pasta chamada &lt;code&gt;xml&lt;/code&gt; e, dentro dela, o arquivo &lt;code&gt;backup_rules.xml&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;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;full-backup-content&amp;gt;
    &amp;lt;include domain="sharedpref" path="." /&amp;gt;
    &amp;lt;exclude domain="sharedpref" path="device.xml" /&amp;gt;
&amp;lt;/full-backup-content&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todos os arquivos de &lt;code&gt;SharedPreferences&lt;/code&gt; são incluídos no backup.&lt;/li&gt;
&lt;li&gt;O arquivo &lt;code&gt;device.xml&lt;/code&gt; é explicitamente excluído, evitando que dados sensíveis sejam restaurados após a reinstalação do app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Aplicando a regra no AndroidManifest
&lt;/h3&gt;

&lt;p&gt;Em seguida, é necessário informar ao Android que o aplicativo deve usar essa regra personalizada. No arquivo &lt;code&gt;AndroidManifest.xml&lt;/code&gt;, ajuste a tag &lt;code&gt;&amp;lt;application&amp;gt;&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;&amp;lt;application
    android:label="Android APP"
    android:name="${applicationName}"
    android:icon="@mipmap/ic_launcher"
    android:allowBackup="true"
    android:fullBackupContent="@xml/backup_rules"&amp;gt;
&amp;lt;/application&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Ao definir regras explícitas de backup, você &lt;strong&gt;evita a restauração indevida de dados sensíveis&lt;/strong&gt;, aumenta o nível de segurança do aplicativo e garante maior controle sobre o ciclo de vida das informações do usuário. Essa prática é altamente recomendada, especialmente em aplicativos que lidam com autenticação, tokens ou identificadores únicos do dispositivo.&lt;/p&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>security</category>
    </item>
    <item>
      <title># Otimizando Imagens Docker: Boas Práticas para Builds Eficientes</title>
      <dc:creator>Victor Zarzar</dc:creator>
      <pubDate>Mon, 01 Dec 2025 22:04:45 +0000</pubDate>
      <link>https://dev.to/victorzarzar/-otimizando-imagens-docker-boas-praticas-para-builds-eficientes-5cj7</link>
      <guid>https://dev.to/victorzarzar/-otimizando-imagens-docker-boas-praticas-para-builds-eficientes-5cj7</guid>
      <description>&lt;p&gt;As imagens Docker são a base das aplicações containerizadas. No entanto, imagens grandes e ineficientes podem resultar em builds mais lentos, tempos maiores de implantação e aumento no uso de armazenamento. Otimizar imagens garante entregas mais rápidas, melhor desempenho e menor consumo de recursos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Efeitos de Imagens Grandes e Ineficientes na Implantação
&lt;/h2&gt;

&lt;p&gt;Imagens pesadas não apenas consomem mais espaço em disco, mas também aumentam o tempo de transferência na rede, o que é crítico em pipelines CI/CD e implantações em nuvem. Imagens eficientes tornam as operações mais ágeis e reduzem custos operacionais.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Uso de Imagens Base Slim
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Escolhendo Imagens Mínimas (Alpine, Variantes Slim)
&lt;/h3&gt;

&lt;p&gt;Comece com uma imagem base mínima ou "slim" para reduzir o excesso de pacotes. Por exemplo, em vez de usar python:3.10, considere python:3.10-slim ou alpine. Imagens mínimas removem pacotes e bibliotecas desnecessárias, resultando em imagens menores e mais seguras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduzindo Dependências Desnecessárias
&lt;/h3&gt;

&lt;p&gt;Instale apenas os pacotes e bibliotecas indispensáveis para sua aplicação. Evite incluir ferramentas de build ou arquivos de documentação na imagem final de runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Equilibrando Tamanho e Funcionalidade
&lt;/h3&gt;

&lt;p&gt;Embora imagens slim sejam pequenas, algumas aplicações podem exigir bibliotecas específicas. Escolha uma imagem base que equilibre tamanho reduzido e funcionalidade necessária, evitando erros em tempo de execução.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Multi-Stage Builds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O Que São Multi-Stage Builds
&lt;/h3&gt;

&lt;p&gt;Multi-stage builds permitem separar o ambiente de build do ambiente de runtime. Essa técnica possibilita incluir ferramentas de compilação em uma etapa e copiar apenas os artefatos finais para a imagem final, reduzindo drasticamente o tamanho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separando Ambientes de Build e Runtime
&lt;/h3&gt;

&lt;p&gt;No multi-stage:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1:&lt;/strong&gt; compila ou constrói a aplicação com todas as dependências necessárias.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2:&lt;/strong&gt; copia apenas o resultado final para uma imagem base menor, descartando ferramentas de build e arquivos intermediários.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo prático (Node.js + pnpm):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json pnpm-lock.yaml* ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pnpm &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pnpm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["pnpm", "run", "dev"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este modelo reduz bastante o tamanho final, eliminando ferramentas de build e reaproveitando cache de dependências via pnpm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo com Python Slim:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-slim&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PYTHONPATH=/app&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; alembic.ini .&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; ./entrypoint.sh .&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; [ "./entrypoint.sh" ]&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A imagem final permanece extremamente pequena, contendo apenas o runtime necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Como as Camadas Docker Afetam o Tamanho da Imagem
&lt;/h2&gt;

&lt;p&gt;Cada instrução no Dockerfile (RUN, COPY, ADD) cria uma camada. Apesar do cache, muitas camadas pequenas podem aumentar o tamanho total da imagem.&lt;/p&gt;

&lt;p&gt;Uma forma de otimizar é combinar comandos relacionados em um único RUN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt-get clean &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso gera uma única camada, mantendo a imagem menor.&lt;/p&gt;

&lt;p&gt;Além disso, sempre remova caches e arquivos temporários dentro do mesmo comando &lt;code&gt;RUN&lt;/code&gt;. Caso contrário, eles permanecem nas camadas anteriores e aumentam o tamanho final.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Otimização com .dockerignore
&lt;/h2&gt;

&lt;p&gt;O arquivo &lt;code&gt;.dockerignore&lt;/code&gt; impede que arquivos desnecessários sejam enviados ao contexto de build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo básico:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
.next
.tests
__pycache__
__pytest__
builds/
venv
logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso reduz drasticamente o contexto enviado para o Docker, acelerando o build e evitando camadas desnecessárias.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Cache de Forma Eficiente
&lt;/h2&gt;

&lt;p&gt;Podemos aproveitar o cache do Docker copiando primeiro os arquivos de dependências:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para Node:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json pnpm-lock.yaml ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Para Python:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As dependências só serão reprocessadas quando realmente mudarem.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Boas Práticas Gerais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use tags como DOCKER_TAG=1.0.0 ou IMAGE_VERSION=1.0.0 para rastrear versões e evitar confusão entre builds&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Faça auditorias periódicas com docker image ls e remova imagens antigas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integre otimizações no pipeline CI/CD para garantir builds consistentes, menores e mais rápidos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evite ferramentas de teste e documentação na imagem final de produção&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prefira imagens minimalistas sempre que possível&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Adotar essas boas práticas eleva o desempenho das aplicações, reduz custos operacionais e garante imagens compactas e eficientes para ambientes modernos e escaláveis. Multi-stage builds, uso de imagens slim, limpeza de camadas e .dockerignore são pilares essenciais para criar imagens com alta performance e fácil manutenção.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>webdev</category>
      <category>python</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A importância de gerenciar corretamente variáveis de ambiente (.env)</title>
      <dc:creator>Victor Zarzar</dc:creator>
      <pubDate>Sun, 23 Nov 2025 08:08:18 +0000</pubDate>
      <link>https://dev.to/victorzarzar/a-importancia-de-gerenciar-corretamente-variaveis-de-ambiente-env-4b5i</link>
      <guid>https://dev.to/victorzarzar/a-importancia-de-gerenciar-corretamente-variaveis-de-ambiente-env-4b5i</guid>
      <description>&lt;p&gt;O arquivo &lt;code&gt;.env&lt;/code&gt; é um dos mais sensíveis de qualquer projeto. Ele costuma armazenar informações críticas, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token de API&lt;/li&gt;
&lt;li&gt;URL de banco de dados&lt;/li&gt;
&lt;li&gt;JWT e Refresh Token de autenticação&lt;/li&gt;
&lt;li&gt;Chaves privadas&lt;/li&gt;
&lt;li&gt;Parâmetros de build e deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gerenciar corretamente esse arquivo é essencial para a segurança, organização e sustentabilidade do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Por que versionar o .env é extremamente perigoso?
&lt;/h2&gt;

&lt;p&gt;Mesmo que você remova o arquivo depois, o Git mantém o histórico — tanto no GitHub quanto no GitLab. Ou seja: &lt;strong&gt;se você comitar um &lt;code&gt;.env&lt;/code&gt; uma única vez, ele estará exposto para sempre no histórico do repositório.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O impacto disso pode ser devastador. Um &lt;code&gt;.env&lt;/code&gt; exposto permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesso direto a serviços externos&lt;/li&gt;
&lt;li&gt;Consumo de APIs com permissões elevadas&lt;/li&gt;
&lt;li&gt;Login indevido via token JWT&lt;/li&gt;
&lt;li&gt;Acesso completo ao banco de dados&lt;/li&gt;
&lt;li&gt;Reconstrução parcial da sua infraestrutura (engenharia reversa)&lt;/li&gt;
&lt;li&gt;Execução de rotas internas do backend, podendo até resultar em um ataque DDoS massivo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse tipo de vazamento é um dos incidentes mais comuns em repositórios públicos — e também um dos mais sérios.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Sempre use .gitignore para evitar possíveis vazamentos de dados
&lt;/h2&gt;

&lt;p&gt;Uma prática simples que evita muito prejuízo é inserir no &lt;code&gt;.gitignore&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;.env
*.env
.env.*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, qualquer arquivo de variável de ambiente fica protegido contra versionamento acidental.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Fluxos práticos usando tecnologias comuns no meu dia a dia
&lt;/h2&gt;

&lt;p&gt;A seguir, dois exemplos de boas práticas que utilizo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Flutter/Dart usando --dart-define
&lt;/h3&gt;

&lt;p&gt;No Flutter, podemos passar variáveis sensíveis no momento da build usando &lt;code&gt;--dart-define&lt;/code&gt;. O fluxo costuma ser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Antes da build, exportar as variáveis no terminal&lt;/li&gt;
&lt;li&gt;O CI/CD injeta secrets dinamicamente&lt;/li&gt;
&lt;li&gt;A aplicação recebe tudo via &lt;code&gt;--dart-define&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter build apk &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dart-define&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$API_URL&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dart-define&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dart-define&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;SENTRY_DSN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$SENTRY_DSN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa abordagem evita expor valores sensíveis. Além disso, reduz chances de engenharia reversa, pois os valores só existem no runtime ou no binário ofuscado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python + FastAPI usando Pydantic Settings v2
&lt;/h3&gt;

&lt;p&gt;O Pydantic Settings v2 é uma ótima forma de manipular os ambientes via .env.&lt;/p&gt;

&lt;p&gt;Ele permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipagem das envs&lt;/li&gt;
&lt;li&gt;Validação automática&lt;/li&gt;
&lt;li&gt;Defaults seguros&lt;/li&gt;
&lt;li&gt;Carregamento via Docker (env_file, environment etc.)&lt;/li&gt;
&lt;li&gt;Suporte limpo a ambientes dev e prod&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático (Dev + Prod):&lt;/strong&gt;&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;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic_settings&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseSettings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SettingsConfigDict&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_env_file&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ENVIRONMENT&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;development&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;production&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.env.prod&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.env.dev&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseSettings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;ACCESS_TOKEN_EXPIRE_MINUTES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

    &lt;span class="n"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

    &lt;span class="n"&gt;model_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SettingsConfigDict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;env_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;get_env_file&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;env_file_encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse padrão funciona muito bem com projetos que precisam rodar simultaneamente em dev, staging e produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Evite engenharia reversa e exposição acidental
&lt;/h2&gt;

&lt;p&gt;Versionar arquivos &lt;code&gt;.env&lt;/code&gt; expõe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estrutura da API&lt;/li&gt;
&lt;li&gt;Chaves privadas&lt;/li&gt;
&lt;li&gt;Senhas&lt;/li&gt;
&lt;li&gt;Configurações internas&lt;/li&gt;
&lt;li&gt;Insights sobre a arquitetura do projeto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com isso, alguém mal-intencionado pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identificar provedores utilizados&lt;/li&gt;
&lt;li&gt;Descobrir endpoints privados&lt;/li&gt;
&lt;li&gt;Simular requests com autenticação válida&lt;/li&gt;
&lt;li&gt;Acessar serviços internos&lt;/li&gt;
&lt;li&gt;Comprometer outros projetos conectados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse tipo de vazamento pode derrubar toda a infraestrutura, dependendo do que for exposto.&lt;/p&gt;

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

&lt;p&gt;Se prevenir no mundo do desenvolvimento software nunca é demais. E este artigo, aborda só a ponta do iceberg quando falamos de desenvolvimento seguro.&lt;/p&gt;

&lt;p&gt;Gerenciar corretamente variáveis de ambiente é algo extremamente importante: é parte fundamental da segurança, da organização e da saúde do projeto — especialmente em ambientes modernos que usam CI/CD, Docker e múltiplos ambientes (dev, staging, prod).&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>mobiledev</category>
      <category>security</category>
      <category>development</category>
    </item>
    <item>
      <title>Proteção em dispositivos móveis.</title>
      <dc:creator>Victor Zarzar</dc:creator>
      <pubDate>Sun, 18 Aug 2024 16:35:06 +0000</pubDate>
      <link>https://dev.to/victorzarzar/protecao-em-dispositivos-moveis-31ei</link>
      <guid>https://dev.to/victorzarzar/protecao-em-dispositivos-moveis-31ei</guid>
      <description>&lt;p&gt;Proteção de dispositivos móveis:&lt;/p&gt;

&lt;p&gt;Em 2023, um smartphone ou tablet se tornou algo indispensável em nossas vidas, presente no dia a dia. No entanto, com tantas funções e dados que esses dispositivos carregam, devemos nos preocupar com a segurança de nossos dados. Aqui estão algumas dicas essenciais:&lt;/p&gt;

&lt;p&gt;1 - Crie senhas com caracteres especiais, números e letras. Existem aplicativos como Keepass Touch, Keepassium, KeepassDroid, entre outros, que podem ajudar na gestão e proteção das suas senhas. Manter um arquivo de senha seguro é indispensável nos dias atuais.&lt;/p&gt;

&lt;p&gt;2 - Utilize o reconhecimento facial/biometria no seu dispositivo para garantir maior segurança, especialmente ao utilizar apps de bancos e outros aplicativos com dados sensíveis. Essas proteções estão disponíveis em dispositivos móveis desde o Android 4.0 e iOS 7, e o Face ID da Apple foi introduzido no iOS 11 em 2017.&lt;/p&gt;

&lt;p&gt;3 - Desative a localização do seu telefone ao tirar fotos, a menos que pretenda publicá-las em alguma rede social. Desativar a geolocalização evita que informações geográficas sejam armazenadas junto com as fotos. Atualmente, os aplicativos de redes sociais removem, por padrão, a geolocalização ao publicar uma foto.&lt;/p&gt;

&lt;p&gt;4 - Desative o Bluetooth e utilize-o somente quando necessário, pois pode ser uma porta de entrada para ataques de cibercriminosos.&lt;/p&gt;

&lt;p&gt;5 - Ao usar redes Wi-Fi públicas, utilize uma VPN (rede privada virtual) para proteger seus dados de serem expostos publicamente. A VPN criptografa todo o tráfego, garantindo sua segurança.&lt;/p&gt;

&lt;p&gt;6 - Tenha cuidado com as permissões concedidas aos aplicativos. Algumas permissões podem ser desnecessárias e podem ser usadas para coletar dados do usuário. Verifique atentamente as permissões antes de autorizar um aplicativo.&lt;/p&gt;

&lt;p&gt;7 - Mantenha seu dispositivo sempre atualizado com a última versão do software disponível. Dispositivos com versões desatualizadas podem ter vulnerabilidades que os cibercriminosos podem explorar para coletar dados.&lt;/p&gt;

&lt;p&gt;8 - Faça backups constantes em nuvem para garantir a proteção e o armazenamento seguro de suas informações em caso de roubo ou perda do dispositivo.&lt;/p&gt;

&lt;p&gt;9 - Ao trocar seu antigo dispositivo por um novo, certifique-se de fazer uma redefinição completa, apagando todos os seus dados do dispositivo antigo.&lt;/p&gt;

&lt;p&gt;10 - Tenha cuidado ao fazer downloads de aplicativos. Baixe aplicativos apenas de fontes confiáveis, como a App Store ou a Play Store, e verifique sempre as avaliações e críticas de outros usuários para identificar possíveis problemas e vulnerabilidades.&lt;/p&gt;

&lt;p&gt;11 - Habilite a autenticação de dois fatores sempre que possível em seus aplicativos. Isso adiciona uma camada extra de segurança para proteger seus dados.&lt;/p&gt;

&lt;p&gt;12 - Ativar o bloqueio automático da tela é uma boa prática para evitar o uso não autorizado do dispositivo, especialmente em casos de perda ou roubo.&lt;/p&gt;

&lt;p&gt;13 - Trate seu dispositivo móvel com o mesmo cuidado que trata sua carteira. Não o deixe em locais sem supervisão e entregue-o apenas em mãos de pessoas de confiança. Essa prática é fundamental para garantir a segurança de seus dados.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>security</category>
    </item>
    <item>
      <title>Autenticação Cookies HTTP, HTTP Only, JWT, LocalStorage e SessionStorage.</title>
      <dc:creator>Victor Zarzar</dc:creator>
      <pubDate>Sat, 20 Jul 2024 07:43:42 +0000</pubDate>
      <link>https://dev.to/victorzarzar/autenticacao-cookies-http-http-only-jwt-localstorage-e-sessionstorage-4b73</link>
      <guid>https://dev.to/victorzarzar/autenticacao-cookies-http-http-only-jwt-localstorage-e-sessionstorage-4b73</guid>
      <description>&lt;p&gt;1 - Um cookie de navegador representa uma informação de texto enviada pelo servidor de uma aplicação web e salva no navegador. Desta forma, um servidor pode, ao receber credenciais do usuário, gerar um ID "Token de acesso" único e enviar através de cookies.&lt;/p&gt;

&lt;p&gt;2 - Cookies são amplamente utilizados para armazenar informações em navegadores, podem conter dados sensíveis como sua informação de sessão, por isso devemos nos preocupar com seu armazenamento.&lt;/p&gt;

&lt;p&gt;3 - Cada navegador armazena seus cookies de forma diferente, seja em um banco de dados embutido, ou em arquivos de texto encriptados pelo sistema operacional.&lt;/p&gt;

&lt;p&gt;4 - Para visualizar os cookies de uma aplicação que estamos acessando, podemos usar as ferramentas de desenvolvedor, utilizando a tecla F12 ou clicando em "inspect", selecione a aba "Aplicativo" ou "Application" e no menu lateral, terá a parte de Cookies. São separados por domínio, onde sua aplicação hospeda no domínio X e envia um cookie de identificação de sessão. No código da aplicação há chamadas para um servidor que configura relatórios de acesso ao site.&lt;/p&gt;

&lt;p&gt;5 - Os cookies possuem alguns parâmetros, aqui estão alguns deles:&lt;/p&gt;

&lt;p&gt;Expires: Define a data e a hora de expiração do cookie. Se esse parâmetro não for definido, será configurado por default como um cookie de sessão, expirando quando o navegador for fechado.&lt;/p&gt;

&lt;p&gt;Max-Age: Similar ao Expires, ele também define quando um cookie vai expirar, mas em segundos.&lt;/p&gt;

&lt;p&gt;Domain: Define para qual host o cookie será enviado pelo navegador. Se esse parâmetro não for definido, o cookie será enviado somente para o host da URL atual, será enviado nas requisições para example.com e todos os seus sub-domínios.&lt;/p&gt;

&lt;p&gt;Path: Indica qual o caminho deve existir na URL para que o cookie seja enviado pelo navegador. Se o valor for /docs, o cookie será enviado para URLs como /docs, /docs/, /docs/web, mas não será enviado para URLs como /, /documentos, /pt-br/docs.&lt;/p&gt;

&lt;p&gt;Secure: Se esse parâmetro for definido, o cookie só será enviado em requisições HTTPS.&lt;/p&gt;

&lt;p&gt;HttpOnly: Proíbe o acesso ao cookie em questão através do JavaScript com document.cookie. Eles são enviados só para o servidor, ex: cookies que persistem sessões de servidor não precisam estar disponíveis para o JavaScript, e portanto a diretiva HttpOnly deve ser configurada.&lt;/p&gt;

&lt;p&gt;SameSite: Com os possíveis valores sendo Strict, Lax e None, controla se o cookie pode ser enviado em requisições feitas a partir de outros sites para o domínio do cookie.&lt;/p&gt;

&lt;p&gt;Strict: Apenas cookies para o endereço da URL que está sendo acessada são enviados. Faz com que a requisição inicial para uma aplicação não contenha os cookies com este parâmetro, já que estão vindo de outro domínio.&lt;/p&gt;

&lt;p&gt;Lax (opção padrão): Semelhante ao Strict, mas permite o envio dos cookies na requisição inicial. Isso permite que, por exemplo, o usuário mantenha a sessão ativa ao chegar no sistema através de um link externo.&lt;/p&gt;

&lt;p&gt;None: Significa que os cookies serão enviados mesmo se a requisição estiver vindo de outro endereço. Para usar este método, as versões mais recentes dos navegadores exigem que o parâmetro secure seja definido.&lt;/p&gt;

&lt;p&gt;JWT: Estratégia de autenticação para APIs em REST simples e segura. Trata-se de um padrão aberto para autenticações web, e é totalmente baseada em requisições JSON entre o cliente e o servidor. O cliente faz uma solicitação uma única vez ao enviar as credenciais de login e senha. O servidor valida as credenciais e, se tudo estiver certo, ele retorna para o cliente um JSON com um token que codifica dados de um usuário logado no sistema, e após receber o token, o cliente pode armazená-lo da forma que preferir, seja por LocalStorage, SessionStorage, Cookies e HttpOnly.&lt;/p&gt;

&lt;p&gt;LocalStorage: Usam o localStorage para armazenar variáveis temporárias. As alterações só estão disponíveis por janela (ou em navegadores como o Chrome e o Firefox). As alterações feitas são salvas e disponibilizadas para a página atual, bem como futuras visitas ao site na mesma janela, depois que a janela é fechada, o armazenamento é excluído. Os dados estão disponíveis somente dentro da janela / guia na qual foram definidos, e os dados não persistentes serão perdidos quando a janela / guia for fechada. Como o localStorage funciona na política de mesma origem, portanto os dados armazenados só estarão disponíveis na mesma origem.&lt;/p&gt;

&lt;p&gt;SessionStorage: É similar ao localStorage, a única diferença é que enquanto os dados armazenados no localStorage não expiram, os dados na sessionStorage têm seus dados limpos ao expirar a sessão da página. A sessão da página dura enquanto o navegador está aberto e se mantém no recarregamento da página. Funciona na política de mesma origem, portanto os dados armazenados só estarão disponíveis na mesma origem. Por fim, os dados não serão enviados de volta ao servidor para cada solicitação HTTP (HTML, imagens, JavaScript, CSS, etc.), reduzindo a quantidade de tráfego entre o cliente e o servidor.&lt;/p&gt;

&lt;p&gt;6 - Quais são as vulnerabilidades dos métodos LocalStorage e SessionStorage?&lt;/p&gt;

&lt;p&gt;Ambos os métodos têm problemas com segurança relacionados:&lt;/p&gt;

&lt;p&gt;Armazenamento local XSS - script entre sites&lt;br&gt;
Cookies CSRF - Falsificação de solicitação entre sites&lt;br&gt;
Vulnerabilidade XSS permitindo que um invasor injete um JavaScript em uma aplicação.&lt;br&gt;
Vulnerabilidade CSRF permitindo que um invasor execute ações em um site por meio de um usuário autenticado.&lt;br&gt;
Como contornar esta situação?&lt;/p&gt;

&lt;p&gt;Se o armazenamento local pode ser explorado por scripts de terceiros (como aqueles encontrados nas extensões de navegadores) e se a autenticação pode ser falsificada com cookies, onde é aceitável colocar o estado do cliente?&lt;/p&gt;

&lt;p&gt;Criptografia de Dados: Criptografe os dados sensíveis antes de armazená-los no localStorage ou sessionStorage e descriptografe-os apenas quando necessário. Você pode usar bibliotecas de criptografia confiáveis para fazer isso.&lt;/p&gt;

&lt;p&gt;Validação de Entrada: Sempre valide e sanitize (limpe) os dados antes de armazená-los. Isso ajuda a evitar a injeção de código malicioso ou dados corrompidos.&lt;/p&gt;

&lt;p&gt;Lógica de Expiração: Implemente uma lógica de expiração para os dados armazenados, especialmente no localStorage. Defina prazos de validade para os dados e remova-os automaticamente quando expirarem.&lt;/p&gt;

&lt;p&gt;Mínimo Necessário: Armazene apenas as informações estritamente necessárias. Não armazene dados sensíveis ou confidenciais no localStorage ou sessionStorage, a menos que seja absolutamente necessário.&lt;/p&gt;

&lt;p&gt;Utilize Cookies Seguros: Se você precisa de funcionalidades de autenticação, considere o uso de cookies seguros (HTTPS) e HttpOnly. Isso ajuda a proteger os cookies contra acesso não autorizado por meio de scripts do lado do cliente.&lt;/p&gt;

&lt;p&gt;Implemente um Modelo de Ameaça: Considere todas as possíveis ameaças à segurança ao projetar seu sistema e aplique medidas de segurança apropriadas. Isso pode incluir a restrição de acesso a certos dados, dependendo do contexto e do usuário.&lt;/p&gt;

&lt;p&gt;Gerenciamento de Tokens: Se estiver usando tokens de autenticação, como tokens JWT (JSON Web Tokens), siga as melhores práticas de segurança para gerenciá-los. Isso inclui proteger os segredos do servidor e definir expirações apropriadas para os tokens.&lt;/p&gt;

&lt;p&gt;Controle de Acesso: Implemente controle de acesso adequado em seu aplicativo para garantir que apenas usuários autorizados tenham acesso aos dados armazenados no localStorage ou sessionStorage.&lt;/p&gt;

&lt;p&gt;Monitoramento e Auditoria: Implemente registros e auditoria para rastrear quem acessa e modifica os dados armazenados. Isso pode ajudar na detecção de atividades suspeitas.&lt;/p&gt;

&lt;p&gt;Considerar Alternativas: Em alguns casos, pode ser mais seguro armazenar dados sensíveis no lado do servidor e apenas manter referências ou tokens no lado do cliente, reduzindo assim a exposição de informações confidenciais.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>development</category>
    </item>
  </channel>
</rss>
