Как настроить использование файлов 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

Ответы:

93
  • Что касается файлов cookie , см. Этот ответ.
  • Для собственного файла cookie сеанса PHP ( PHPSESSIDпо умолчанию) см . Ответ @ richie

Функции setcookie()и 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" );
Cheekysoft
источник
1
С именованными параметрами PHP 8 мы, наконец, сможем сделать set_cookieвызов менее подробным, если нам не нужно устанавливать другие параметры. Например set_cookie($name, $value, httponly: true).
Sygmoral
121

Для файлов 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.
Энтони Хацопулос
10
Обратите внимание: вместо этого следует использовать php_flag: «Не используйте php_value для установки логических значений. Вместо этого следует использовать php_flag». php.net/manual/en/configuration.changes.php
Ондрей Мачулда,
@OndrejMachulda Переход php_valueна php_flagне работает. Я только что попробовал на своем сервере ..
Нейт
6
@Nate: При переходе на php_flag, вы должны также изменить значение - на либо onили off- см. Руководство.
Ондрей Мачулда
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, но не упускайте даже час фильтрации вывода и нечеткого тестирования в обмен на это.

tqbf
источник
13
Эта ситуация, возможно, изменилась с 2008 года. Вот более текущий / обновленный список: 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); 

?>

Источник

Мариус
источник
5

Объяснение здесь от Ильи ... 5.2 только хотя

Поддержка флага httpOnly cookie в PHP 5.2

Как указано в этой статье, вы можете установить заголовок самостоятельно в предыдущих версиях PHP.

header("Set-Cookie: hidden=value; httpOnly");
Polsonby
источник
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
Ник Коттрелл,
1
и правильно, «все будущие сеансовые файлы cookie» будут использовать httponly, а не пользовательские ...
qdev 01
2

Правильный синтаксис команды php_flag:

php_flag  session.cookie_httponly On

И имейте в виду, просто сначала ответ от сервера установите cookie и здесь (например, вы можете увидеть директиву «HttpOnly». Итак, для тестирования удаляйте файлы cookie из браузера после каждого запроса тестирования.

Mareg
источник