Как настроить использование файлов cookie HttpOnly в PHP

Как я могу установить файлы cookie в моем PHP apps как HttpOnly cookies?


person Scott Warren    schedule 31.08.2008    source источник
comment
stackoverflow.com/questions/528405/ Имеется информация о поддержке браузера.   -  person Kzqai    schedule 19.11.2012
comment
@Tchalvak Нет, текущие ответы по-прежнему являются авторитетными. С 2008 года ничего не изменилось в отношении настройки файлов cookie только для HTTP в PHP. Какие браузеры поддерживают файлы cookie только для HTTP - это другой вопрос, с другим ответом.   -  person lanzz    schedule 22.11.2012
comment
Вы можете использовать $cookie->setHttpOnly(true); с github.com/delight-im/PHP-Cookie   -  person caw    schedule 13.07.2016


Ответы (10)


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

setcookie() и _ 3_, еще в темные времена PHP 5.2.0, представили логический параметр httponly, что сделало это простым и приятным. Просто установите для 7-го параметра значение true в соответствии с синтаксисом

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

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

В PHP ‹8 укажите NULL для параметров, которые вы хотите оставить по умолчанию.

В PHP ›= 8 вы можете получить выгоду от использования именованных параметров. См. этот вопрос об именованных параметрах.

setcookie( $name, $value, httponly:true )

Также возможно использование более старой функции нижнего уровня header():

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

Вы также можете подумать, следует ли вам устанавливать параметр Secure.

person Cheekysoft    schedule 31.08.2008
comment
С именованными параметрами PHP 8 мы, наконец, сможем сделать вызов set_cookie менее подробным, если нам не нужно устанавливать другие параметры. Например set_cookie($name, $value, httponly: true). - person Sygmoral; 30.08.2020
comment
в PHP 7.3.0 мы можем использовать array. setcookie("name", "value", ['httponly' => true]); - person Dian; 25.04.2021

Для файлов cookie сеанса PHP на Apache:
добавьте это в конфигурацию Apache или .htaccess

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

Это также можно установить в сценарии, если он вызывается до session_start().

ini_set( 'session.cookie_httponly', 1 );
person richie    schedule 04.01.2012
comment
+1, так как это хорошая вещь (для безопасности), чтобы она была размещена на всем вашем сервере, но вместо этого добавлена ​​к php.ini. - person Anthony Hatzopoulos; 23.11.2012
comment
Обратите внимание: вместо него следует использовать php_flag: не используйте php_value для установки логических значений. Вместо этого следует использовать php_flag. php.net/manual/en/configuration.changes.php - person Ondrej Machulda; 13.10.2013
comment
@OndrejMachulda Изменение php_value на php_flag не работает. Я только что попробовал на своем сервере .. - person Nate; 28.12.2013
comment
@Nate: При переходе на php_flag вы должны также изменить значение - на on или off - см. Руководство. - person Ondrej Machulda; 29.12.2013

Обратите внимание, что файлы 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 по умолчанию также не используются.
person Community    schedule 30.10.2008
comment
php.net/manual/en/function.session-set- cookie-params.php Это можно сделать автоматически с помощью указанной выше функции PHP вместо пользовательского кодирования. - person Ryaner; 14.11.2010

Имейте в виду, что HttpOnly не останавливает межсайтовый скриптинг; вместо этого он нейтрализует одну возможную атаку, и в настоящее время делает это только в IE (FireFox предоставляет файлы cookie HttpOnly в XmlHttpRequest, а Safari вообще не учитывает его). Во что бы то ни стало, включите HttpOnly, но не упускайте даже час фильтрации вывода и нечеткого тестирования в обмен на это.

person tqbf    schedule 10.09.2008
comment
Эта ситуация могла измениться с 2008 года. Вот более актуальный / обновленный список: stackoverflow .com / questions / 528405 / - person Kzqai; 19.11.2012

<?php
//None HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); 

//HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); 

?>

Источник

person Marius    schedule 31.08.2008

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

http://ilia.ws/archives/121-httpOnly-cookie-flag-support-in-PHP-5.2.html

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

header("Set-Cookie: hidden=value; httpOnly");
person Polsonby    schedule 31.08.2008

Вы можете указать это в функции установки файлов cookie см. Руководство по php

setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);
person Re0sless    schedule 31.08.2008

Вы можете использовать это в файле заголовка.

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

Таким образом, все будущие сеансовые файлы cookie будут использовать httponly.

  • Обновлено.
person Marius    schedule 27.05.2013
comment
Просто FYI session.use_only_cookies включен по умолчанию в PHP ›5.3 - person Nic Cottrell; 20.08.2013
comment
и правильно, все будущие файлы cookie сеанса будут использовать httponly, а не пользовательские ... - person qdev; 01.09.2017

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

php_flag  session.cookie_httponly On

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

person Mareg    schedule 19.11.2013

Более элегантное решение, поскольку PHP> = 7.0

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

session_start

параметры session_start

person Hein    schedule 23.04.2020