Comment configurer l'utilisation des cookies HttpOnly en PHP

93

Comment puis-je définir les cookies dans mon PHP appsas HttpOnly cookies?

Scott Warren
la source
stackoverflow.com/questions/528405/... Contient les informations de support du navigateur.
Kzqai
2
@Tchalvak Non, les réponses actuelles font toujours autorité. Rien n'a changé depuis 2008 concernant la configuration des cookies HTTP uniquement en PHP. La question de savoir quels navigateurs prennent en charge les cookies HTTP uniquement est une question différente, avec une réponse différente.
lanzz du
Vous pouvez utiliser $cookie->setHttpOnly(true);avec github.com/delight-im/PHP-Cookie
caw

Réponses:

92
  • Pour vos cookies , consultez cette réponse.
  • Pour le cookie de session de PHP ( PHPSESSID, par défaut), voir la réponse de @ richie

Les fonctions setcookie()et setrawcookie(), ont introduit le httponlyparamètre, à l'époque sombre de PHP 5.2.0, ce qui rend cela agréable et facile. Définissez simplement le 7ème paramètre sur true, selon la syntaxe

Syntaxe de la fonction simplifiée pour plus de brièveté

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

Entrez NULLpour les paramètres que vous souhaitez conserver par défaut. Vous voudrez peut-être également déterminer si vous devez définir le secureparamètre.

Il est également possible d'utiliser l'ancienne header()fonction de niveau inférieur :

header( "Set-Cookie: name=value; httpOnly" );
Cheekysoft
la source
Avec les paramètres nommés de PHP 8, nous pourrons enfin rendre l' set_cookieappel moins verbeux si nous n'avons pas besoin de définir les autres paramètres. Par exemple set_cookie($name, $value, httponly: true).
Sygmoral
120

Pour les cookies de session PHP sur Apache:
ajoutez ceci à votre configuration Apache ou.htaccess

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

Cela peut également être défini dans un script, à condition qu'il soit appelé auparavant session_start().

ini_set( 'session.cookie_httponly', 1 );
Richie
la source
9
+1 car c'est une bonne chose (pour la sécurité) d'avoir en place sur l'ensemble de votre serveur, mais plutôt ajouté au php.ini.
Anthony Hatzopoulos
10
Veuillez noter que php_flag doit être utilisé à la place: "N'utilisez pas php_value pour définir des valeurs booléennes. Php_flag doit être utilisé à la place." php.net/manual/en/configuration.changes.php
Ondrej Machulda
@OndrejMachulda Le changement php_valueen php_flagne fonctionne pas. Je viens de l'essayer sur mon serveur ..
Nate
6
@Nate: Lorsque php_flagvous passez à , vous devez également changer la valeur - soit soit onsoit off- voir le manuel.
Ondrej Machulda
14

Notez que les cookies de session PHP ne sont pas utilisés httponlypar défaut.

Pour faire ça:

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

Quelques points à noter ici:

  • Vous devez appeler session_name() avantsession_start()
  • Cela définit également le chemin par défaut sur «/», ce qui est nécessaire pour Opera mais que les cookies de session PHP ne font pas non plus par défaut.

la source
12
php.net/manual/en/function.session-set-cookie-params.php Cela peut être fait automatiquement via la fonction PHP ci-dessus au lieu d'un codage personnalisé.
Ryaner
13

Sachez que HttpOnly n'arrête pas les scripts intersites; au lieu de cela, il neutralise une attaque possible, et ne le fait actuellement que sur IE (FireFox expose les cookies HttpOnly dans XmlHttpRequest, et Safari ne l'honorent pas du tout). Bien sûr, activez HttpOnly, mais ne perdez même pas une heure de filtrage de sortie et de test de fuzz dans le commerce pour cela.

tqbf
la source
13
Cette situation a peut-être changé depuis 2008, maintenant. Voici une liste plus actuelle / mise à jour: 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); 

?>

La source

Marius
la source
5

Vous pouvez le spécifier dans la fonction set cookie voir le manuel php

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

Vous pouvez l'utiliser dans un fichier d'en-tête.

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

De cette façon, tous les cookies de session futurs utiliseront httponly.

  • Actualisé.
Marius
la source
2
Juste pour info session.use_only_cookies est activé par défaut dans PHP> 5.3
Nic Cottrell
1
et il est correct que "tous les cookies de session futurs " utiliseront httponly, pas des cookies personnalisés ...
qdev
2

La bonne syntaxe de la commande php_flag est

php_flag  session.cookie_httponly On

Et soyez conscient, juste la première réponse du serveur, définissez le cookie et ici (par exemple, vous pouvez voir la directive "HttpOnly". Donc, pour tester, supprimez les cookies du navigateur après chaque demande de test.

Mareg
la source
0

Une solution plus élégante depuis PHP> = 7.0

session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);

session_start

options de session_start

Hein
la source