<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Rafael de Paula Barbosa - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Rafael de Paula Barbosa - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 23 Jun 2026 20:19:51 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/rafael-de-paula/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como proteger suas conexões WebSocket ]]>
                </title>
                <description>
                    <![CDATA[ A web está crescendo em uma velocidade enorme. As aplicações para a web estão cada vez mais dinâmicas, imersivas e não exigem que o usuário recarregue a página para que ocorram atualizações. O suporte para tecnologias de comunicação de baixa latência como websockets também está em constante evolução. Websockets nos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-proteger-suas-conexoes-websocket/</link>
                <guid isPermaLink="false">641518ed450cb2052fa76de8</guid>
                
                    <category>
                        <![CDATA[ Programação ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael de Paula Barbosa ]]>
                </dc:creator>
                <pubDate>Thu, 25 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_OO2brLI8iR1wo8bJx7TKOg.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-secure-your-websocket-connections-d0be0996c556/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to secure your WebSocket connections</a>
      </p><p>A web está crescendo em uma velocidade enorme. As aplicações para a web estão cada vez mais dinâmicas, imersivas e não exigem que o usuário recarregue a página para que ocorram atualizações. O suporte para tecnologias de comunicação de baixa latência como websockets também está em constante evolução. Websockets nos permitem realizar comunicações em tempo real entre diferentes clients conectados a um mesmo servidor.<br><br>Muitas pessoas não sabem como proteger suas conexões websocket de alguns ataques comuns. Vamos ver quais são eles e o que você pode fazer para deixar seus websockets seguros.</p><h3 id="n-0-habilite-o-cors">Nº 0: Habilite o CORS</h3><p>WebSocket não possui CORS nativo. Isso significa que qualquer site pode se conectar com qualquer outro através de uma conexão websocket sem qualquer restrição! Eu não vou entrar em detalhes acerca dos motivos para que isso seja assim, mas uma maneira rápida de corrigir isso é verificar o cabeçalho de requisição <code>Origin</code> no handshake do WebSocket.<br><br>Claro, o cabeçalho de requisição Origin pode ser falsificado por um invasor, mas não importa, porque, para explorar isso, o invasor precisa falsificar o cabeçalho Origin no navegador da vítima. Navegadores modernos não permitem que códigos convencionais em JavaScript no navegador alterem o cabeçalho Origin.<br><br>Ademais, se você estiver autenticando usuários usando, preferencialmente, cookies, isso não será um problema (mais sobre esse assunto no tópico nº 4).</p><h3 id="n-1-implementando-taxa-de-limita-o">Nº 1: Implementando taxa de limitação</h3><p>A taxa de limitação é importante. Sem ela, <em>clients</em> podem – cientes ou não – realizar um ataque do tipo DoS (Denial of Service) no seu servidor. Em outras palavras, DoS significa que um único <em>client</em> está fazendo com que o servidor fique ocupado a ponto de não conseguir lidar com com outros <em>clients</em>.</p><p>Na maioria dos casos, é uma tentativa deliberada vinda de um invasor visando derrubar o servidor. Às vezes, uma implementação ruim no front-end também pode gerar um ataque DoS por <em>clients</em> normais.</p><p>Faremos uso do algoritmo do balde furado (em inglês, <em>leaky bucket</em> – o qual, aparentemente, é um algoritmo muito usado para implementação de redes) para implementar a taxa de limitação em nossos <em>websockets</em>.</p><p>A ideia é que você tenha um balde com um furo de tamanho fixo no fundo. Você começa colocando água nele e a água sai pelo buraco no fundo. Agora, se o balde receber mais água do que está sendo escoado por um longo período de tempo, em algum momento o balde ficará cheio e começará a vazar. É isso.</p><p>Agora, vamos entender como isso tem relação com nosso <em>websocket</em>:</p><p>A água é o tráfego do <em>websocket </em>enviado pelo usuário.</p><p>A água passa pelo buraco no fundo do balde. Isso significa que o servidor processou aquela requisição em particular com sucesso.</p><p>A água que está no balde e ainda não vazou é basicamente o tráfego pendente. O servidor processará esse tráfego depois. Isso pode ser também um tráfego em massa, ou seja, muito tráfego de uma vez só, contanto que o balde não vaze).</p><p>A água que está vazando é o tráfego descartado pelo servidor (muito tráfego proveniente de um único usuário).</p><p>O ponto aqui é que você tem que verificar a atividade do seu <em>websocket </em>e determinar esses números. Você estabelecerá um balde para cada usuário. Decidiremos o tamanho que o balde deve ter (tráfego o qual um único usuário poderá enviar durante o período específico) dependendo do tamanho do buraco ao fundo do balde (quanto tempo em média o seu servidor leva para processar uma única requisição <em>websocket</em>, digamos que salvando uma mensagem enviada pelo usuário em um banco de dados, por exemplo).</p><p>Essa é uma implementação simples que eu estou usando no <a href="https://codedamn.com/">codedamn</a> para implementar o algoritmo de balde furado para <em>websockets</em>. É em NodeJS, mas os conceitos são sempre os mesmos.</p><pre><code>if(this.limitCounter &gt;= Socket.limit) {
  if(this.burstCounter &gt;= Socket.burst) {
     return 'O balde está vazando'
  }
  ++this.burstCounter
  return setTimeout(() =&gt; {
  this.verify(callingMethod, ...args)
  setTimeout(_ =&gt; --this.burstCounter, Socket.burstTime)
  }, Socket.burstDelay)
}
++this.limitCounter</code></pre><p>Então, o que está acontecendo aqui? Basicamente, se o limite for alcançado tanto pelo limite de tráfego (que são constantes definidas), a conexão <em>websocket </em>cai. Caso contrário, após um certo tempo, resetaremos o contador de tráfego. Isso deixa espaço livre para outro tráfego em massa.</p><h3 id="n-2-restrinja-o-tamanho-da-carga">Nº 2: Restrinja o tamanho da carga</h3><p>Isso deve ser utilizado como um recurso do seu <em>framework </em>de <em>back-end</em>. Se o seu não tem, é hora de mudar para um melhor! Você deve limitar o tamanho máximo da mensagem que será enviada pelo seu <em>websocket</em>. Teoricamente, não há limite. Claro, é bem provável que receber uma carga muito grande congestionará essa instância de <em>websocket </em>específica e consumirá mais recursos do sistema do que deveria.</p><p>Por exemplo, se você está usando a biblioteca WS para Node para criar <em>websockets </em>no servidor, você pode usar a <a href="https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback">opção maxPayload</a> para especificar o tamanho máximo da carga em bytes. Se o tamanho da carga for maior que o definido, a biblioteca, nativamente, derrubará a conexão.</p><p>Não tente implementar isso por conta própria determinando o tamanho da mensagem. Não queremos ler a mensagem inteira na memória RAM do sistema. Se a mensagem for 1 byte acima do limite, descarte-a. Isso pode ser implementado pelo <em>framework </em>(que lidará com as mensagens como fluxo de bytes em vez de strings fixas).</p><h3 id="n-3-crie-um-protocolo-de-comunica-o-s-lido">Nº 3: Crie um protocolo de comunicação sólido</h3><p>Como agora você está em uma conexão duplex, você pode enviar qualquer coisa para o servidor. O servidor também pode enviar qualquer texto de volta para o <em>client</em>. Você pode precisar de um caminho para assegurar a comunicação efetiva entre os dois.</p><p>Você não pode enviar mensagens brutas se quiser escalar o aspecto das mensagens do seu site. Eu prefiro usar JSON, mas existem outros meios optimizados de configurar a comunicação. No entanto, considerando o JSON, é assim que um esquema básico de mensagens deve parecer em um site genérico:</p><p>Do <em>client </em>para o servidor (ou vice-versa):</p><pre><code>{ status: "ok"|"error", event: EVENT_NAME, data: &lt;dados de qualquer tipo&gt; }</code></pre><p>Agora, fica mais fácil para você validar eventos e formatos no <em>back-end</em>. Derrube a conexão imediatamente e registre o endereço de IP do usuário, caso o formato da mensagem for diferente. De modo algum o formato pode mudar, a menos que alguém esteja manualmente mexendo na sua conexão <em>websocket</em>. Se você está utilizando o Node, eu recomendo usar a <a href="https://github.com/hapijs/joi">biblioteca Joi</a> para as próximas validações de dados provenientes do usuário.</p><h3 id="n-4-autentique-os-usu-rios-antes-de-estabilizar-a-conex-o-ws">Nº 4: Autentique os usuários antes de estabilizar a conexão WS</h3><p>Se você está utilizando <em>websockets </em>para usuários autenticados, é uma ótima ideia permitir que apenas usuários autenticados estabeleçam com sucesso uma conexão <em>websocket</em>. Não permita que ninguém estabeleça uma conexão e espere que eles se autentiquem no próprio <em>websocket</em>. Primeiramente, estabelecer uma conexão <em>websocket </em>é sempre um pouco caro. Logo, você não quer que pessoas sem autorização acessem seu <em>websocket</em> e monopolizem as conexões que poderiam ser utilizadas por outras pessoas.</p><p>Para isso, quando estiver estabelecendo uma conexão no <em>front-end</em>, envie algum dado de autenticação para o <em>websocket</em>. Pode ser um header como <code>X-Auth-Token: &lt;token atribuído a este client no login&gt;</code>. Por padrão, <em>cookies </em>serão passados de qualquer jeito.</p><p>De novo, realmente depende da biblioteca que você está utilizando para implementar <em>websockets</em>. Se, contudo, você estiver usando Node e a WS, existe uma função chamada <a href="https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback">verifyClient</a> que te dá acesso às informações do objeto passado pela conexão <em>websocket</em> (assim como você tem acesso ao objeto req para solicitações HTTP).</p><h3 id="n-5-use-ssl-com-websockets">Nº 5: Use SSL com websockets</h3><p>Isso não é trivial, mas é necessário ser dito. Use wws:// em vez de ws://. Isso adiciona uma camada de segurança à sua conexão. Use um servidor como o Nginx para realizar proxy reverso nos <em>websockets</em> e habilitar SSL acima deles. Como configurar o Nginx será um tutorial à parte, eu vou deixar algumas diretivas que você precisa utilizar no Nginx para as pessoas que são familiarizadas com ele. <a href="http://nginx.org/en/docs/http/websocket.html">Mais informações aqui</a>.</p><pre><code>location /local-do-seu-websocket/ {
    proxy_pass ​http://127.0.0.1:1337;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}</code></pre><p>Aqui, assumimos que o seu servidor <em>websocket </em>está ouvindo na porta 1337 e que seus usuários estão conectados ao seu <em>websocket </em>assim:</p><pre><code>const ws = new WebSocket('wss://seusite.com/local-do-seu-websocket')</code></pre><p>Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
