Як налаштувати використання файлів cookie HttpOnly у PHP


93

Як я можу встановити файли cookie у своєму PHP appsяк HttpOnly cookies?


stackoverflow.com/questions/528405/… Має інформацію про підтримку браузера.
Kzqai

2
@Tchalvak Ні, поточні відповіді все ще є достовірними. З 2008 року нічого не змінилося щодо налаштування файлів cookie лише для HTTP у PHP. Які браузери підтримують файли cookie лише для HTTP - це інше питання, з іншою відповіддю.
lanzz

Ви можете використовувати $cookie->setHttpOnly(true);з github.com/delight-im/PHP-Cookie
caw

Відповіді:


92
  • Для вашого печива , побачити цю відповідь.
  • Щодо власного файлу cookie сеансу PHP ( PHPSESSIDза замовчуванням), див. Відповідь @ richie

Функції setcookie()and setrawcookie(), представлені httponlyпараметром, ще в темні часи PHP 5.2.0, роблять це приємно і просто. Просто встановіть для 7-го параметра значення true відповідно до синтаксису

Синтаксис функції спрощений для стислості

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

Введіть NULLпараметри, які потрібно залишити за замовчуванням. Можливо, ви також захочете подумати, чи слід вам встановлювати secureпараметр.

Можливо також використання старшої header()функції нижчого рівня :

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

З іменованими параметрами PHP 8 ми нарешті зможемо зробити set_cookieдзвінок менш детальним, якщо нам не потрібно буде встановлювати інші параметри. Наприклад set_cookie($name, $value, httponly: true).
Sygmoral

120

Для власних файлів cookie сеансу PHP на Apache:
додайте це до своєї конфігурації Apache або.htaccess

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

Це також можна встановити в сценарії, якщо це викликано раніше session_start().

ini_set( 'session.cookie_httponly', 1 );

9
+1, оскільки це добре (для безпеки) мати на місці на всьому сервері, але натомість додати в php.ini.
Anthony Hatzopoulos

10
Зверніть увагу, замість цього слід використовувати php_flag: "Не використовуйте php_value для встановлення булевих значень. Натомість слід використовувати php_flag." php.net/manual/en/configuration.changes.php
Ondrej Machulda

@OndrejMachulda Зміна php_valueна php_flagне працює. Я щойно спробував на своєму сервері ..
Нейт

6
@Nate: При переході на php_flag, ви також повинні змінити значення - на або onабо off- див. Посібник.
Ondrej Machulda

14

Зверніть увагу, що файли cookie сеансу PHP не використовуються httponlyза замовчуванням.

Для цього:

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

Декілька приміток тут:

  • Вам потрібно зателефонувати session_name() ранішеsession_start()
  • Це також встановлює шлях за замовчуванням до '/', який необхідний для Opera, але який файли cookie сеансу PHP також не роблять за замовчуванням.

12
php.net/manual/en/function.session-set-cookie-params.php Це може бути зроблено автоматично за допомогою вищезазначеної функції PHP замість спеціального кодування.
Ryaner

13

Майте на увазі, що HttpOnly не зупиняє міжсайтові сценарії; натомість він нейтралізує одну можливу атаку, і наразі робить це лише на IE (FireFox виставляє файли cookie HttpOnly у XmlHttpRequest, і Safari це взагалі не виконує). У будь-якому випадку, увімкніть HttpOnly, але не втрачайте навіть години фільтрації вихідних даних та тестування нечіткості в торгівлі на це.


13
Можливо, ця ситуація змінилася з 08 року, зараз. Ось більше струму / оновлений список: 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); 

?>

Джерело




4

Ви можете використовувати це у файлі заголовка.

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

Таким чином, усі майбутні файли cookie сеансу використовуватимуть httponly.

  • Оновлено.

2
Тільки FYI session.use_only_cookies за замовчуванням увімкнено в PHP> 5,3
Nic Cottrell

1
і правильним є "всі файли cookie майбутніх сесій " використовуватимуть httponly, а не власні ...
qdev

2

Правильним синтаксисом команди php_flag є

php_flag  session.cookie_httponly On

І майте на увазі, просто першою відповіддю від сервера встановіть файл cookie і тут (наприклад, ви можете побачити директиву "HttpOnly". Отже, для тестування видаляйте файли cookie з браузера після кожного запиту на тестування.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.