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


93

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


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" );

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 );

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.

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.


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




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.

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.