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

  <div class="sect2" id="features.session.security.management.basic">
   <h3 class="title">Seguridad de sesiones</h3>
   <p class="para">
    El módulo de sesión no puede garantizar que la información almacenada
    en una sesión sea vista únicamente por el usuario que
    ha creado la sesión. Medidas adicionales son necesarias para
    proteger la confidencialidad de la sesión, según el valor
    que se le asigne.
   </p>

   <p class="para">
    La importancia de los datos almacenados en una sesión debe ser evaluada
    y protecciones adicionales pueden ser desplegadas;
    esto tiene obligatoriamente un costo como ser menos práctico para
    el usuario. Por ejemplo, para proteger a los usuarios
    de una táctica simple, la directiva <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    debe ser activada. En este caso, las cookies deben ser
    activadas obligatoriamente lado-cliente sino las sesiones no
    funcionarán.
   </p>

   <p class="para">
    Existen varias formas de divulgar identificadores de sesión a
    terceros. Por ejemplo, inyecciones Javascript, identificadores
    de sesión en las URLs, sniffing de paquetes, acceso físico
    al dispositivo, etc.
    Un identificador de sesión divulgado permite a un tercero acceder
    a todos los recursos asociados con dicho identificador. Primero,
    las URLs que contienen los identificadores de sesión. Si hay enlaces
    a sitios o recursos externos, la URL que incluye el identificador
    de sesión debe ser almacenada en los logs referrer del sitio externo.
    Si estos datos no están cifrados, los identificadores de sesión
    serán transmitidos en texto plano por la red. La solución aquí es
    implementar SSL/TLS en el servidor y hacerlo obligatorio para los
    usuarios. HSTS debe ser utilizado para mejorar también la
    seguridad.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Incluso HTTPS no puede proteger la confidencialidad de los datos
     en todos los casos. Por ejemplo, las vulnerabilidades CRIME y BEAST
     permiten a un atacante leer los datos. Además, note
     que algunas redes utilizan proxys HTTPS MITM para
     auditorías. Los atacantes también pueden establecer este tipo de proxy.
    </span>
   </p></blockquote>

  </div>

  <div class="sect2" id="features.session.security.management.non-adaptive-session">
   <h3 class="title">Gestión de sesiones no adaptativas</h3>

   <p class="para">
    El gestor de sesiones de PHP es adaptativo, por defecto.
    Un gestor de sesiones adaptativo introduce
    riesgos adicionales.
   </p>

   <p class="para">
    Cuando <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    está activado, y el gestor de guardado de sesiones lo soporta,
    un identificador de sesión no inicializado es rechazado, y uno nuevo es creado.
    Esto previene un ataque que fuerza a los usuarios a utilizar un
    identificador de sesión conocido.
    Un atacante puede pasar enlaces o enviar emails que contienen
    el identificador de sesión.
    Por ejemplo: <code class="literal">http://example.com/page.php?PHPSESSID=123456789</code> si
    <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a> está activado,
    la víctima iniciará una sesión utilizando el identificador de sesión
    proporcionado por el atacante.
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    permite anular este tipo de riesgo.
   </p>

   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     Los gestores de guardado definidos por el usuario también pueden
     soportar el modo de sesión estricto implementando
     la validación de identificadores de sesión. Todos los gestores de
     guardado definidos por el usuario deben implementar la validación
     de identificadores de sesión.
    </p>
   </div>

   <p class="para">
    La cookie de identificador de sesión puede ser definida con los
    atributos domain, path, httponly, secure y, desde PHP 7.3, SameSite.
    Existe una prioridad definida por los navegadores.
    Utilizando las prioridades, un atacante puede definir el identificador de
    sesión que puede ser utilizado permanentemente. El uso de la
    directiva <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    no permite resolver este problema.
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    permite mitigar este riesgo. Con la directiva
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On,
    el identificador de sesión no inicializado será rechazado.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Aunque la directiva
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     limita los riesgos concernientes al gestor adaptativo de sesión, un
     atacante puede forzar a los usuarios a utilizar un identificador de
     sesión no inicializado que ha sido creado por el atacante, por ejemplo, mediante inyecciones
     Javascript. Este tipo de ataque puede ser limitado utilizando las
     recomendaciones de este manual.
    </span>

    <span class="simpara">
     Siguiendo este manual, los desarrolladores deben activar la directiva
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>,
     utilizar timestamps basados en el gestor de sesión,
     y regenerar los identificadores de sesión utilizando la función
     <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> con los procedimientos
     recomendados. Si los desarrolladores siguen estas instrucciones, un identificador de sesión
     generado por un atacante será normalmente eliminado.
    </span>

    <span class="simpara">
     Cuando ocurre un acceso a una sesión obsoleta, los desarrolladores
     deben guardar todas las datos de la sesión activa del
     usuario; estas informaciones serán útiles para futuras
     investigaciones. El usuario debe ser forzado a desconectarse
     de todas las sesiones, por ejemplo, forzándolo a identificarse de
     nuevo. Esto permite contrarrestar ataques utilizando sesiones robadas.
    </span>
   </p></blockquote>

   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     El acceso a una sesión obsoleta no significa necesariamente que se trate de una
     ataque. Una red inestable y/o la eliminación inmediata de la sesión
     activa hará que usuarios legítimos utilicen sesiones obsoletas.
    </p>
   </div>

   <p class="para">
    Desde 7.1.0, la función <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> ha sido
    añadida. Esta función permite acceder a todas las sesiones activas
    de un usuario prefijando los identificadores de sesión con el identificador
    del usuario. La activación de la directiva
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    es vital en esta configuración. De lo contrario, los usuarios maliciosos
    pueden definir identificadores de sesiones para otros usuarios.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Los usuarios de versiones anteriores a PHP 7.1.0 <em>deben</em>
     utilizar <abbr title="Cryptographically Secure PseudoRandom Number Generator">CSPRNG</abbr>, por ejemplo, <var class="filename">/dev/urandom</var>, o la función
     <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span> y las funciones de hash
     para generar un nuevo identificador de sesión. La función
     <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> posee mecanismos de detección
     de colisiones, y genera un identificador de sesión siguiendo las
     configuraciones INI de las sesiones. El uso de la función
     <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> es recomendado.
    </span>
   </p></blockquote>

  </div>

  <div class="sect2" id="features.session.security.management.session-id-regeneration">
   <h3 class="title">Regeneración de un identificador de sesión</h3>

   <p class="para">
    La directiva
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    es un buen compromiso pero no es suficiente. Los desarrolladores deben
    también utilizar la función <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>
    para la seguridad de las sesiones.
   </p>

   <p class="para">
    La regeneración de un identificador de sesión reduce el riesgo de robo de identificadores
    de sesión, por lo que la función <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>
    debe ser utilizada periódicamente; por ejemplo, regenerar el identificador de sesión cada
    15 minutos para asegurar contenido sensible. Incluso en el caso de que
    un identificador de sesión sea robado, tanto el usuario legítimo
    como el atacante tendrán su sesión que expirará. En otras palabras, el acceso
    al contenido por el usuario o el atacante generará un error de acceso
    a una sesión obsoleta.
   </p>

   <p class="para">
    Los identificadores de sesión <em>deben</em> ser regenerados cuando
    los privilegios del usuario son elevados, como después de una autenticación.
    La función <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> debe ser llamada
    antes de almacenar las informaciones de autenticación en <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>.
    (la función <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>
    guarda los datos de sesión actuales automáticamente para
    guardar timestamps/etc... en la sesión actual.)
    Asegúrese de que la nueva sesión contenga la bandera de autenticación.
   </p>

   <p class="para">
    Los desarrolladores <em>no deben</em> basarse en
    la expiración del identificador de sesión definida por la directiva
    <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>.
    Los atacantes pueden acceder al identificador de sesión de la víctima
    de forma periódica para evitar su expiración, y permitir su explotación
    incluyendo con sesiones autenticadas.
   </p>

   <p class="para">
    En su lugar, los desarrolladores deben implementar un timestamp
    basado en la gestión de datos de sesión.
   </p>

   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     Aunque el gestor de sesión puede manejar los timestamps de forma
     transparente, esta funcionalidad no está implementada. Los datos
     de las sesiones antiguas deben ser conservados hasta que el recuperador
     de memoria no haya pasado. Simultáneamente, los desarrolladores deben asegurarse
     ellos mismos de que los datos de sesión obsoleta sean efectivamente borrados.
     Sin embargo, los desarrolladores no deben borrar los datos
     de sesión activa demasiado rápido. Por ejemplo, <code class="code">session_regenerate_id(true);</code>
     y <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span> nunca deben ser llamados
     al mismo tiempo para una sesión activa. Esto puede parecer contradictorio,
     pero es un requisito del mandante.
    </p>
   </div>

   <p class="para">
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> <em>no borrará</em>
    las sesiones antiguas por defecto. Las sesiones autenticadas obsoletas
    pueden estar presentes para ser utilizadas. Los desarrolladores deben asegurarse
    de que las sesiones antiguas no sean utilizadas por nadie.
    Deben prohibir el acceso a los datos de sesión obsoleta
    utilizando ellos mismos timestamps.
   </p>

   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     La eliminación repentina de una sesión activa produce efectos secundarios
     indeseables. Las sesiones pueden desaparecer cuando hay conexiones
     concurrentes en la aplicación web y/o cuando la red es inestable.
    </p>
    <p class="simpara">
     Los accesos potencialmente maliciosos son indetectables con la eliminación
     repentina de una sesión.
    </p>
    <p class="simpara">
     En lugar de eliminar las sesiones obsoletas inmediatamente, los desarrolladores
     deben definir un corto tiempo de expiración (timestamp) en
     <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>, y prohibir el acceso a los datos de sesión.
    </p>
    <p class="simpara">
     Los desarrolladores no deben prohibir el acceso a los datos de las
     sesiones antiguas inmediatamente después de la ejecución de la función
     <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>. El acceso debe ser prohibido
     en una etapa posterior; por ejemplo, unos segundos después para redes
     estables, como una red cableada y unos minutos después para redes
     inestables como teléfonos móviles o redes Wi-Fi.
    </p>
    <p class="simpara">
     Si un usuario accede a una sesión obsoleta (sesión expirada), el acceso
     a esta sesión debe ser rechazado. También es recomendado borrar el
     estado de autenticación de todas las sesiones de usuario, ya que esto
     puede representar un eje de ataque.
    </p>
   </div>

   <p class="para">
    El uso de la directiva <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a> y de la función
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> pueden causar un DoS personal
    con cookies no eliminadas definidas por los atacantes. En este caso,
    los desarrolladores pueden invitar a los usuarios a eliminar las cookies
    y advertirles que pueden encontrar un problema de seguridad.
    Los atacantes pueden definir cookies maliciosas mediante una aplicación
    web vulnerable, un plugin de navegador expuesto o viciado, un dispositivo
    físico comprometido, etc...
   </p>

   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     No se confunda sobre el riesgo DoS. <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On
     es obligatorio para la seguridad de los identificadores de sesión !
     Todos los sitios son animados a activar la directiva
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>.
    </p>
    <p class="simpara">
     DoS solo puede ocurrir cuando la cuenta sufre un ataque. Una inyección
     Javascript en una aplicación representa la mayoría de los ejes de ataque.
    </p>
   </div>

  </div>

  <div class="sect2" id="features.session.security.management.session-data-deletion">
   <h3 class="title">Eliminación de datos de sesión</h3>

   <p class="para">
    Los datos de sesiones obsoletas deben ser inaccesibles
    y deben ser eliminados. El módulo actual de sesión
    no soporta este aspecto.
   </p>

   <p class="para">
    Los datos de sesiones obsoletas deben ser eliminados tan pronto
    como sea posible. Sin embargo, las sesiones activas no deben ser
    eliminadas instantáneamente. Para satisfacer estas recomendaciones, los desarrolladores
    mismos deben implementar un gestor de datos de sesión basado en
    timestamp.
   </p>

   <p class="para">
    Defina y gestione la expiración del timestamp en la variable
    global $_SESSION. Prohíba el acceso a los datos de sesiones
    caducadas. Cuando se detecte un acceso a datos de sesión obsoleta,
    debe eliminarse todo el estado autenticado de las sesiones
    de usuario y forzar a los usuarios a autenticarse de nuevo.
    El acceso a datos de sesiones obsoletas puede representar un ataque.
    Para lograr esto, los desarrolladores deben seguir todas las sesiones
    activas de todos los usuarios.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     El acceso a una sesión obsoleta también puede ocurrir debido a una red inestable
     y/o un acceso concurrente a un sitio web, por ejemplo, el servidor intenta definir un
     nuevo identificador de sesión mediante una cookie, pero el paquete Set-Cookie nunca
     llegó al cliente debido a una pérdida de conexión. Una conexión puede
     crear un nuevo identificador de sesión mediante la función <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>,
     pero otra conexión concurrente puede no haber recibido
     aún el identificador de sesión. Sin embargo, los desarrolladores deben prohibir el acceso
     a una sesión obsoleta en un momento más lejano. Por ejemplo, la gestión de sesiones
     basada en timestamp es obligatoria.
    </span>
   </p></blockquote>

   <p class="para">
    En resumen, los datos de sesiones no deben ser destruidos con la función
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>, ni con la función <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span>,
    pero los timestamps deben ser utilizados para controlar el acceso a los datos de
    sesión. Deje que la función <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span> elimine los datos obsoletos
    desde el almacenamiento de datos de sesiones.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.session-locking">
   <h3 class="title">Sesión y Bloqueo</h3>

   <p class="para">
    Los datos de sesión están bloqueados por defecto para evitar los
    accesos concurrentes. El bloqueo es obligatorio para mantener una
    consistencia de los datos de sesión a través de las peticiones.
   </p>

   <p class="para">
    Sin embargo, el bloqueo de sesión puede ser utilizado por los atacantes
    para realizar ataques DoS. Para minimizar el riesgo de un ataque DoS
    por bloqueo de sesión, debe minimizarse el uso de bloqueos.
    Utilice datos en modo solo lectura cuando los datos de sesión
    no necesiten ser actualizados. Utilice la opción &#039;read_and_close&#039;
    con la función <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> cerrará
    la sesión tan pronto como sea posible después de actualizar la variable
    global $_SESSION utilizando la función <span class="function"><a href="function.session-commit.php" class="function">session_commit()</a></span>.
   </p>

   <p class="para">
    El módulo de sesión actual <em>no detecta</em>
    todas las modificaciones de la variable $_SESSION cuando
    la sesión está inactiva. Es responsabilidad del desarrollador
    no modificar la variable $_SESSION cuando la sesión está inactiva.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.active-sessions">
   <h3 class="title">Sesiones activas</h3>

   <p class="para">
    Los desarrolladores deben mantener un registro de todas las sesiones
    activas de cada usuario, y notificarles el número de sesiones
    activas, desde qué dirección IP, desde cuándo, etc.
    PHP no mantiene registros de estas informaciones. Los desarrolladores
    están supuestos a hacerlo ellos mismos.
   </p>

   <p class="para">
    Existen diferentes formas de hacerlo. Una implementación posible
    es definir una base de datos que mantenga un registro de los datos
    necesarios, y almacenar todas las informaciones pertinentes.
    Dado que los datos de sesión son GCed, los desarrolladores deben
    tener cuidado con los datos GCed para mantener la base de datos
    de sesiones activas consistente.
   </p>

   <p class="para">
    Una de las implementaciones simples es &quot;el identificador de usuario prefijando
    el identificador de sesión&quot; y almacenar las informaciones necesarias en
    la variable $_SESSION. La mayoría de las bases de datos son relativamente
    eficientes para seleccionar un prefijo en forma de <span class="type"><a href="language.types.string.php" class="type string">string</a></span>.
    Los desarrolladores DEBEN utilizar la función <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>
    así como la función <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> para esto.
   </p>

   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     Nunca utilice datos confidenciales como prefijo.
     Si el identificador de usuario es confidencial, debería utilizar
     la función <span class="function"><a href="function.hash-hmac.php" class="function">hash_hmac()</a></span>.
    </p>
   </div>

   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     La activación de la directiva
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     es obligatoria para este tipo de configuración. Asegúrese de que
     esté activada. De lo contrario, la base de datos de sesiones activas
     puede ser comprometida.
    </p>
   </div>

   <p class="para">
    El gestor de sesión basado en timestamp es obligatorio
    para detectar el acceso a sesiones obsoletas. Cuando se detecte el acceso a una
    sesión obsoleta, la bandera de autenticación debe ser eliminada de todas las sesiones activas del usuario.
    Esto permite evitar que los atacantes continúen explotando las sesiones
    robadas.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.session-and-autologin">
   <h3 class="title">Sesión y auto-identificación</h3>

   <p class="para">
    Los desarrolladores no deben utilizar identificadores de sesión con una
    larga duración para la auto-identificación, ya que esto aumenta el riesgo
    de utilizar sesiones robadas. Una funcionalidad de auto-identificación
    debe ser implementada por el desarrollador.
   </p>

   <p class="para">
    Utilice una clave de hash segura de un solo uso como clave
    de auto-identificación utilizando la función
    <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>. Utilice un hash seguro
    más fuerte que SHA-2. Por ejemplo, SHA-256 o superior con datos
    aleatorios desde la función <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span>
    o mediante <var class="filename">/dev/urandom</var>.
   </p>

   <p class="para">
    Si el usuario no está autenticado, verifique si la clave de auto-identificación
    de un solo uso es válida o no. En el caso de que sea válida, autentifique
    al usuario y defina una nueva clave de hash segura de un solo uso.
    Una clave de auto-identificación solo debe ser utilizada una vez, por ejemplo, nunca utilice
    una clave de auto-identificación, y siempre regénela.
   </p>

   <p class="para">
    Una clave de auto-identificación es una clave de autenticación con una
    larga duración, debe ser protegida tanto como sea posible.
    Utilice los atributos de cookie path/httponly/secure/SameSite para protegerla.
    Por ejemplo, nunca transmita la clave de auto-identificación a menos que sea necesario.
   </p>

   <p class="para">
    Los desarrolladores deben implementar las funcionalidades que
    desactivan la auto-identificación, y eliminan las cookies
    que contienen las claves de auto-identificación no necesarias.
   </p>

  </div>

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

   <p class="para">
    Las sesiones y las autenticaciones no protegen contra los
    ataques CSRF. Los desarrolladores deben implementar protecciones
    CSRF ellos mismos.
   </p>

   <p class="para">
    La función <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span> puede ser utilizada para
    la protección CSRF. Consulte las páginas del manual para más detalles.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     PHP, antes de su versión 7.2.0, utiliza el mismo buffer de salida y las
     mismas configuraciones INI que la configuración trans-sid. Sin embargo, el uso
     de la función <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span> con versiones
     de PHP anteriores a 7.2.0 no es recomendado.
    </span>
   </p></blockquote>

   <p class="para">
    La mayoría de los frameworks de aplicaciones web soportan
    la protección CSRF. Consulte el manual de su
    framework de aplicación web para más detalles.
   </p>

   <p class="para">
    Desde PHP 7.3, el atributo SameSite de la cookie de sesión puede ser definido.
    Esto es una medida adicional que puede minimizar
    las vulnerabilidades CSRF.
   </p>

  </div>

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