<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/session.security.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'session.security.ini.php',
    1 => 'Protegendo as configura&ccedil;&otilde;es INI relacionadas &agrave; sess&atilde;o',
    2 => 'Protegendo as configura&ccedil;&otilde;es INI relacionadas &agrave; sess&atilde;o',
  ),
  'up' => 
  array (
    0 => 'session.security.php',
    1 => 'Sess&otilde;es e Seguran&ccedil;a',
  ),
  'prev' => 
  array (
    0 => 'features.session.security.management.php',
    1 => 'Gerencimento b&aacute;sico de sess&atilde;o',
  ),
  'next' => 
  array (
    0 => 'ref.session.php',
    1 => 'Fun&ccedil;&otilde;es para Sess&atilde;o',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'reference/session/security.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="session.security.ini" class="sect1">
  <h2 class="title">Protegendo as configurações INI relacionadas à sessão</h2>

  <p class="para">
   Ao proteger as configurações INI relacionadas à sessão, a segurança das sessões também aumenta.
   Algumas configurações INI importantes não possuem recomendações. O desenvolvedor
   é o responsável em garantir a segurança das configurações de sessão.
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-lifetime" class="link">session.cookie_lifetime</a>=0
    </p>
    <p class="para">
     <code class="literal">0</code> tem um sentido especial. Ele diz para o navegador não armazenar cookies no
     armazenamento permanente. Sendo assim, quando o navegador é encerrado, o cookie com o
     ID de sessão é deletado imediatamente. Se o desenvolvedor configurar um valor diferente de &quot;0&quot;, pode
     permitir que outros usuários utilizem o ID de sessão. A maioria das aplicações devem
     utilizar <code class="literal">0</code> para isto.
    </p>
    <p class="para">
     Se a funcionalidade de login automático é necessária,
     o desenvolvedor deve implementá-la por conta própria e de forma segura.
     Não utilize um ID de sessão de longa vida para isso.
     Mais informações podem ser encontradas acima na seção sobre este assunto.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-cookies" class="link">session.use_cookies</a>=On
    </p>
    <p class="para">
     <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>=On
    </p>
    <p class="para">
     Embora o cookie HTTP tenha alguns problemas,
     ele é o modo preferido para gerenciar o ID de sessão.
     Utilize apenas cookies para o gerenciamento do ID de sessão quando
     possível. A maioria das aplicações devem utilizar cookie para o ID de sessão.
    </p>
    <p class="para">
     Se <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>=Off,
     o módulo de sessão usará valores para o ID de sessão definidos por
     GET ou POST desde que o cookie de ID de sessão não tenha sido inicializado.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On
    </p>
    <p class="para">
     Contudo, habilitar
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     é obrigatório para sessões seguras. Essa opção está desabilitada por padrão.
    </p>
    <p class="para">
     Essa opção evita que o módulo de sessão utilize um ID de sessão que não tenha sido inicializado.
     Em outras palavras, o módulo de sessão aceita apenas ID de sessão válido
     e que tenha sido gerado pelo módulo de sessão.
     O módulo de sessão rejeita o ID caso ele tenha sido fornecido pelo usuário.
    </p>
    <p class="para">
     Por causa das especificações dos cookies, atacantes podem configurar cookies
     de ID de sessão indeletáveis por causa de configurações locais ou
     por injeção de JavaScript.
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> pode evitar que um ID de sessão
     inicializado por um atacante seja utilizado.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Atacantes podem inicializar um ID de sessão utilizando os próprios computadores e depois configurá-lo
      como o da vítima. No entanto, eles precisariam manter o ID de sessão ativo.
      Também seria necessário alguns passos adicionais para executar um ataque nesse cenário.
      Portanto, a opção
      <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
      funciona como prevenção.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-httponly" class="link">session.cookie_httponly</a>=On
    </p>
    <p class="para">
     Proíbe o acesso ao cookie de sessão através do JavaScript. Essa configuração
     evita o roubo de cookies por injeção de JavaScript.
    </p>
    <p class="para">
     É possível usar um ID de sessão como chave de proteção contra CSRF, mas isso não é recomendado.
     Por exemplo, o código HTML pode ser salvo e enviado para outros usuários.
     Os desenvolvedores não devem escrever o ID de sessão nas páginas, para evitar problemas de segurança.
     Quase todas as aplicações devem utilizar o atributo httponly para o cookie do ID de sessão.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      O token de proteção contra CSRF deve ser renovado periodicamente, exatamente como o ID de sessão.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-secure" class="link">session.cookie_secure</a>=On
    </p>
    <p class="para">
     Permite o acesso ao cookie de ID de sessão apenas quando o protocolo é HTTPS. Se
     seu website utiliza apenas HTTPS, então essa opção deve ser habilitada.
    </p>
    <p class="para">
     O uso de HSTS deve ser considerado em websites que utilizem apenas HTTPS.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-samesite" class="link">session.cookie_samesite</a>=&quot;Lax&quot; ou
     <a href="session.configuration.php#ini.session.cookie-samesite" class="link">session.cookie_samesite</a>=&quot;Strict&quot;
    </p>
    <p class="para">
     A partir do PHP 7.3 o atributo <code class="literal">&quot;SameSite&quot;</code> pode ser definido para o cookie de ID de sessão.
     Este atributo é uma forma de se mitigar ataques CSRF (Cross Site Request Forgery).
    </p>
    <p class="para">
     A diferença entre Lax e Strict é a acessibilidade do cookie em
     requisições que se original de outro domínio registrável empregando o método HTTP GET.
     Cookies usando Lax serão acessíveis em uma requisição GET originada de
     outro domínio registrável, enquanto que cookies que usam Strict não serão.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>=[choose smallest possible]
    </p>
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>
     é a configuração para remoção de ID de sessão obsoleta. Depender dessa configuração
     <em>não</em> é recomendado. O gerenciamento do tempo de vida da sessão deve ser feito utilizando timestamp e
     por contra própria.
    </p>
    <p class="para">
     É melhor que a coleta de lixo (garbage collection) da sessão seja feita pela função <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span>.
     <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span> é recomendada ser executada pelos gerenciadores de
     tarefas, como, por exemplo, cron em sistemas tipo Unix.
    </p>
    <p class="para">
     Por padrão, a coleta de lixo (GC) é executada por probabilidade.
     Essa configuração <em>não</em> garante a remoção de
     sessões antigas.
     Embora o desenvolvedor não possa depender dessa configuração,
     defini-la com o menor valor possível é recomendado.
     Ajuste
     <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
     e
     <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a> para
     que as sessões obsoletas sejam deletadas na frequência apropriada.
     Se a funcionalidade de login automático é necessária, o desenvolvedor deve
     implementá-la por contra própria e de forma segura, veja acima para mais informação.
     Nunca utilize ID de sessão de longa vida para isso.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Alguns módulos de manipuladores de armazenamento de sessão não utilizam essa configuração para
      a expiração baseada em probabilidade, como, por exemplo, memcached e memcache.
      Visite a documentação do manipulador de armazenamento de sessão para mais detalhes.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>=Off
    </p>
    <p class="para">
     O uso de gerenciamento transparente do ID de sessão não é proibido. Ele
     pode ser utilizado quando necessário. Contudo, desabilitar o gerenciamento transparente
     do ID de sessão melhora a segurança geral do ID de sessão, pois
     remove a possibilidade de injeção e vazamento do ID de sessão.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      O ID de sessão pode ser exposto através de uma URL salva nos Favoritos do navegador, uma URL enviada por e-mail ou mesmo caso o código-fonte HTML seja salvo.
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.trans-sid-tags" class="link">session.trans_sid_tags</a>=[tags limitadas]
    </p>
    <p class="para">
     (PHP 7.1.0 &gt;=) Desenvolvedores não devem reescrever tags HTML sem necessidade. A configuração padrão
     é suficiente para a maioria dos casos.
     Versões anteriores do PHP utilizam a configuração
     <a href="outcontrol.configuration.php#ini.url-rewriter.tags" class="link">url_rewriter.tags</a> para tal.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.trans-sid-hosts" class="link">session.trans_sid_hosts</a>=[hosts limitados]
    </p>
    <p class="para">
     (PHP 7.1.0 &gt;=) Essa configuração INI define uma lista de hosts que permitem a reescrita do recurso
     trans sid. Nunca adicione hosts que não sejam confiáveis.
     O módulo de sessão permite apenas o valor de <code class="literal">$_SERVER[&#039;HTTP_HOST&#039;]</code>
     quando essa configuração está vazia.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.referer-check" class="link">session.referer_check</a>=[sua URL de origem]
    </p>
    <p class="para">
     Quando
     <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
     estiver habilitada, o uso dessa opção é recomendado.
     Ela reduz o risco de injeção do ID de sessão. Se seu site é
     <code class="literal">http://example.com/</code>,
     defina essa opção como <code class="literal">http://example.com/</code>.
     Note que quando HTTPS é utilizado, o navegador não enviará o cabeçalho relacionado ao &quot;referer&quot;.
     O navegador também pode não enviar o &quot;referer&quot; dependendo da configuração.
     Portanto, essa configuração não é uma medida de segurança confiável.
     O uso desta configuração é recomendado.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cache-limiter" class="link">session.cache_limiter</a>=nocache
    </p>
    <p class="para">
     Certifique-se de que o conteúdo HTTP não é armazenado em cache para sessões autenticadas.
     Permita o armazenamento em cache apenas quando o conteúdo não é privado.
     Caso contrário, o conteúdo pode ser exposto.
     <code class="literal">&quot;private&quot;</code> pode ser usado se o conteúdo HTTP não
     incluir dados sensíveis/confidenciais.
     Note que <code class="literal">&quot;private&quot;</code> pode fazer com que dados privados
     sejam armazenados em cache em clientes compartilhados.
     <code class="literal">&quot;public&quot;</code> pode ser usado somente quando o conteúdo HTTP não
     contém dados privados e ou confidenciais.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.hash-function" class="link">session.hash_function</a>=&quot;sha256&quot;
    </p>
    <p class="para">
     (PHP 7.1.0 &lt;) Funções de hash mais fortes também geram um ID de sessão mais
     forte. Embora a colisão de hash é pouco provável até mesmo com MD5, desenvolvedores
     devem usar SHA-2 ou funções de hash ainda mais fortes para essa tarefa. Os desenvolvedores podem
     usar um hash mais forte como sha384 ou sha512. Certifique-se de informar um valor suficientemente
     longo em <a href="session.configuration.php#ini.session.entropy-length" class="link">entropy</a> para
     a função de hash usada.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.save-path" class="link">session.save_path</a>=[diretório não público]
    </p>
    <p class="para">
     Se for definido para um diretório público, como
     <var class="filename">/tmp</var> (o padrão), outros usuários no
     servidor podem ser capazes de sequestrar seções obtendo a lista de
     arquivos nesse diretório.
    </p>
   </li>

  </ul>
 </div><?php manual_footer($setup); ?>