Come si configurano i cookie HttpOnly in PHP


93

Come posso impostare i cookie nel mio PHP appsas HttpOnly cookies?


stackoverflow.com/questions/528405/… Ha le informazioni di supporto del browser.
Kzqai

2
@Tchalvak No, le risposte attuali sono ancora autorevoli. Nulla è cambiato dal 2008 per quanto riguarda l'impostazione dei cookie solo HTTP in PHP. Quali browser supportano i cookie solo HTTP è una domanda diversa, con una risposta diversa.
lanzz

Puoi usarlo $cookie->setHttpOnly(true);con github.com/delight-im/PHP-Cookie
caw

Risposte:


92
  • Per i tuoi cookie , vedi questa risposta.
  • Per il cookie di sessione di PHP ( PHPSESSID, per impostazione predefinita), vedere la risposta di @ richie

Le funzioni setcookie()e setrawcookie(), che hanno introdotto il httponlyparametro, nei secoli bui di PHP 5.2.0, rendendolo piacevole e facile. È sufficiente impostare il settimo parametro su true, secondo la sintassi

Sintassi della funzione semplificata per brevità

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

Immettere NULLper i parametri che si desidera mantenere come predefiniti. Potresti anche considerare se dovresti impostare il secureparametro.

È anche possibile utilizzare la vecchia header()funzione di livello inferiore :

header( "Set-Cookie: name=value; httpOnly" );

Con i parametri denominati di PHP 8, saremo finalmente in grado di rendere la set_cookiechiamata meno prolissa se non avremo bisogno di impostare gli altri parametri. Ad esempio set_cookie($name, $value, httponly: true).
Sygmoral il

120

Per i cookie di sessione di PHP su Apache:
aggiungilo alla tua configurazione di Apache o.htaccess

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

Questo può anche essere impostato all'interno di uno script, purché venga chiamato prima session_start().

ini_set( 'session.cookie_httponly', 1 );

9
+1 poiché questa è una buona cosa (per sicurezza) da avere sul tuo intero server ma invece aggiunta al file php.ini.
Anthony Hatzopoulos

10
Si prega di notare che al suo posto dovrebbe essere usato php_flag: "Non usare php_value per impostare valori booleani. Php_flag dovrebbe essere usato invece." php.net/manual/en/configuration.changes.php
Ondrej Machulda

@OndrejMachulda Il passaggio php_valuea php_flagnon funziona. L'ho appena provato sul mio server ..
Nate

6
@Nate: Quando si passa a php_flag, è necessario modificare anche il valore - in ono off- vedere il manuale.
Ondrej Machulda

14

Tieni presente che i cookie di sessione PHP non vengono utilizzati httponlyper impostazione predefinita.

Fare quello:

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

Un paio di elementi degni di nota qui:

  • Devi chiamare session_name() primasession_start()
  • Questo imposta anche il percorso predefinito su "/", che è necessario per Opera ma che i cookie di sessione PHP non fanno neanche per impostazione predefinita.

12
php.net/manual/en/function.session-set-cookie-params.php Può essere fatto automaticamente tramite la funzione PHP sopra invece della codifica personalizzata.
Ryaner

13

Tieni presente che HttpOnly non interrompe lo scripting tra siti; invece, neutralizza un possibile attacco e attualmente lo fa solo su IE (FireFox espone i cookie HttpOnly in XmlHttpRequest e Safari non lo onora affatto). Con tutti i mezzi, attiva HttpOnly, ma non perdere nemmeno un'ora di filtraggio dell'output e test fuzz in cambio di esso.


13
Questa situazione potrebbe essere cambiata dal '08, adesso. Ecco un più corrente lista / aggiornamento: 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); 

?>

fonte




4

Puoi usarlo in un file di intestazione.

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

In questo modo tutti i cookie di sessione futuri utilizzeranno solo http.

  • Aggiornato.

2
Solo FYI session.use_only_cookies è attivo per impostazione predefinita in PHP> 5.3
Nic Cottrell

1
e corretto è "tutti i cookie di sessione futuri " useranno solo http, non quelli personalizzati ...
qdev

2

La sintassi corretta del comando php_flag è

php_flag  session.cookie_httponly On

E attenzione, solo la prima risposta dal server imposta il cookie e qui (ad esempio puoi vedere la direttiva "HttpOnly". Quindi per i test elimina i cookie dal browser dopo ogni richiesta di test.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.