Jak skonfigurować użycie plików cookie HttpOnly w PHP

93

Jak mogę ustawić pliki cookie w moim PHP appsas HttpOnly cookies?

Scott Warren
źródło
stackoverflow.com/questions/528405/… Zawiera informacje o obsłudze przeglądarki.
Kzqai
2
@Tchalvak Nie, obecne odpowiedzi są nadal miarodajne. Od 2008 r. Nic się nie zmieniło w kwestii ustawień plików cookie obsługujących tylko HTTP w PHP. To, które przeglądarki obsługują pliki cookie tylko przez HTTP, to inne pytanie, z inną odpowiedzią.
lanzz
Możesz używać $cookie->setHttpOnly(true);z github.com/delight-im/PHP-Cookie
caw

Odpowiedzi:

93
  • W przypadku plików cookie zobacz tę odpowiedź.
  • W przypadku własnego sesyjnego pliku cookie PHP ( PHPSESSIDdomyślnie) zobacz odpowiedź @ richie

Funkcje setcookie()i setrawcookie()wprowadziły httponlyparametr już w ciemnych czasach PHP 5.2.0, dzięki czemu jest to przyjemne i łatwe. Po prostu ustaw siódmy parametr na true, zgodnie ze składnią

Uproszczona składnia funkcji dla zwięzłości

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

Wprowadź NULLparametry, które chcesz zachować jako domyślne. Możesz również rozważyć, czy powinieneś ustawiać secureparametr.

Jest to również możliwe przy użyciu starszej header()funkcji niższego poziomu :

header( "Set-Cookie: name=value; httpOnly" );
Cheekysoft
źródło
1
Dzięki nazwanym parametrom PHP 8 w końcu będziemy mogli sprawić, że set_cookiewywołanie będzie mniej szczegółowe, jeśli nie będziemy musieli ustawiać innych parametrów. Na przykład set_cookie($name, $value, httponly: true).
Sygmoral
121

W przypadku własnych plików cookie sesji PHP na serwerze Apache:
dodaj to do konfiguracji serwera Apache lub.htaccess

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

Można to również ustawić w skrypcie, o ile zostało wywołane wcześniej session_start().

ini_set( 'session.cookie_httponly', 1 );
Richie
źródło
9
+1, ponieważ dobrze jest (ze względów bezpieczeństwa) mieć to miejsce na całym serwerze, ale zamiast tego dodać do php.ini.
Anthony Hatzopoulos
10
Należy pamiętać, że zamiast tego należy użyć php_flag: "Nie używaj wartości php_value do ustawiania wartości logicznych. Zamiast tego należy użyć php_flag." php.net/manual/en/configuration.changes.php
Ondrej Machulda
@OndrejMachulda Zmiana php_valuena php_flagnie działa. Właśnie wypróbowałem to na moim serwerze ...
Nate,
6
@Nate: Zmieniając na php_flag, należy również zmienić wartość - na albo onlub off- patrz instrukcja.
Ondrej Machulda
14

Zauważ, że sesyjne pliki cookie PHP nie używają httponlydomyślnie.

Aby to zrobić:

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

Kilka rzeczy wartych uwagi:

  • Musisz zadzwonić session_name() wcześniejsession_start()
  • To również ustawia domyślną ścieżkę na „/”, która jest niezbędna dla Opery, ale których pliki cookie sesji PHP również nie robią domyślnie.

źródło
12
php.net/manual/en/function.session-set-cookie-params.php Można to zrobić automatycznie za pomocą powyższej funkcji PHP zamiast niestandardowego kodowania.
Ryaner
13

Należy pamiętać, że HttpOnly nie zatrzymuje skryptów między witrynami; zamiast tego neutralizuje jeden możliwy atak i obecnie robi to tylko na IE (FireFox ujawnia pliki cookie HttpOnly w XmlHttpRequest, a Safari w ogóle go nie honoruje). Jak najbardziej, włącz HttpOnly, ale nie rezygnuj nawet z godziny filtrowania wyjścia i testowania fuzz w zamian za to.

tqbf
źródło
13
Ta sytuacja mogła się zmienić od 2008 roku, teraz. Oto bardziej aktualna / zaktualizowana lista: 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); 

?>

Źródło

Marius
źródło
5

Wyjaśnienie tutaj z Ilii ... tylko 5.2

Obsługa flag plików cookie httpOnly w PHP 5.2

Jak wspomniano w tym artykule, możesz samodzielnie ustawić nagłówek w poprzednich wersjach PHP

header("Set-Cookie: hidden=value; httpOnly");
Polsonby
źródło
5

Możesz to określić w funkcji ustawiania plików cookie, patrz podręcznik PHP

setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);
Re0sless
źródło
4

Możesz użyć tego w pliku nagłówkowym.

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

W ten sposób wszystkie przyszłe sesyjne pliki cookie będą używać tylko protokołu http.

  • Zaktualizowano.
Marius
źródło
2
Just FYI session.use_only_cookies jest domyślnie włączone w PHP> 5.3
Nic Cottrell
1
i poprawne jest to, że „wszystkie przyszłe pliki cookie sesji ” będą używać tylko plików http, a nie niestandardowych ...
qdev
2

Prawidłowa składnia polecenia php_flag to

php_flag  session.cookie_httponly On

I pamiętaj, po prostu pierwsza odpowiedź z serwera ustaw plik cookie i tutaj (na przykład możesz zobaczyć dyrektywę "HttpOnly". Więc do testowania usuń pliki cookie z przeglądarki po każdym żądaniu testowym.

Mareg
źródło
0

Bardziej eleganckie rozwiązanie od PHP> = 7.0

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

session_start

session_start options

Hein
źródło