<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'session.security.ini.php',
    1 => 'Seguridad de las configuraciones INI de sesi&oacute;n',
    2 => 'Seguridad de las configuraciones INI de sesi&oacute;n',
  ),
  'up' => 
  array (
    0 => 'session.security.php',
    1 => 'Sesiones y Seguridad',
  ),
  'prev' => 
  array (
    0 => 'features.session.security.management.php',
    1 => 'Gesti&oacute;n b&aacute;sica de sesiones',
  ),
  'next' => 
  array (
    0 => 'ref.session.php',
    1 => 'Funciones de sesi&oacute;n',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Seguridad de las configuraciones INI de sesión</h2>

  <p class="para">
   Al asegurar las configuraciones INI de sesiones, los desarrolladores
   pueden experimentar la seguridad de las sesiones. Muchas configuraciones
   INI no tienen una configuración recomendada. Los desarrolladores son
   responsables de la correcta configuración de las sesiones.
  </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">
     El valor <code class="literal">0</code> tiene un significado importante.
     Informa a los navegadores de no almacenar la cookie en un
     espacio de almacenamiento permanente. También, cuando el navegador se cierra,
     la cookie de identificación de sesión es eliminada inmediatamente.
     Si los desarrolladores definen un valor diferente de 0, permite
     a otros usuarios utilizar el identificador de sesión. La
     mayoría de las aplicaciones deben utilizar &quot;<code class="literal">0</code>&quot; como
     valor.
    </p>
    <p class="para">
     Si se desea una funcionalidad de auto-identificación, los desarrolladores
     deben implementar su propio sistema de auto-identificación seguro.
     No utilice identificadores de sesión de larga duración para esto.
     Para más información, consulte la sección adecuada de esta documentación.
    </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">
     Aunque las cookies HTTP sufren de problemas técnicos, siguen siendo
     la forma preferida de gestionar los identificadores de sesiones.
     Utilice solo cookies para la gestión de identificadores de sesiones
     cuando sea posible. La mayoría de las aplicaciones deben utilizar
     una cookie para el identificador de sesión.
    </p>
    <p class="para">
     Si <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>=Off,
     el módulo de sesión utilizará los valores del identificador
     de sesión definidos por las variables GET o POST proporcionadas,
     y la cookie del identificador de sesión no será inicializada.
    </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">
     Aunque la activación de <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     es obligatoria para la seguridad de las sesiones, esta directiva está
     desactivada por defecto.
    </p>
    <p class="para">
     Este modo evita que el módulo de sesión utilice un identificador de sesión
     no inicializado. Dicho de otra forma, el módulo de sesión solo va a aceptar
     identificadores de sesiones válidos generados por el módulo de sesión.
     Rechazará todos los identificadores de sesión proporcionados por los usuarios.
    </p>
    <p class="para">
     Debido a la especificación de cookies, los atacantes son capaces
     de colocar cookies que contienen identificadores de sesiones configurando
     localmente una base de datos de cookies o mediante inyecciones Javascript.
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> puede evitar que un atacante
     inicialice un identificador de sesión.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Los atacantes pueden inicializar un identificador de sesión con su
      propio dispositivo, y pueden definir el identificador de sesión
      de su víctima. Deben entonces mantener el identificador de sesión
      activo para poder abusar de él.
      Los atacantes deben pasar por muchos otros pasos para tener éxito en su ataque
      en este escenario. También, el uso de la directiva
      <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> permite limitar los riesgos.
     </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">
     Permite rechazar el acceso a una cookie de sesión desde javascript.
     Esta configuración evita que una cookie sea corrompida por una
     inyección Javascript.
    </p>
    <p class="para">
     Es posible utilizar un identificador de sesión como token CSRF, pero
     no es recomendado. Por ejemplo, fuentes HTML pueden ser
     guardadas y enviadas a otros usuarios.
     Los desarrolladores no deben escribir los identificadores de sesión en las
     páginas web por razones de seguridad. Todas las aplicaciones web deben
     utilizar el atributo httponly para la cookie que contiene el identificador de sesión.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      El token CSRF debe ser renovado periódicamente, al igual que el identificador
      de sesión.
     </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 acceder a la cookie de identificador de sesión únicamente cuando
     el protocolo es HTTPS. Si un sitio web solo es accesible por HTTPS,
     esta directiva debe ser activada.
    </p>
    <p class="para">
     HSTS debe ser utilizado para los sitios web accesibles solo por 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; o
     <a href="session.configuration.php#ini.session.cookie-samesite" class="link">session.cookie_samesite</a>=&quot;Strict&quot;
    </p>
    <p class="para">
     Desde PHP 7.3, el atributo <code class="literal">&quot;SameSite&quot;</code> puede ser definido
     para la cookie de identificador de sesión. Este atributo es una forma de
     mitigar los ataques CSRF (Cross Site Request Forgery).
    </p>
    <p class="para">
     La diferencia entre Lax y Strict es la accesibilidad de la cookie en las peticiones
     originadas de otros dominios empleando el método HTTP GET.
     Las cookies utilizando Lax serán accesibles mediante una petición GET originada
     de otro dominio, mientras que las cookies utilizando Strict no lo serán.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>=[elija el más pequeño posible]
    </p>
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a> es una configuración para eliminar
     el identificador de sesión obsoleto. Confiar
     completamente en esta configuración <em>no es</em> recomendado.
     Los desarrolladores deben gestionar la duración de las sesiones con un timestamp
     por ellos mismos.
    </p>
    <p class="para">
     La GC de sesiones (recolección de basura) es mejor realizada utilizando
     la función <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span>.
     La función <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span> debe ser ejecutada por un gestor
     de tareas; por ejemplo, un cron en los sistemas Unix.
    </p>
    <p class="para">
     GC es ejecutado por probabilidad, por defecto. Esta configuración
     <em>no garantiza</em> que las sesiones antiguas sean
     eliminadas. Aunque los desarrolladores no deben basarse en este parámetro,
     se recomienda definirlo con el valor más pequeño posible.
     Debe ajustarse las directivas <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
     y <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a> de modo que
     las sesiones obsoletas sean eliminadas con la frecuencia apropiada.
     Si la funcionalidad de auto-identificación es necesaria, los desarrolladores
     deben implementar su propia funcionalidad de auto-identificación segura;
     consulte a continuación para más información. Nunca utilice el identificador
     de sesión de larga duración para realizar este tipo de funcionalidad.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Algunos módulos de gestión de guardado de sesiones no utilizan esta
      funcionalidad basada en expiración y probabilidad; por ejemplo,
      memcached, memcache. Consulte la documentación de estos gestores
      de guardado de sesiones para más detalles.
     </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="simpara">
     La desactivación de la gestión transparente de identificadores de sesión
     permite asegurar un poco más los identificadores de sesión, eliminando la
     posibilidad de una inyección de identificador de sesión o la fuga de este
     identificador.
    </p>
    <div class="warning"><strong class="warning">Advertencia</strong>
     <p class="simpara">
      Habilitar <code class="literal">session.use_trans_sid</code> está obsoleto a partir
      de PHP 8.4.0.
     </p>
    </div>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      El identificador de sesión puede filtrarse desde URLs guardadas,
      URLs en emails, una fuente HTML guardada, etc...
     </p>
    </p></blockquote>
   </li>

   <li class="listitem">
    <p class="simpara">
     <a href="session.configuration.php#ini.session.trans-sid-tags" class="link">session.trans_sid_tags</a>=&quot;a=href,area=href,frame=src,form=&quot;
    </p>
    <p class="simpara">
     No deben reescribirse etiquetas HTML innecesarias. El valor por defecto es
     suficiente para la mayoría de los usos. Para versiones de PHP más antiguas,
     utilice en su lugar
     <a href="outcontrol.configuration.php#ini.url-rewriter.tags" class="link">url_rewriter.tags</a>.
    </p>
    <div class="warning"><strong class="warning">Advertencia</strong>
     <p class="simpara">
      Modificar <code class="literal">session.trans_sid_tags</code> respecto a su valor
      por defecto está obsoleto a partir de PHP 8.4.0.
     </p>
    </div>
   </li>

   <li class="listitem">
    <p class="simpara">
     <a href="session.configuration.php#ini.session.trans-sid-hosts" class="link">session.trans_sid_hosts</a>=&quot;&quot;
    </p>
    <p class="simpara">
     Este parámetro enumera los hosts para los que el identificador de sesión
     puede añadirse a las URL. Nunca deben añadirse hosts que no sean de
     confianza. Cuando está vacío, el módulo de sesión solo autoriza
     <code class="literal">$_SERVER[&#039;HTTP_HOST&#039;]</code>.
    </p>
    <div class="warning"><strong class="warning">Advertencia</strong>
     <p class="simpara">
      Establecer <code class="literal">session.trans_sid_hosts</code> a un valor no vacío
      está obsoleto a partir de PHP 8.4.0.
     </p>
    </div>
   </li>

   <li class="listitem">
    <p class="simpara">
     <a href="session.configuration.php#ini.session.referer-check" class="link">session.referer_check</a>=&quot;&quot;
    </p>
    <p class="simpara">
     Cuando el parámetro <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
     está activo, un valor no vacío reduce los riesgos de inyección de
     identificador de sesión: el identificador de sesión enviado por el cliente
     se descarta salvo que el encabezado <code class="literal">Referer</code> contenga ese
     valor. Tenga en cuenta que con HTTPS los navegadores no envían el
     encabezado <code class="literal">Referer</code>, y que los navegadores pueden
     omitirlo debido a su propia configuración. Por lo tanto, este parámetro no
     puede ser considerado como una medida fiable de seguridad.
    </p>
    <div class="warning"><strong class="warning">Advertencia</strong>
     <p class="simpara">
      Establecer <code class="literal">session.referer_check</code> a un valor no vacío
      está obsoleto a partir de PHP 8.4.0.
     </p>
    </div>
   </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">
     Asegura que el contenido HTTP no sea almacenado en caché para las sesiones
     autenticadas. Permite el almacenamiento en caché solo para los contenidos
     que no son privados. De lo contrario, el contenido será expuesto.
     El valor <code class="literal">&quot;private&quot;</code> debe ser empleado si el contenido HTTP no incluye
     datos sensibles desde un punto de vista de seguridad. Tenga en cuenta que <code class="literal">&quot;private&quot;</code>
     puede transmitir datos privados almacenados en caché para los clientes
     compartidos. <code class="literal">&quot;public&quot;</code> solo debe ser utilizado cuando el contenido HTML
     no contiene ningún dato privado.
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.save-path" class="link">session.save_path</a>=[directorio no legible por todos]
    </p>
    <p class="para">
     Si este parámetro está definido a un directorio accesible en lectura por todos,
     como <var class="filename">/tmp</var> (por defecto), otros usuarios del servidor
     serán capaces de recuperar las sesiones listando los archivos presentes
     en este directorio.
    </p>
   </li>

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