Browse Source

utiliser HTTPONLY pour le cookie de session, de maniere a ce qu'il ne soit pas possible de le voler en javascript

Approche proposee et codee par Christophe Imberti
Documentation: https://www.owasp.org/index.php/HttpOnly
spip-3-stable
Fil 11 years ago
parent
commit
0ca0948495
  1. 12
      ecrire/inc/auth.php
  2. 33
      ecrire/inc/cookie.php
  3. 8
      prive/formulaires/login.php

12
ecrire/inc/auth.php

@ -202,18 +202,10 @@ function auth_init_droits($row)
unset($GLOBALS['visiteur_session']['alea_actuel']);
unset($GLOBALS['visiteur_session']['alea_futur']);
// rajouter les sessions meme en mode auth_http
// pour permettre les connexions multiples et identifier les visiteurs
// creer la session au besoin
if (!isset($_COOKIE['spip_session'])) {
$session = charger_fonction('session', 'inc');
if ($spip_session = $session($row)) {
include_spip('inc/cookie');
spip_setcookie(
'spip_session',
$_COOKIE['spip_session'] = $spip_session,
time() + 3600 * 24 * 14
);
}
$spip_session = $session($row);
}
// reinjecter les preferences_auteur apres le reset de spip_session

33
ecrire/inc/cookie.php

@ -23,20 +23,29 @@ function spip_setcookie ($name='', $value='', $expire=0, $path='AUTO', $domain='
if (!$domain AND defined('_COOKIE_DOMAIN'))
$domain = _COOKIE_DOMAIN;
#spip_log("cookie('$name', '$value', '$expire', '$path', '$domain', '$secure'");
#spip_log("cookie('$name', '$value', '$expire', '$path', '$domain', '$secure', '$httponly'");
// liste des cookies en httponly (a passer en define si besoin)
$httponly = in_array($name, explode(' ', 'spip_session'));
$a =
($httponly AND strnatcmp(phpversion(),'5.2.0') >= 0) ?
@setcookie ($name, $value, $expire, $path, $domain, $secure, $httponly)
: ($secure ?
@setcookie ($name, $value, $expire, $path, $domain, $secure)
: ($domain ?
@setcookie ($name, $value, $expire, $path, $domain)
: ($path ?
@setcookie ($name, $value, $expire, $path)
: ($expire ?
@setcookie ($name, $value, $expire)
:
@setcookie ($name, $value)
))));
if ($secure)
@setcookie ($name, $value, $expire, $path, $domain, $secure);
else if ($domain)
@setcookie ($name, $value, $expire, $path, $domain);
else if ($path)
@setcookie ($name, $value, $expire, $path);
else if ($expire)
@setcookie ($name, $value, $expire);
else
@setcookie ($name, $value);
spip_cookie_envoye(true);
return $a;
}
function spip_cookie_envoye($set = '') {

8
prive/formulaires/login.php

@ -201,14 +201,6 @@ function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
}
}
// Si on est admin, poser le cookie de correspondance
if ($GLOBALS['auteur_session']['statut'] == '0minirezo') {
include_spip('inc/cookie');
spip_setcookie('spip_admin', '@'.$GLOBALS['auteur_session']['login'],
time() + 7 * 24 * 3600);
}
// Si on est connecte, envoyer vers la destination
if ($cible AND ($cible!=self())) {
if (!headers_sent() AND !$_GET['var_mode']) {

Loading…
Cancel
Save