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.