<?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>Forem: Daniel</title>
    <description>The latest articles on Forem by Daniel (@geekcom).</description>
    <link>https://forem.com/geekcom</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%2F240250%2Fc88e50fe-e142-4ed6-a187-ef87f3518124.png</url>
      <title>Forem: Daniel</title>
      <link>https://forem.com/geekcom</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/geekcom"/>
    <language>en</language>
    <item>
      <title>Autenticação offline de baixo custo</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Mon, 07 Jul 2025 20:54:04 +0000</pubDate>
      <link>https://forem.com/geekcom/autenticacao-offline-de-baixo-custo-1fb3</link>
      <guid>https://forem.com/geekcom/autenticacao-offline-de-baixo-custo-1fb3</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Imagine se você tivesse uma chave física para ler arquivos ultra secretos que foram endereçados apenas a você — e somente você pudesse acessá-los.&lt;/p&gt;

&lt;p&gt;Neste artigo técnico livre, quero apresentar um sistema de controle de acesso a arquivos locais baseado em &lt;strong&gt;identidade digital armazenada em um dispositivo físico&lt;/strong&gt;, onde a segurança se baseia principalmente no uso de &lt;strong&gt;criptografia assimétrica&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O dispositivo físico
&lt;/h2&gt;

&lt;p&gt;A peça central do sistema é um &lt;strong&gt;token USB criptográfico&lt;/strong&gt;. Dentro dele, gravamos uma identidade digital gerada com o software open source &lt;a href="https://keystore-explorer.org" rel="noopener noreferrer"&gt;KeyStore Explorer&lt;/a&gt;. Esse token funciona como uma &lt;strong&gt;chave privada protegida fisicamente&lt;/strong&gt;, que será usada para &lt;strong&gt;descriptografar dados locais sem expor a chave&lt;/strong&gt; — o que torna a operação extremamente segura.&lt;/p&gt;

&lt;p&gt;O dispositivo usado é o &lt;strong&gt;&lt;a href="https://lista.mercadolivre.com.br/starsign-crypto-usb-token-s#D[A:StarSign%20Crypto%20USB%20Token%20S]" rel="noopener noreferrer"&gt;StarSign Crypto USB Token S&lt;/a&gt;&lt;/strong&gt;, da G&amp;amp;D, um token certificado &lt;a href="https://www.entrust.com/pt/resources/learn/what-fips-140-2" rel="noopener noreferrer"&gt;FIPS 140-2 nível 3&lt;/a&gt;, que suporta criptografia &lt;a href="https://pt.wikipedia.org/wiki/RSA_(sistema_criptogr%C3%A1fico)" rel="noopener noreferrer"&gt;RSA &lt;/a&gt;de até 2048 bits e é compatível com o padrão &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/PKCS_11" rel="noopener noreferrer"&gt;PKCS#11&lt;/a&gt;&lt;/strong&gt; — uma interface universal para uso de módulos criptográficos em aplicações. Além disso, é um dispositivo de &lt;strong&gt;baixo custo&lt;/strong&gt;, o que torna toda a solução acessível.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na prática o token faz o seguinte:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Armazena com segurança uma identidade digital (incluindo a sua chave privada);&lt;/li&gt;
&lt;li&gt;Protege o acesso via &lt;strong&gt;PIN&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Garante que as operações de assinatura e descriptografia &lt;strong&gt;ocorram dentro do hardware&lt;/strong&gt;, sem expor a chave.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como funciona
&lt;/h2&gt;

&lt;p&gt;A ideia é simples e muito poderosa: os dados são &lt;strong&gt;criptografados com a chave pública&lt;/strong&gt; associada ao certificado auto assinado (ID digital) que está dentro do token. &lt;strong&gt;Somente o detentor do token físico&lt;/strong&gt; (e que conhece o PIN) pode descriptografar os arquivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fluxo de uso
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Você gera um par de chaves RSA (pública e privada) de até 2048 bits;&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;chave privada&lt;/strong&gt; é armazenada dentro do token USB;&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;chave pública&lt;/strong&gt; é usada para criptografar os arquivos;&lt;/li&gt;
&lt;li&gt;Para ler o conteúdo, é necessário:

&lt;ul&gt;
&lt;li&gt;Conectar o token ao computador;&lt;/li&gt;
&lt;li&gt;Informar o PIN;&lt;/li&gt;
&lt;li&gt;Executar o comando de descriptografia.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante:&lt;/strong&gt; Os arquivos criptografados podem ser armazenados, transportados ou enviados por e-mail — mas &lt;strong&gt;somente quem possui o token físico poderá abri-los&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Exemplos de uso
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Armazenamento seguro de &lt;em&gt;seed phrases&lt;/em&gt; (frases-semente) de carteiras de criptomoedas;&lt;/li&gt;
&lt;li&gt;Arquivos &lt;code&gt;.json&lt;/code&gt; com logins e senhas;&lt;/li&gt;
&lt;li&gt;Backups sensíveis, como configurações de sistemas;&lt;/li&gt;
&lt;li&gt;Informações privadas que &lt;strong&gt;não devem ser armazenadas na nuvem&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qual a novidade de tudo isso?
&lt;/h2&gt;

&lt;p&gt;Existem dispositivos no mercado que fazem algo semelhante ao que proponho aqui — mas &lt;strong&gt;nenhum é tão acessível quanto o StarSign Crypto USB Token S&lt;/strong&gt;. O objetivo ao compartilhar este artigo é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estimular o uso de &lt;strong&gt;criptografia assimétrica&lt;/strong&gt; de forma prática;&lt;/li&gt;
&lt;li&gt;Mostrar como uma solução de &lt;strong&gt;alta segurança pode ser barata e funcional&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Popularizar o uso de &lt;strong&gt;identidade digital offline com hardware acessível&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Neste artigo, mostrei uma forma prática e acessível de proteger dados pessoais com &lt;strong&gt;criptografia assimétrica e dispositivos físicos&lt;/strong&gt;. Essa abordagem dispensa serviços externos, autenticações em nuvem ou dependência de terceiros.&lt;/p&gt;

&lt;p&gt;Se você busca &lt;strong&gt;controle local, segurança real e simplicidade&lt;/strong&gt;,  essa pode ser a solução ideal para seus dados sensíveis.&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>nocloud</category>
    </item>
    <item>
      <title>Importando certificado SSL no cacerts, via KeyStore Explorer</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Mon, 06 Jan 2025 15:59:44 +0000</pubDate>
      <link>https://forem.com/geekcom/importando-certificado-ssl-no-cacerts-via-keystore-explorer-3a64</link>
      <guid>https://forem.com/geekcom/importando-certificado-ssl-no-cacerts-via-keystore-explorer-3a64</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. Baixe e instale o KeyStore Explorer&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesse o site oficial do KeyStore Explorer: &lt;a href="https://keystore-explorer.org/" rel="noopener noreferrer"&gt;https://keystore-explorer.org/&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Baixe a versão mais recente para o seu sistema operacional;&lt;/li&gt;
&lt;li&gt;Instale o programa seguindo as instruções do instalador.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Abra o arquivo cacerts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abra o KeyStore Explorer:&lt;/li&gt;
&lt;li&gt;Clique em File &amp;gt; Open.

&lt;ul&gt;
&lt;li&gt;Navegue até o arquivo cacerts do seu ambiente. O caminho padrão é:
sua_jdk\lib\security\cacerts;&lt;/li&gt;
&lt;li&gt;Insira a senha do keystore. &lt;em&gt;A senha padrão é changeit&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Obtenha o certificado&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Se você ainda não tiver o certificado, siga estes passos:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesse o site do endpoint HTTPS no navegador;&lt;/li&gt;
&lt;li&gt;Clique no cadeado ao lado da URL &amp;gt; Certificado &amp;gt; Exportar;&lt;/li&gt;
&lt;li&gt;Salve o certificado no formato PEM (.crt) ou DER (.cer).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Importe o certificado&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No KeyStore Explorer, clique com o botão direito na área em branco e selecione Import Trusted Certificate;&lt;/li&gt;
&lt;li&gt;Escolha o arquivo de certificado salvo (formato .crt ou .cer);&lt;/li&gt;
&lt;li&gt;Insira um alias para identificar o certificado no keystore;&lt;/li&gt;
&lt;li&gt;Clique em OK.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Salve as alterações no cacert&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Após importar o certificado, clique em File &amp;gt; Save para salvar as alterações no cacerts;&lt;/li&gt;
&lt;li&gt;Insira a senha novamente (changeit) para confirmar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Testar a configuração&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reinicie sua aplicação para garantir que ela carregue o cacerts atualizado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dicas e Cuidados&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Antes de fazer qualquer alteração, crie uma cópia de segurança do arquivo original;&lt;/li&gt;
&lt;li&gt;Se você alterar a senha do cacerts, atualize qualquer configuração da JVM que dependa dele;&lt;/li&gt;
&lt;li&gt;Certifique-se de que o certificado importado é o correto para o endpoint que deseja acessar.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>security</category>
      <category>keystore</category>
    </item>
    <item>
      <title>Protegendo seu servidor contra acessos indevidos</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Wed, 03 Feb 2021 16:08:30 +0000</pubDate>
      <link>https://forem.com/phpbrasil/protegendo-seu-servidor-contra-acessos-indevidos-3mac</link>
      <guid>https://forem.com/phpbrasil/protegendo-seu-servidor-contra-acessos-indevidos-3mac</guid>
      <description>&lt;p&gt;Se você precisa de segurança extra em um servidor Linux/Debian, e você sempre precisa, lá vai uma dica de ouro, desative acesso SSH por meio de senhas, assim você evitará qualquer ataque do tipo força bruta, vamos a prática.&lt;/p&gt;

&lt;h3&gt;
  
  
  No servidor
&lt;/h3&gt;

&lt;p&gt;Crie um par de chaves SSH;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-b&lt;/span&gt; 4096

Generating public/private rsa key pair.
Enter file &lt;span class="k"&gt;in &lt;/span&gt;which to save the key &lt;span class="o"&gt;(&lt;/span&gt;/home/pi/.ssh/id_rsa&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tecle enter para confirmar;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Created directory &lt;span class="s1"&gt;'/home/pi/.ssh'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie uma senha para sua chave SSH e confirme;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Enter passphrase &lt;span class="o"&gt;(&lt;/span&gt;empty &lt;span class="k"&gt;for &lt;/span&gt;no passphrase&lt;span class="o"&gt;)&lt;/span&gt;:
Enter same passphrase again:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chave foi gerada com sucesso, veja o resultado abaixo;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The key fingerprint is:
SHA256:oVHrP/nGj3umYFkKRvnC/SKk8nSgHmeZ/OTUAQS+gvs pi@raspberrypi
The key&lt;span class="s1"&gt;'s randomart image is:
+---[RSA 4096]----+
|      ..o        |
|     . o o       |
|      o *        |
|   .   B =       |
|  . . + S + .    |
|   . + B = B     |
|  . + O = @..    |
|   o B * o =o.o  |
|    E . o  .=*.  |
+----[SHA256]-----+
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaves SSH ficam salvas na pasta oculta &lt;code&gt;.ssh&lt;/code&gt; na raiz do seu usuário Linux, no meu caso estão em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/home/pi/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Digitando o comando &lt;code&gt;ls&lt;/code&gt; dá pra ver o seu par de chaves(pública, privada), do lado do servidor o trabalho está terminado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;id_rsa  id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  No cliente
&lt;/h3&gt;

&lt;p&gt;Autorize a sua máquina cliente a se conectar ao servidor sem precisar digitar uma senha, para isso vamos copiar a chave pública do cliente para dentro do servidor, e autorizar o acesso, basta um simples comando pra isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub | ssh pi@192.168.15.2 &lt;span class="s1"&gt;'mkdir -p ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na próxima etapa digite &lt;code&gt;yes&lt;/code&gt;, assim você está informando que reconhece o servidor;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The authenticity of host &lt;span class="s1"&gt;'192.168.15.2 (192.168.15.2)'&lt;/span&gt; can&lt;span class="s1"&gt;'t be established.
ECDSA key fingerprint is SHA256:g1gtgJgDd24rXR0KJTTBjdLUI+SX829GTwQ1CYgVCiQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Warning: Permanently added '&lt;/span&gt;192.168.15.2&lt;span class="s1"&gt;' (ECDSA) to the list of known hosts.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste momento um arquivo chamado &lt;code&gt;.ssh/authorized_keys&lt;/code&gt; será criado no servidor, esse arquivo tem a chave pública do cliente, indicando assim que o mesmo possui autorização de acesso ao servidor.&lt;/p&gt;

&lt;p&gt;Digite a senha do servidor;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pi@192.168.15.2&lt;span class="s1"&gt;'s password:
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conecte-se ao servidor;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &amp;lt;USERNAME&amp;gt;@&amp;lt;IP-ADDRESS&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No meu caso o comando será;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh pi@192.168.15.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pra mim a mensagem de boas-vindas foi a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Linux raspberrypi 5.4.83-v7+ &lt;span class="c"&gt;#1379 SMP Mon Dec 13 20:08:57 GMT 2020 armv7l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo final, o "pulo do gato"
&lt;/h3&gt;

&lt;p&gt;O último passo é desativar a autenticação por senha no servidor, para isso basta editar o arquivo com as configurações de ssh no servidor, use o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O arquivo será aberto e estará pronto para edição, apenas procure o seguinte trecho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#PasswordAuthentication yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edite o trecho removendo o comentário &lt;code&gt;#&lt;/code&gt; deixando assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PasswordAuthentication no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinicie o servidor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tudo certo, a partir de agora você não precisa mais digitar senhas para ter acesso ao servidor, e ainda garante que apenas acessos via SSH e autorizados serão aceitos, desta forma a segurança está garantida no seu servidor&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>linux</category>
    </item>
    <item>
      <title>Assinando commits com uma chave GPG</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Thu, 17 Dec 2020 16:16:02 +0000</pubDate>
      <link>https://forem.com/phpbrasil/assinando-commits-com-uma-chave-gpg-2hl3</link>
      <guid>https://forem.com/phpbrasil/assinando-commits-com-uma-chave-gpg-2hl3</guid>
      <description>&lt;p&gt;O Git tem a opção de assinar e verificar seus commits utilizando-se de chave GPG, para isso basta seguir os passos a seguir&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 1 - Gere uma nova chave GPG
&lt;/h4&gt;

&lt;p&gt;1 - Digite o comando para gerar a chave GPG;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --full-generate-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 - Selecione a opção: (1) RSA e RSA (padrão);&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Por favor selecione o tipo de chave desejado:
   (1) RSA e RSA (padrão)
   (2) DSA e Elgamal
   (3) DSA (apenas assinatura)
   (4) RSA (apenas assinar)
Sua opção? 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3 - Digite o maior comprimento(4096), para sua nova chave GPG;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RSA chaves podem ter o seu comprimento entre 1024 e 4096 bits.
Que tamanho de chave você quer? (3072) 4096
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 - Decida qual o prazo de expiração para sua chave;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Por favor especifique por quanto tempo a chave deve ser válida.
         0 = chave não expira
      &amp;lt;n&amp;gt;  = chave expira em n dias
      &amp;lt;n&amp;gt;w = chave expira em n semanas
      &amp;lt;n&amp;gt;m = chave expira em n meses
      &amp;lt;n&amp;gt;y = chave expira em n anos
A chave é valida por? (0) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5 - Confirme o tempo de expiração da chave;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A chave não expira nunca
Está correto (s/N)?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6 - Digite seu nome completo;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GnuPG precisa construir uma ID de usuário para identificar sua chave.

Nome completo: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7 - Digite seu email;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Endereço de correio eletrônico:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;8 - Crie um comentário para sua chave caso seja necessário;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Comentário: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;9 - Confirme as informações que você acabou de preencher, basta digitar o para OK;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Você selecionou este identificador de usuário:
    "Joao Ninguem &amp;lt;joao@ninguem.nada&amp;gt;"

Muda (N)ome, (C)omentário, (E)ndereço ou (O)k/(S)air?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;10 - Digite uma senha segura para sua chave GPG e confirme a senha;&lt;/p&gt;

&lt;p&gt;11 - Aguarde o processo de criação de sua chave finalizar;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Precisamos gerar muitos bytes aleatórios. É uma boa idéia realizar outra
atividade (digitar no teclado, mover o mouse, usar os discos) durante a
geração dos números primos; isso dá ao gerador de números aleatórios
uma chance melhor de conseguir entropia suficiente.
gpg: chave FD2B172CC4C9F3E4 marcada como plenamente confiável
gpg: revocation certificate stored as '/home/geekcom/.gnupg/openpgp-revocs.d/92518C10D23E004325112DB9FD2B172CC4C9F3E4.rev'
chaves pública e privada criadas e assinadas.

pub   rsa4096 2020-04-28 [SC]
      92518C10D23E004325112DB9FD2B172CC4C9F3E4
uid                      Joao Ninguem &amp;lt;joao@ninguem.nada&amp;gt;
sub   rsa4096 2020-04-28 [E]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste momento sua chave GPG foi gerado com sucesso, agora é necessário adiciona-la ao GitHub.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 2 - Adicionando uma chave GPG ao GitHub
&lt;/h4&gt;

&lt;p&gt;1 - Use o seguinte comando para listar a chave GPG privada que você acabou de criar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --list-secret-keys --keyid-format LONG joao@ninguem.nada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua &lt;code&gt;joao@ninguem.nada&lt;/code&gt; pelo e-mail que você usou para criar a chave.&lt;/p&gt;

&lt;p&gt;2 - Copie o ID da chave GPG que começa com sec. No exemplo a seguir, é FD2B172CC4C9F3E4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sec   rsa4096/FD2B172CC4C9F3E4 2020-04-28 [SC]
      92518C10D23E004325112DB9FD2B172CC4C9F3E4
uid                 [final] Joao Ninguem &amp;lt;joao@ninguem.nada&amp;gt;
ssb   rsa4096/AB9EC40EA9DE16E3 2020-04-28 [E]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3 - Exporte a chave pública desse ID (substitua pelo seu ID da chave da etapa anterior):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --armor --export FD2B172CC4C9F3E4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 - Por fim, copie a chave pública e adicione-a nas configurações do seu perfil do GitHub em &lt;code&gt;https://github.com/settings/keys&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 3 - Associando sua chave GPG ao Git
&lt;/h4&gt;

&lt;p&gt;1 -  Depois de criar sua chave GPG e adicioná-la à sua conta GitLab, é hora de informar ao Git qual chave usar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg --list-secret-keys --keyid-format LONG joao@ninguem.nada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua &lt;code&gt;joao@ninguem.nada&lt;/code&gt; pelo seu email.&lt;/p&gt;

&lt;p&gt;2 - Copie o ID da chave GPG que começa com sec. No exemplo a seguir, é FD2B172CC4C9F3E4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sec   rsa4096/FD2B172CC4C9F3E4 2020-04-28 [SC]
      92518C10D23E004325112DB9FD2B172CC4C9F3E4
uid                 [final] Joao Ninguem &amp;lt;joao@ninguem.nada&amp;gt;
ssb   rsa4096/AB9EC40EA9DE16E3 2020-04-28 [E]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3 - Diga ao Git que deseja usar essa chave para assinar os seus commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.signingkey FD2B172CC4C9F3E4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua FD2B172CC4C9F3E4 pelo ID da sua chave GPG.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 4 - Assinando commits com sua chave GPG
&lt;/h4&gt;

&lt;p&gt;Depois de criar sua chave GPG e adicioná-la à sua conta, você pode começar a assinar seus commits:&lt;/p&gt;

&lt;p&gt;1 - Continua como você costumava fazer, a única diferença é a adição da flag -S:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -S -m "mensagem do meu commit"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 - Digite a senha da sua chave GPG quando solicitada.&lt;/p&gt;

&lt;p&gt;A partir de agora seus commits podem assinados com sua chave GPG sempre que desejar, no GitHub você poderá ver que seus commits estão assinados.&lt;/p&gt;

</description>
      <category>security</category>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>Como o PHP lida com a questão da segurança</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Tue, 29 Sep 2020 19:04:28 +0000</pubDate>
      <link>https://forem.com/phpbrasil/como-o-php-lida-com-a-questao-da-seguranca-6l4</link>
      <guid>https://forem.com/phpbrasil/como-o-php-lida-com-a-questao-da-seguranca-6l4</guid>
      <description>&lt;h2&gt;
  
  
  O que é um problema de segurança?
&lt;/h2&gt;

&lt;p&gt;O time do PHP classifica como problemas de segurança, bugs que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permitem que os usuários executem ações não autorizadas;&lt;/li&gt;
&lt;li&gt;Cruzam os limites de segurança;&lt;/li&gt;
&lt;li&gt;Acessam dados que não deveriam ser acessíveis;&lt;/li&gt;
&lt;li&gt;Impactam severamente a acessibilidade ou desempenho do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O objetivo desta classificação é alertar os usuários e desenvolvedores sobre problemas que precisam ser tratados como prioridade.&lt;/p&gt;

&lt;h2&gt;
  
  
  O PHP é seguro
&lt;/h2&gt;

&lt;p&gt;Esta afirmação é possível com base no conhecimento do ciclo de vida de uma vulnerabilidade no PHP, em resumo o processo funciona assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma possível vulnerabilidade é reportada;&lt;/li&gt;
&lt;li&gt;Então ela é avaliada por alguém do time ou um contribuidor externo/você que está lendo;&lt;/li&gt;
&lt;li&gt;Acontecerá uma discussão sobre o suposto bug;&lt;/li&gt;
&lt;li&gt;O problema é resolvido;&lt;/li&gt;
&lt;li&gt;Uma versão menor (por exemplo: 7.4.9), é criada contendo a solução, depois é possível ver no log de mudanças tudo que foi resolvido;&lt;/li&gt;
&lt;li&gt;Novas versões, são criadas em média a cada 4 semanas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cuidando da segurança
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mantenha-se informado, fique atento aos materiais que a comunidade disponibiliza;&lt;/li&gt;
&lt;li&gt;Sempre que possível atualize a versão;&lt;/li&gt;
&lt;li&gt;Observe todos os outros aspectos de segurança (códigos, sistemas operacionais, configurações, infra estrutura e o fator humano/engenharia social).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Nenhum sistema é invulnerável, pois o fator humano sempre existirá. Entretanto é possível mitigar a maioria dos problemas que acontecem em softwares, mas isso requer um pouco de atenção e cuidados por parte de todos os envolvidos.&lt;/p&gt;

&lt;p&gt;Deixe nos comentários o que você acha disso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências e links úteis
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://bugs.php.net/" rel="noopener noreferrer"&gt;https://bugs.php.net/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://wiki.php.net/security" rel="noopener noreferrer"&gt;https://wiki.php.net/security&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.php.net/supported-versions.php" rel="noopener noreferrer"&gt;https://www.php.net/supported-versions.php&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.php.net/eol.php" rel="noopener noreferrer"&gt;https://www.php.net/eol.php&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>security</category>
    </item>
    <item>
      <title>Query Log Laravel, understanding what happens behind the “rags”.</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Tue, 01 Oct 2019 13:36:58 +0000</pubDate>
      <link>https://forem.com/geekcom/query-log-laravel-understanding-what-happens-behind-the-rags-iag</link>
      <guid>https://forem.com/geekcom/query-log-laravel-understanding-what-happens-behind-the-rags-iag</guid>
      <description>&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%2Fx2c1fd16hnsp8mz6fdp0.jpeg" 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%2Fx2c1fd16hnsp8mz6fdp0.jpeg" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So you’re writing some querys in Eloquent Laravel and suddenly someone asks what actually happens behind the “curtains” that involve the abstraction of your favorite Framework and you don’t know how to respond, find out how below.&lt;/p&gt;




&lt;h2&gt;
  
  
  knowing &lt;code&gt;getQueryLog() method&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This method has been available since version 4.2 of Laravel, meaning it is nothing new, but many developers are unaware. What he does is very simple; it generates a complete log with very interesting information about the behavior of a query, to use it’s simple, just look below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;API\Repositories&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;API\Repositories\Contracts\WorkoutPlanRepositoryInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;API\WorkoutPlan&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Validator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WorkoutPlanRepository&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;workoutPlanByUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;enableQueryLog&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nv"&gt;$workoutPlansByUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WorkoutPlan&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'workoutType'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fk_user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nf"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;getQueryLog&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;

    &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;select * from &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;workout_plan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; where &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;fk_user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bindings&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;time&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;4.57&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;select * from &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; where &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; in (?)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bindings&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;time&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;3.22&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;select * from &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;workout_type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; where &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;workout_type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; in (?, ?, ?)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bindings&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
          &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
          &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;time&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;3.55&lt;/span&gt;
     &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we have some &lt;strong&gt;really important&lt;/strong&gt; information for our application, our query was written using the &lt;a href="https://laravel.com/docs/5.5/eloquent-relationships#eager-loading" rel="noopener noreferrer"&gt;Eager Loading&lt;/a&gt; technique through the Laravel &lt;a href="https://laravel.com/api/5.6/Illuminate/Database/Eloquent/Builder.html#method_with" rel="noopener noreferrer"&gt;with ()&lt;/a&gt; method that defines the relationships that must be loaded.&lt;/p&gt;

&lt;p&gt;The first information is the query executed, note that we are executing three querys, the second information refers to the values ​​used in the querys, in our case values ​​for the &lt;strong&gt;where&lt;/strong&gt; and &lt;strong&gt;in&lt;/strong&gt; clauses &lt;strong&gt;,&lt;/strong&gt; and finally the time spent to “rotate” our search .&lt;/p&gt;

&lt;p&gt;After this article you will never be “awkward” when asked what happens when such a query is executed, I hope this tip will be useful for you until the next.&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
    </item>
  </channel>
</rss>
