@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ą.
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ą
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().
+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.
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.
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.
$cookie->setHttpOnly(true);
z github.com/delight-im/PHP-CookieOdpowiedzi:
PHPSESSID
domyślnie) zobacz odpowiedź @ richieFunkcje
setcookie()
isetrawcookie()
wprowadziłyhttponly
parametr 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
Wprowadź
NULL
parametry, które chcesz zachować jako domyślne. Możesz również rozważyć, czy powinieneś ustawiaćsecure
parametr.Jest to również możliwe przy użyciu starszej
header()
funkcji niższego poziomu :header( "Set-Cookie: name=value; httpOnly" );
źródło
set_cookie
wywołanie będzie mniej szczegółowe, jeśli nie będziemy musieli ustawiać innych parametrów. Na przykładset_cookie($name, $value, httponly: true)
.W przypadku własnych plików cookie sesji PHP na serwerze Apache:
dodaj to do konfiguracji serwera Apache lub
.htaccess
Można to również ustawić w skrypcie, o ile zostało wywołane wcześniej
session_start()
.ini_set( 'session.cookie_httponly', 1 );
źródło
php.ini
.php_value
naphp_flag
nie działa. Właśnie wypróbowałem to na moim serwerze ...php_flag
, należy również zmienić wartość - na alboon
luboff
- patrz instrukcja.Zauważ, że sesyjne pliki cookie PHP nie używają
httponly
domyślnie.Aby to zrobić:
$sess_name = session_name(); if (session_start()) { setcookie($sess_name, session_id(), null, '/', null, null, true); }
Kilka rzeczy wartych uwagi:
session_name()
wcześniejsession_start()
źródło
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.
źródło
<?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
źródło
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");
źródło
Możesz to określić w funkcji ustawiania plików cookie, patrz podręcznik PHP
setcookie('Foo','Bar',0,'/', 'www.sample.com' , FALSE, TRUE);
źródło
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.
źródło
Prawidłowa składnia polecenia php_flag to
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.
źródło
Bardziej eleganckie rozwiązanie od PHP> = 7.0
session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);
session_start
session_start options
źródło