<?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 => 'features.session.security.management.php',
    1 => 'Gerencimento b&aacute;sico de sess&atilde;o',
    2 => 'Gerencimento b&aacute;sico de sess&atilde;o',
  ),
  'up' => 
  array (
    0 => 'session.security.php',
    1 => 'Sess&otilde;es e Seguran&ccedil;a',
  ),
  'prev' => 
  array (
    0 => 'session.security.php',
    1 => 'Sess&otilde;es e Seguran&ccedil;a',
  ),
  'next' => 
  array (
    0 => 'session.security.ini.php',
    1 => 'Protegendo as configura&ccedil;&otilde;es INI relacionadas &agrave; 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="features.session.security.management" class="sect1">
  <h2 class="title">Gerencimento básico de sessão</h2>

  <div class="sect2" id="features.session.security.management.basic">
   <h3 class="title">Segurança da sessão</h3>

   <p class="para">
    O módulo de sessão não garante que a informação armazenada
    em uma sessão seja visualizada apenas pelo usuário que criou a sessão. Medidas
    adicionais devem ser tomadas para proteger a confidencialidade
    da sessão, dependendo do valor associado à ela.
   </p>

   <p class="para">
    A importância dos dados carregados na sessão precisa ser
    avaliada e proteções adicionais podem ser disparadas; isso normalmente
    tem um preço, como alguns inconveninentes para o usuário.
    Por exemplo, para proteger os usuários de uma tática simples de engenharia social,
    a opção <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    precisa ser habilitada. Neste caso, os cookies devem obrigatoriamente estar habilitados
    no lado do cliente, ou as sessões não irão funcionar.
   </p>

   <p class="para">
    Existem várias maneiras de expor um ID de sessão existente para
    terceiros. Exemplos: injeção de JavaScript, ID de sessão nas URLs,
    interceptação de pacotes, acesso físico ao dispositivo, etc.
    Um ID de sessão exposto possibilita que terceiros tenham acesso a todos
    os recursos que estão associados a um ID específico. Primeiro, URLs que contenham
    IDs de sessão. Se houver ligações para um site ou recurso externo,
    a URL que contém o ID de sessão pode ser armazenada nos registros
    do site externo. Segundo, um atacante mais ativo pode interceptar
    o tráfego de rede. Caso não estejam criptografados, os IDs de sessão serão transmitidos
    em texto puro pela rede. A solução é implementar
    SSL/TLS no servidor e torná-lo obrigatório para os usuários.
    HSTS deve ser usado para uma melhor segurança.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Até mesmo o HTTPS não consegue proteger dados confidenciais em todos os momentos.
     Por exemplo, as vulnerabilidades &quot;CRIME&quot; e &quot;Beast&quot; podem permitir que um
     atacante leia os dados. Além disso, existem muitas redes que utilizam
     proxy HTTPS MITM com o propósito de auditoria.
     Atacantes também podem configurar um proxy semelhante.
    </span>
   </p></blockquote>

  </div>

  <div class="sect2" id="features.session.security.management.non-adaptive-session">
   <h3 class="title">Gerenciamento de sessão não adaptativo</h3>

   <p class="para">
    O gerenciador de sessão do PHP atualmente é adaptativo por padrão atualmente.
    Os gerenciadores de sessão adaptativos possuem riscos adicionais.
   </p>

   <p class="para">
    Quando <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> está habilitada
    e o manipulador de armazenamento de sessão suportá-la,
    um ID de sessão que não inicializado é rejeitado, e um novo é criado.
    Isso protege contra ataques que forçam o usuário a usar um ID de sessão conhecido.
    Atacantes podem colar links ou enviar e-mail que contém ID de sessão.
    Ex.: <code class="literal">http://example.com/page.php?PHPSESSID=123456789</code>, se
    <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a> estiver
    habilitado, a vítima iniciará uma sessão usando o ID de sessão fornecido
    pelo atacante.
    A opção <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    mitiga este risco.
   </p>

   <div class="warning"><strong class="warning">Aviso</strong>
    <p class="simpara">
     Um manipulador de armazenamento definido pelo usuário também pode suportar o modo de sessão estrita
     implementando validação do ID de sessão. Todos os manipuladores de armazenamento definidos pelo usuário
     devem implementar uma validação do ID de sessão.
    </p>
   </div>

   <p class="para">
    O cookie de ID de sessão pode ser definido usando os atributos domain, path, httponly e
    secure; e a partir do PHP 7.3, SameSite.
    
    Existe uma certa precedência que é definida pelos navegadores.
    Ao usar a precedência, o atacante pode definir um ID de sessão que
    pode ser usado permanentemente. O uso de
    <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    não resolverá essa questão.
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    mitiga este risco. Com
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On,
    um ID de sessão não inicializado será recusado.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Apesar da opção
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     diminuir o risco do gerenciamento de sessão adaptativo, um atacante pode forçar
     os usuários a usarem um ID de sessão inicializado e que foi criado pelo atacante.
     Por exemplo, com injeção de JavaScript.
     Esse tipo de ataque pode ser evitado seguindo as recomendações deste manual.
    </span>

    <span class="simpara">
     Ao seguir este manual, desenvolvedores devem habilitar a opção
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>,
     e também usa um gerenciamento de sessão baseado em timestamp e gerar novamente um ID de sessão usando
     <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> com os procedimentos recomendados.
     Se tudo isso for seguido, o ID de sessão gerado por um atacante
     eventualmente será deletado.
    </span>

    <span class="simpara">
     Quando ocorre um acesso à uma sessão obsoleta, todos os dados da sessão
     ativa devem ser salvos. Isso será útil para
     uma investigação mais tarde. Será feito logout forçado do usuário
     de todas as sessões, ou seja, o usuário será obrigado a se autenticar novamente.
     Desta forma se evita que atacantes abusem de sessões roubadas.
    </span>
   </p></blockquote>

   <div class="warning"><strong class="warning">Aviso</strong>
    <p class="simpara">
     O acesso aos dados de sessões obsoletas nem sempre é por causa de ataques.
     Redes instáveis e/ou remoção imediata de sessão ativa
     farão com que usuários legítimos usem sessões obsoletas.
    </p>
   </div>

   <p class="para">
    A partir do PHP 7.1.0, <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> foi adicionado.
    Essa função poderia ser usada para adicionar o ID do usuário como prefixo no ID de sessão para
    acessar a sessão ativa do usuário de forma eficiente. Habilitar
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    é muito importante nesta configuração. Caso contrário, usuários mal intencionados podem definir
    IDs de sessão maliciosos para outros usuários.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Usuários de versões anteriores ao PHP 7.1.0 <em>devem</em> usar
     <abbr title="Cryptographically Secure PseudoRandom Number Generator">CSPRNG</abbr>, como por exemplo <var class="filename">/dev/urandom</var> ou
     <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span>, e funções de hash para gerar um
     novo ID de sessão. <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> possui
     detecção de colisão e gera o ID de sessão de acordo com as
     configurações INI de sessão.
     O uso de <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> é preferível.
    </span>
   </p></blockquote>

  </div>

  <div class="sect2" id="features.session.security.management.session-id-regeneration">
   <h3 class="title">Renovação do ID de sessão</h3>

   <p class="para">
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    é uma boa prevenção, mas não é o suficiente. Desenvolvedores devem usar
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> para a segurança da sessão.
   </p>

   <p class="para">
    A renovação do ID de sessão reduz o risco de roubo do ID de sessão, sendo assim,
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> deve ser chamada periodicamente.
    Por exemplo, a renovação do ID de sessão a cada 15 minutos para a segurança de conteúdos sensíveis.
    Mesmo se o ID de sessão for roubado, tanto a sessão do usuário legítimo
    quanto a do atacante terão expirados.
    Ou seja, o acesso do usuário ou do atacante
    irá gerar erro de acesso à sessão obsoleta.
   </p>

   <p class="para">
    O ID de sessão <em>deve</em> ser renovado quando o privilégios do usuário
    são elevados, por exemplo após o usuário se autenticar.
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> deve ser chamado antes de
    salvar as informações de autenticação em <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>.
    (<span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> salva os dados da sessão
    atual automaticamente com o intuito de salvar o timestamp/etc na sessão atual.)
    Assegure-se de que apenas a nova sessão contenha flag autenticada.
   </p>

   <p class="para">
    Desenvolvedores <em>não devem</em> depender da expiração do ID de sessão proveniente de
    <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>.
    Atacantes podem acessar o ID de sessão da vítima periodicamente para impedir que ele
    expire e para poder continuar explorando o ID, inclusive as sessões autenticadas.
   </p>

   <p class="para">
    Ao invés disso, desenvolvedores devem implementar um gerenciamento de sessão baseada em timestamp.
   </p>

   <div class="warning"><strong class="warning">Aviso</strong>
    <p class="simpara">
     Embora o gerenciador de sessão possa gerenciar o timestamp de forma transparente,
     essa funcionalidade não está implementada. Dados de sessões antigas devem ser mantidos até a execução do
     GC (coletor de lixo). Ao mesmo tempo, desenvolvedores devem assegurar-se de remover dados de sessões
     obsoletas. Porém, os desenvolvedores não devem remover dados de sessões ativas imediatamente.
     Isto é, <code class="code">session_regenerate_id(true);</code>
     e <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span> nunca devem ser chamados juntos para uma sessão ativa.
     Isso pode soar contraditório, mas é um requisito obrigatório.
    </p>
   </div>

   <p class="para">
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> <em>não</em>
    apaga sessão antiga por padrão.
    Uma sessão obsoleta e autenticada pode estar disponível para uso.
    Os desenvolvedores devem impedir que sessões desatualizadas sejam utilizadas por qualquer pessoa.
    Eles devem impedir acesso acesso aos dados de sessões obsoletas por conta própria utilizando timestamps.
   </p>

   <div class="warning"><strong class="warning">Aviso</strong>
    <p class="simpara">
     A remoção repentina de sessão ativa produz efeitos colaterais indesejados.
     A sessão pode desaparecer quando houver conexões concorrentes
     em uma aplicação web e/ou a rede estiver instável.
    </p>
    <p class="simpara">
     Possíveis acessos maliciosos também não podem ser detectados com a remoção imediata de sessões ativas.
    </p>
    <p class="simpara">
     Ao invés de remover a sessão antiga imediatamente,
     deve ser configurado, na <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>, um tempo curto (timestamp) para a expiração
     e proibir acesso aos dados da sessão (essa implementação é por contra própria).
    </p>
    <p class="simpara">
     O acesso aos dados de sessões antigas não deve ser bloqueado imediatamente depois de executar
     <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>. O acesso deve ser bloqueado
     um pouco depois, como por exemplo, alguns segundos depois para redes estáveis, como redes cabeadas,
     e alguns minutos depois para redes instáveis como celulares ou sem Wi-Fi.
    </p>
    <p class="simpara">
     Se um usuário tentar acessar uma sessão obsoleta (que já tenha expirado), o acesso deve ser proibido.
     É recomendável que seja removido o status de autenticação de todas as sessões do usuário,
     porque é provável que seja um ataque.
    </p>
   </div>

   <p class="para">
    O uso adequado de <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    e <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> poderia causar um ataque DoS pessoal
    por causa de cookies impossíveis de serem removidos e que foram configurados por atacantes. Quando isso acontecer,
    o desenvolvedor pode solicitar aos usuários que removam os cookies e avisá-los que podem existir
    problemas de segurança. Atacantes podem configurar cookies maliciosos via aplicações web vulneráveis,
    extensões maliciosas para navegadores, dispositivos comprometidos fisicamente, etc.
   </p>

   <div class="warning"><strong class="warning">Aviso</strong>
    <p class="simpara">
     Não interprete de forma equivocada o risco de DoS.
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On
     é obrigatório para a segurança geral do ID de sessão! É recomendável que todos os sites
     habilitem <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>.
    </p>
    <p class="simpara">
     DoS somente pode acontecer quando a conta está sob ataque. Uma vulnerabilidade de injeção
     de JavaScript na aplicação representa a causa mais comum.
    </p>
   </div>

  </div>

  <div class="sect2" id="features.session.security.management.session-data-deletion">
   <h3 class="title">Remoção dos dados de sessão</h3>

   <p class="para">
    Os dados de sessões obsoletas devem ser inacessíveis e removidos.
    O módulo de sessão atual não manipula isso muito bem.
   </p>

   <p class="para">
    É melhor remover os dados de sessões obsoletas o mais cedo possível.
    Ainda assim, sessões ativas não devem ser removidas imediatamente.
    Para preencher esses requisitos, o gerenciamento dos dados de sessões baseadas em timestamp
    deve ser implementado pelo próprio desenvolvedor.
   </p>

   <p class="para">
    Configure e gerencie um timestamp de expiração na $_SESSION.
    Bloqueie os acessos aos dados de sessões desatualizadas.
    Quando um acesso aos dados de uma sessão obsoleta for detectado,
    é aconselhável remover todos os status de autenticação das sessões dos usuários
    e forçá-los a refazer a autenticação. O acesso aos dados de uma sessão obsoleta pode ser
    um ataque. Para fazer isso, deve ser mantido um registro das sessões ativas por usuário.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     O acesso à uma sessão obsoleta pode ocorrer por causa de redes instáveis e/ou
     acessos concorrentes ao website. O servidor tenta definir um novo ID de sessão
     via cookie, mas o pacote que define o cookie (Set-Cookie) pode não ter chegado ao cliente por
     perda de conexão. Uma conexão pode gerar um novo ID de sessão executando
     <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>, mas uma outra conexão
     concorrente pode não ter pego ainda o novo ID de sessão.
     Além disso, o acesso aos dados da sessão obsoleta deve ser bloqueado algum tempo depois.
     Ou seja, o gerenciamento de sessão baseada em timestamp é necessário.
    </span>
   </p></blockquote>

   <p class="para">
    Em poucas palavras, dados de sessão não devem ser destruídos com
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> ou <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span>,
    mas timestamps dem ser utilizados para controlar o acesso aos dados da sessão.
    Deixe que <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span> remova os dados obsoletos do armazenamento de dados da sessão.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.session-locking">
   <h3 class="title">Sessão e Travamento dos dados</h3>

   <p class="para">
    Os dados de sessão são travados para evitar condição de corrida (data race) por padrão.
    A trava é necessária para manter os dados consistentes entre as requisições.
   </p>

   <p class="para">
    Contudo, o travamento pode ser abusado por um atacante para realizar um ataque DoS.
    Para diminuir os riscos de DoS por travamento de sessão, reduza o travamento.
    Use sessões somente leitura quando a alteração dos dados não for necessária.
    Use a opção &#039;read_and_close&#039; com <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>.
    <code class="code">session_start([&#039;read_and_close&#039;=&gt;1]);</code>
    Feche a sessão assim que você terminar de alterar $_SESSION,
    usando <span class="function"><a href="function.session-commit.php" class="function">session_commit()</a></span>.
   </p>

   <p class="para">
    O módulo de sessão atual <em>não</em>
    detecta modificações em $_SESSION enquanto a sessão está inativa.
    É responsabilidade do desenvolvedor não modificar a variável $_SESSION quando
    a sessão está inativa.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.active-sessions">
   <h3 class="title">Sessões ativas</h3>

   <p class="para">
    Os desenvolvedores devem manter um registro de sessões ativas por usuário.
    E notificar o usuário sobre quantas sessões ativas, de qual IP (e área),
    há quanto tempo a sessão está ativa, etc.
    O PHP não mantém um registro dessas informações. É o desenvolvedor quem deve manter.
   </p>

   <p class="para">
    Existem inúmeras formas de implementação.
    Pode ser configurado um banco de dados que mantém um registro
    dos dados necessários e armazena as informações nele.
    Como os dados de sessão são removidos pelo coletor de lixo, o desenvolvedor deve cuidar dos dados
    removidos para manter a consistência do banco de dados das sessões ativas.
   </p>

   <p class="para">
    Uma das implementações mais simples é prefixar o ID de sessão com o ID do usuário e
    armazenar as informações necessárias na $_SESSION.
    Muitos bancos de dados têm bom desempenho para selecionar o prefixo de uma string.
    Desemvolvedores PODEM usar <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> e
    <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> para isso.
   </p>

   <div class="warning"><strong class="warning">Aviso</strong>
    <p class="simpara">
     Nunca utilize informações confidenciais como prefixo.
     Se o ID do usuário for confidencial, considere a utilização
     de <span class="function"><a href="function.hash-hmac.php" class="function">hash_hmac()</a></span>.
    </p>
   </div>

   <div class="warning"><strong class="warning">Aviso</strong>
    <p class="simpara">
     Habilitar <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     é obrigatório para esse setup. Certifique-se de que essa opção esteja habilitada, caso contrário
     o banco de dados de sessões ativas pode ser comprometido.
    </p>
   </div>

   <p class="para">
    O gerenciamento de sessão baseada em timestamp é necessário para detectar acesso em sessões
    obsoletas. Quando um acesso à uma sessão obsoleta é detectado, as flags de autenticação devem ser
    removidas de todas as sessões ativas para esse usuário. Isso evita que atacantes
    explorem sessões roubadas.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.session-and-autologin">
   <h3 class="title">Sessão e login automático</h3>

   <p class="para">
    Desenvolvedores não devem utilizar ID de sessão de longa vida para o login automático, pois isso
    aumenta o risco de roubo da sessão. O login automático deve ser implementado
    pelo desenvolvedor.
   </p>

   <p class="para">
    Use um hash seguro de uso único como chave para o login automático usando
    <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>. Use um hash seguro e mais forte que SHA-2,
    como por exemplo, SHA-256 ou maior com dados randômicos provenientes de <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span>
    ou <var class="filename">/dev/urandom</var>.
   </p>

   <p class="para">
    Se o usuário não estiver autenticado, verifique se a chave de login automático é
    válida ou não. Se a chave é válida, autentique o usuário e configure uma nova chave
    &quot;one-time hash&quot; segura. Deve ser possível usar a chave de login automático apenas uma vez,
    ou seja, nunca reutilize uma chave de login automático; ao invés disso, sempre gere uma nova chave.
   </p>

   <p class="para">
    A chave de login automático é uma chave de autenticação de longa vida, portanto essa chave deve estar
    o mais protegida possível. Use os atributos de cookie path/httponly/secure
    para protegê-la. Ou seja, nunca transmita a chave de login automático
    a não ser que seja realmente necessário.
   </p>

   <p class="para">
    Desenvolvedores devem implementar funcionalidades que desabilitam login automático e removem
    cookies de login automático desnecessários.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.csrf">
   <h3 class="title">Ataques CSRF (Cross-Site Request Forgeries)</h3>

   <p class="para">
    Sessão e autenticação não protegem contra ataques CSRF. Os desenvolvedores
    devem implementar proteções contra CSRF por conta própria.
   </p>

   <p class="para">
    <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span> pode ser usada para proteção contra
    CSRF. Visite o manual para mais detalhes.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Versões do PHP anteriores à 7.2.0 utilizam o mesmo buffer de saída e as mesmas configurações INI
     que o recurso trans sid. Portanto, o uso de <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span>
     em versões do PHP anteriores à 7.2.0 não é recomendado.
    </span>
   </p></blockquote>

   <p class="para">
    A maioria dos frameworks para aplicações web tem suporte à proteção CSRF. Visite
    o manual do framework de sua aplicação para mais detalhes.
   </p>

   <p class="para">
    A partir do PHP 7.3, o atributo SameSite para cookies de sessão pode ser utilizado.
    É uma medida adicional que pode mitigar vulnerabilidades CSRF.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>