¿Cómo se configura el uso de cookies HttpOnly en PHP?

93

¿Cómo puedo configurar las cookies en mi PHP appscomo HttpOnly cookies?

Scott Warren
fuente
stackoverflow.com/questions/528405/… Tiene la información de soporte del navegador.
Kzqai
2
@Tchalvak No, las respuestas actuales siguen siendo autorizadas. Nada ha cambiado desde 2008 con respecto a la configuración de cookies solo HTTP en PHP. Qué navegadores admiten cookies solo HTTP es una pregunta diferente, con una respuesta diferente.
Lanzz
Puede usar $cookie->setHttpOnly(true);con github.com/delight-im/PHP-Cookie
caw

Respuestas:

92
  • Para sus cookies , vea esta respuesta.
  • Para la cookie de sesión propia de PHP ( PHPSESSIDpor defecto), vea la respuesta de @ richie

Las funciones setcookie()y setrawcookie(), introdujeron el httponlyparámetro, en la era oscura de PHP 5.2.0, lo que lo hace agradable y fácil. Simplemente configure el séptimo parámetro en verdadero, según la sintaxis

Sintaxis de la función simplificada para mayor brevedad

setcookie(    $name, $value, $expire, $path, $domain, $secure, $httponly )
setrawcookie( $name, $value, $expire, $path, $domain, $secure, $httponly )

Ingrese los NULLparámetros que desea mantener como predeterminados. También puede considerar si debe configurar el secureparámetro.

También es posible utilizar la función anterior de nivel inferior header():

header( "Set-Cookie: name=value; httpOnly" );
Cheekysoft
fuente
Con los parámetros con nombre de PHP 8, finalmente podremos hacer que la set_cookiellamada sea menos detallada si no necesitamos establecer los otros parámetros. Por ejemplo set_cookie($name, $value, httponly: true).
Sygmoral
120

Para las propias cookies de sesión de PHP en Apache:
agregue esto a su configuración de Apache o.htaccess

<IfModule php5_module>
    php_flag session.cookie_httponly on
</IfModule>

Esto también se puede establecer dentro de un script, siempre que se llame antes session_start().

ini_set( 'session.cookie_httponly', 1 );
Richie
fuente
9
+1, ya que es bueno (por seguridad) tenerlo en su lugar en todo el servidor, pero en su lugar se agrega al php.ini.
Anthony Hatzopoulos
10
Tenga en cuenta que debe usarse php_flag en su lugar: "No use php_value para establecer valores booleanos. En su lugar, debe usar php_flag". php.net/manual/en/configuration.changes.php
Ondrej Machulda
@OndrejMachulda Cambiar php_valuea php_flagno funciona. Lo acabo de probar en mi servidor ..
Nate
6
@Nate: Al cambiar a php_flag, debe cambiar también el valor, a ono off, consulte el manual.
Ondrej Machulda
14

Tenga en cuenta que las cookies de sesión de PHP no se utilizan httponlyde forma predeterminada.

Para hacer eso:

$sess_name = session_name();
if (session_start()) {
    setcookie($sess_name, session_id(), null, '/', null, null, true);
}

Un par de puntos a destacar aquí:

  • Tienes que llamar session_name() antessession_start()
  • Esto también establece la ruta predeterminada en '/', que es necesaria para Opera pero que las cookies de sesión PHP tampoco lo hacen por defecto.

fuente
12
php.net/manual/en/function.session-set-cookie-params.php Se puede hacer automáticamente a través de la función PHP anterior en lugar de la codificación personalizada.
Ryaner
13

Tenga en cuenta que HttpOnly no detiene las secuencias de comandos entre sitios; en cambio, neutraliza un posible ataque, y actualmente solo lo hace en IE (FireFox expone las cookies HttpOnly en XmlHttpRequest y Safari no lo respeta en absoluto). Por supuesto, active HttpOnly, pero no pierda ni una hora de filtrado de salida y pruebas de fuzz en cambio.

tqbf
fuente
13
Esta situación puede haber cambiado desde el '08, ahora. Aquí hay una lista más actual / actualizada: stackoverflow.com/questions/528405/…
Kzqai
7
<?php
//None HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); 

//HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); 

?>

Fuente

Marius
fuente
5

Explicación aquí de Ilia ... 5.2 solo aunque

httpOnly soporte de marca de cookies en PHP 5.2

Como se indica en ese artículo, puede configurar el encabezado usted mismo en versiones anteriores de PHP

header("Set-Cookie: hidden=value; httpOnly");
Polsonby
fuente
5

Puede especificarlo en la función de establecer cookies consulte el manual de php

setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);
Re0sless
fuente
4

Puede usar esto en un archivo de encabezado.

// setup session enviroment
ini_set('session.cookie_httponly',1);
ini_set('session.use_only_cookies',1);

De esta forma, todas las cookies de sesiones futuras utilizarán httponly.

  • Actualizado.
Marius
fuente
2
Solo para su información session.use_only_cookies está activado por defecto en PHP> 5.3
Nic Cottrell
1
y correcto es que "todas las cookies de sesión futura " usarán httponly, no las personalizadas ...
qdev
2

La sintaxis correcta del comando php_flag es

php_flag  session.cookie_httponly On

Y tenga en cuenta que la primera respuesta del servidor establece la cookie y aquí (por ejemplo, puede ver la directiva "HttpOnly". Por lo tanto, para probar, elimine las cookies del navegador después de cada solicitud de prueba.

Mareg
fuente