php session set cookie params
setcookie
(PHP 4, PHP 5, PHP 7, PHP 8)
setcookie — Отправляет cookie
Описание
Альтернативная сигнатура доступна с PHP 7.3.0:
Список параметров
(Под)домен, которому доступны cookie. Задание поддомена (например, ‘www.example.com’ ) сделает cookie доступными в нем и во всех его поддоменах (например, w2.www.example.com). Для того, чтобы сделать cookie доступными для всего домена (включая поддомены), нужно просто указать имя домена (то есть ‘example.com’ ).
Возвращаемые значения
Список изменений
Примеры
Ниже представлено несколько примеров, как отправлять cookie:
Пример #1 Пример использования setcookie()
Пример #2 Пример удаления cookie посредством setcookie()
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм браузера, удаляющий истёкшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:
Пример #3 setcookie() и массивы
Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:
Результат выполнения данного примера:
Замечание: Использование разделительных символов, таких как [ и ] как часть имени файла cookie, не соответствует RFC 6265, раздел 4, но предполагается, что оно поддерживается пользовательскими агентами в соответствии с RFC 6265, раздел 5.
Примечания
Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остаётся там, пока вы явно не отправите его браузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.
При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.
Difference between setcookie() and session_set_cookie_params() functions
I am trying to understand the difference between PHP functions setcookie() and session_set_cookie_params().
Looks like both functions are doing the same kind of tasks but setcookie() can be used to create cookie with name & value.
I tried to understand PHP manuals but no clear differences pointed out in it.
6 Answers 6
session_start() does two things, it creates a temporary file on the server of which to store session data, and also sends a cookie to the user’s browser. This cookie has a default expiration time, so calling session_set_cookie_params(seconds) will change the default expiration time of the cookie to what you define. The cookie basically points the client to their session so it is required to access the session.
where as setcookie() function defines a cookie to be sent along with the rest of the HTTP headers.
There are two types of cookies:
Session cookies : these are the session_set_cookie_params() and these are temporary cookie files, which are erased when you close your browser.
Persistent cookies : this is the setcookie() and these files stay in one of your browser’s subfolders until you delete them manually or your browser deletes them based on the duration period contained within the persistent cookies.
For example if you want to have cookies to be saved for 1 week:
Basically it’s not the same.
You could set like the above, the timeout session with the name and value itself. As for session_set_cookie_params:
The efficient way via PHP is below:
The efficient coder ensure the parameter are to be set before setting the parameter itself so if the user is off grid. There’s expiry on the cookie itself.
With session_set_cookie_params() you can define the cookie options (like lifetime, etc.). If a session gets started these values are used for the cookie that is sent to the client. The cookie however is sent only at the beginning of the session but not for any further requests from the client. This means that the cookie with be removed by the client after [session start time] + [timeout] has been reached. Effectively you define a max lifetime of a session.
Whereas setcookie() actually resends the cookie not matter if it is a new session or an existing one. This means that the cookie well be renewed by every request the client will only remove it after [time of last request] + [timeout] has been reached. Effectively you define a max time of inactivity of a session.
setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including and tags as well as any whitespace.
for setcookie() to be working, you need to call session_set_cookie_params() for every request and before session_start() and others like setcookie() are called.
session_set_cookie_params
(PHP 4, PHP 5, PHP 7, PHP 8)
session_set_cookie_params — Устанавливает параметры сессионной cookie
Описание
Альтернативная сигнатура доступна с PHP 7.3.0:
Список параметров
Если использовать первую сигнатуры, время жизни сессионной куки, заданное в секундах.
Путь в домене, где cookie будет работать. Используйте одну косую черту (‘/’) для всех путей в домене.
Домен cookie, например ‘www.php.net’. Чтобы сделать cookies видимыми для всех поддоменов, перед именем домена нужно поставить точку, например ‘.php.net’.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Список изменений
Смотрите также
User Contributed Notes 21 notes
As PHP’s Session Control does not handle session lifetimes correctly when using session_set_cookie_params(), we need to do something in order to change the session expiry time every time the user visits our site. So, here’s the problem.
The following appears to work for setting the SameSite attribute on session cookies for PHP = true ; // if you only want to receive the cookie over HTTPS
$httponly = true ; // prevent JavaScript access to session cookie
$samesite = ‘lax’ ;
Setting the domain for cookies in session_set_cookie_params() only affects the domain used for the session cookie which is set by PHP.
All other cookies set by calling the function setcookie() either:
i) Use the domain set explicitly in the call to setcookie()
or
ii) Don’t set the domain at all on the cookie and so the browser assumes it’s for the current domain.
So to make all your cookies be available across all sub-domains of your site you need to do this:
session_name ( ‘mysessionname’ );
session_start ();
You would get a new session on every request.
I’m not sure if this is the standard, but I see this happens on IE 6, Firefox 12 (Palemoon, actually), Chrome 19 (Portable version), and on both IIS and Apache.
Please take note of the garbage collection «feature» on systems like Ubuntu and Debian.
apt-get installs a cron script at /etc/cron.d/php5 that checks the session.gc_maxlifetime variable and then deletes all old sessions every 9 and 39 minutes.
Another solution is to give the php5 file in /etc/cron.d sane values, ie, only let it run at 3am in the morning, but you’ll have to remember to block the replacement of this file it every time you update php.
when setting the path that the cookie is valid for, always remember to have that trailing ‘/’.
CORRECT:
session_set_cookie_params (0, ‘/yourpath/’);
INCORRECT:
session_set_cookie_params (0, ‘/yourpath’);
no comment on how long it took me to realize that this was the cause of my authentication/session problems.
REMEMBER, that if you have a multi-subdomain site, you must put the following to enable a session id on the whole website:
In Response to RC
>23-Apr-2008 04:45
>For anyone looking for which browsers support the HTTPOnly >flag, per my research:
>
>IE 6 SP 1 and higher.
>Firefox 3 and higher.
>Opera 9.50 and higher.
Firefox 2.0 also supports them, but only since version 2.0.0.5.
The below note is an excellent example of how to ‘reset’ the session expiration time upon a page refresh.
However, take care to compensate for when the session expires and doesn’t renew itself (a bug I believe). If the below example is run every time a script is executed, it will give an ‘Undefined index error’ after the session fails to renew. Precede it with and if isset() condition.
Something that has taken me some time to debug: session_set_cookie_params() does not work when the domain param is just a one level domain, like it was a TLD.
session_set_cookie_params(0, ‘/’, ‘.local’); // Does not work
In all test I’ve done, setting the domain only works for SLDs and above:
This is nothing to do with PHP but the http protocol, witch does not permit setting cookies for TLDs for obvious security reasons.
The information above about this function that it can only be used BEFORE session_start depends on how you use it. Because its also useful AFTER a session has started as follows:
Example you wand to change an already set value of the session cookie expire time:
// Here we start as usual
session_set_cookie_params ( ‘3600’ ); // 1 hour
session_start ();
session_set_cookie_params ( ‘600’ ); // 10 minutes.
session_regenerate_id ( true );
// This will delete old cookie and adopt new expire settings and the
// old cookie variables in a new cookie
?>
Please note i only explained the browser (client) side changes of session cookie’s expire time.
Unfortunately session_set_cookie_params() cannot be called during an active session, it’ll just E_WARNING and return false, which means calling session_regenerate_id() (eg, during login to prevent a session fixation attack) could end up using old cookie settings (eg, not «SameSite=Strict»)
PHP для начинающих. Сессия
Начну с сессий — это один из самых важных компонентов, с которыми вам придется работать. Не понимая принципов его работы — наворотите делов. Так что во избежание проблем я постараюсь рассказать о всех возможных нюансах.
Но для начала, чтобы понять зачем нам сессия, обратимся к истокам — к HTTP протоколу.
HTTP Protocol
Изначально подразумевали, что по этому протоколу будет только HTML передаваться, отсель и название, а сейчас чего только не отправляют и =^.^= и(•_ㅅ_•)
Чтобы не ходить вокруг да около, давайте я вам приведу пример общения по HTTP протоколу.
Вот пример запроса, каким его отправляет ваш браузер, когда вы запрашиваете страницу http://example.com :
А вот пример ответа:
Это очень упрощенные примеры, но и тут можно увидеть из чего состоят HTTP запрос и ответ:
Т.е. если украсть cookie из вашего браузера, то можно будет зайти на вашу страничку в facebook от вашего имени? Не пугайтесь, так сделать нельзя, по крайней мере с facebook, и дальше я вам покажу один из возможных способов защиты от данного вида атаки на ваших пользователей.
Давайте теперь посмотрим как изменятся наши запрос-ответ, будь там авторизация:
Метод у нас изменился на POST, и в теле запроса у нас передаются логин и пароль. Если использовать метод GET, то строка запроса будет содержать логин и пароль, что не очень правильно с идеологической точки зрения, и имеет ряд побочных явлений в виде логирования (например, в том же access.log ) и кеширования паролей в открытом виде.
Как можно заметить, заголовки отправляемые браузером (Request Headers) и сервером (Response Headers) отличаются, хотя есть и общие и для запросов и для ответов (General Headers)
Сервер узнал нашего пользователя по присланным cookie, и дальше предоставит ему доступ к личной информации. Так, ну вроде с сессиями и HTTP разобрались, теперь можно вернутся к PHP и его особенностям.
PHP и сессия
Я надеюсь, у вас уже установлен PHP на компьютере, т.к. дальше я буду приводить примеры, и их надо будет запускать
Вот вам статейка на тему PHP is meant to die, или вот она же на русском языке, но лучше отложите её в закладки «на потом».
Перво-наперво необходимо «стартовать» сессию — для этого воспользуемся функцией session_start(), создайте файл session.start.php со следующим содержимым:
Запустите встроенный в PHP web-server в папке с вашим скриптом:
Запустите браузер, и откройте в нём Developer Tools (или что там у вас), далее перейдите на страницу http://127.0.0.1:8080/session.start.php — вы должны увидеть лишь пустую страницу, но не спешите закрывать — посмотрите на заголовки которые нам прислал сервер:
Там будет много чего, интересует нас только вот эта строчка в ответе сервера (почистите куки, если нет такой строчки, и обновите страницу):
Увидев сие, браузер сохранит у себя куку с именем `PHPSESSID`:
PHPSESSID — имя сессии по умолчанию, регулируется из конфига php.ini директивой session.name, при необходимости имя можно изменить в самом конфигурационном файле или с помощью функции session_name()
И теперь — обновляем страничку, и видим, что браузер отправляет эту куку на сервер, можете попробовать пару раз обновить страницу, результат будет идентичным:
Итого, что мы имеем — теория совпала с практикой, и это просто отлично.
Обновляем страничку и видим время сервера, обновляем ещё раз — и время обновилось. Давайте теперь сделаем так, чтобы установленное время не изменялось при каждом обновлении страницы:
Обновляем — время не меняется, то что нужно. Но при этом мы помним, PHP умирает, значит данную сессию он где-то хранит, и мы найдём это место…
Всё тайное становится явным
В вашей конфигурации путь к файлам может быть не указан, тогда файлы сессии будут хранится во временных файлах вашей системы — вызовите функцию sys_get_temp_dir() и узнайте где это потаённое место.
Так, идём по данному пути и находим ваш файл сессии (у меня это файл sess_dap83arr6r3b56e0q7t5i0qf91 ), откроем его в текстовом редакторе:
Как видим — вот оно наше время, вот в каком хитром формате хранится наша сессия, но мы можем внести правки, поменять время, или можем просто вписать любую строку, почему бы и нет:
Так, что мы ещё не пробовали? Правильно — украсть «печеньки», давайте запустим другой браузер и добавим в него теже самые cookie. Я вам для этого простенький javascript написал, скопируйте его в консоль браузера и запустите, только не забудьте идентификатор сессии поменять на свой:
Вот теперь у вас оба браузера смотрят на одну и туже сессию. Я выше упоминал, что расскажу о способах защиты, рассмотрим самый простой способ — привяжем сессию к браузеру, точнее к тому, как браузер представляется серверу — будем запоминать User-Agent и проверять его каждый раз:
Ключевое слово в предыдущем абзаце похоже, в реальных проектах cookies уже давно «бегают» по HTTPS протоколу, таким образом никто их не сможет украсть без физического доступа к вашему компьютеру или смартфону
Стоит упомянуть директиву session.cookie-httponly, благодаря ей сессионная кука будет недоступна из JavaScript’a. Кроме этого — если заглянуть в мануал функции setcookie(), то можно заметить, что последний параметр так же отвечает за HttpOnly. Помните об этом — эта настройка позволяет достаточно эффективно бороться с XSS атаками в практически всех браузерах.
По шагам
А теперь поясню по шагам алгоритм, как работает сессия в PHP, на примере следующего кода (настройки по умолчанию):
А есть ли жизнь без «печенек»?
PHP может работать с сессией даже если cookie в браузере отключены, но тогда все URL на сайте будут содержать параметр с идентификатором вашей сессии, и да — это ещё настроить надо, но оно вам надо? Мне не приходилось это использовать, но если очень хочется — я просто скажу где копать:
А если надо сессию в базе данных хранить?
Отдельно замечу, что не надо писать собственные обработчики сессий для redis и memcache — когда вы устанавливаете данные расширения, то вместе с ними идут и соответствующие обработчики, так что RTFM наше всё. Ну и да, обработчик нужно указывать до вызова session_start() 😉
Когда умирает сессия?
За время жизни сессии отвечает директива session.gc_maxlifetime. По умолчанию, данная директива равна 1440 секундам (24 минуты), понимать её следует так, что если к сессии не было обращении в течении заданного времени, то сессия будет считаться «протухшей» и будет ждать своей очереди на удаление.
Интересен другой вопрос, можете задать его матёрым разработчикам — когда PHP удаляет файлы просроченных сессий? Ответ есть в официальном руководстве, но не в явном виде — так что запоминайте:
Самая тривиальная ошибка
Ошибка у которой более полумиллиона результатов в выдаче Google:
Cannot send session cookie — headers already sent by
Cannot send session cache limiter — headers already sent
Для получения таковой, создайте файл session.error.php со следующим содержимым:
Во второй строке странная «магия» — это фокус с буфером вывода, я ещё расскажу о нём в одной из следующих статей, пока считайте это лишь строкой длинной в 4096 символов, в данном случае — это всё пробелы
Для проверки полученных знаний, я хочу, чтобы вы реализовали свой собственный механизм сессий и заставили приведенный код работать:
Блокировка
Ещё одна распространённая ошибка у новичков — это попытка прочитать файл сессии пока он заблокирован другим скриптом. Собственно, это не совсем ошибка, это недопонимание принципа блокировки 🙂
Но давайте ещё раз по шагам:
«Воткнутся» в данную ошибку очень легко, создайте два файла:
Есть пару вариантов, как избежать подобного явления — «топорный» и «продуманный».
«Топорный»
Использовать самописный обработчик сессий, в котором «забыть» реализовать блокировку 🙂
Чуть лучше вариант, это взять готовый и отключить блокировку (например у memcached есть такая опция — memcached.sess_locking) O_o
Потратить часы на дебаг кода в поисках редко всплывающей ошибки…
«Продуманный»
Куда как лучше — самому следить за блокировкой сессии, и снимать её, когда она не требуется:
— Если вы уверенны, что вам не потребуется вносить изменения в сессионные данные используйте опцию read_and_close при старте сессии:
Таким образом, блокировка будет снята сразу по прочтению данных сессии.
— Если вам таки нужно вносить изменения в сессию, то после внесения оных закрывайте сессию от записи:
В заключение
В этой статье вам дано семь заданий, при этом они касаются не только работы с сессиями, но так же познакомят вас с MySQL и с функциями работы со строками. Для усвоения этого материала — отдельной статьи не нужно, хватит и мануала по приведенным ссылкам — никто за вас его читать не будет. Дерзайте!
Разница между функциями setcookie () и session_set_cookie_params ()
Я пытаюсь понять разницу между функциями PHP setcookie () и session_set_cookie_params ().
Похоже, что обе функции выполняют одинаковые задачи, но setcookie () может использоваться для создания cookie с именем & значение.
Я пытался понять руководства по PHP, но в нем не было четких различий.
Решение
В принципе это не то же самое.
Вы можете установить, как указано выше, время ожидания сеанса с именем и самим значением.
Что касается session_set_cookie_params:
Вы можете установить путь, срок действия самого файла cookie, корневой домен, уровень безопасности и многие другие параметры здесь. http://php.net/manual/en/function.session-set-cookie-params.php
Эффективный способ с помощью PHP ниже:
Эффективный кодер гарантирует, что параметр должен быть установлен до установки самого параметра, если пользователь отключен от сети. Срок действия самого файла cookie истек.
Другие решения
session_set_cookie_params (в секундах)
session_start () выполняет две функции: создает на сервере временный файл, в котором будут храниться данные сеанса, а также отправляет файл cookie в браузер пользователя. Этот cookie имеет время истечения по умолчанию, поэтому вызов session_set_cookie_params (секунды) изменит время истечения срока действия cookie по умолчанию на то, что вы определяете. Cookie в основном указывает клиенту на его сеанс, поэтому он необходим для доступа к сеансу.
функция as as setcookie () определяет файл cookie для отправки вместе с остальными заголовками HTTP.
Существует два типа файлов cookie:
Сессионные куки: это session_set_cookie_params () и это временные файлы cookie, которые стираются при закрытии браузера.
Постоянные куки: это setcookie (), и эти файлы остаются в одной из подпапок вашего браузера до тех пор, пока вы не удалите их вручную или ваш браузер не удалит их на основе периода времени, который содержится в постоянных файлах cookie.
Например, если вы хотите, чтобы куки сохранялись в течение 1 недели:
SetCookie () определяет файл cookie для отправки вместе с остальными заголовками HTTP. Как и другие заголовки, куки должны отправляться до любого вывода из вашего скрипта (это ограничение протокола). Это требует, чтобы вы вызывали эту функцию до любого вывода, включая и теги, а также любые пробелы.
за SetCookie () чтобы работать, нужно позвонить session_set_cookie_params () за каждый запрос и до session_start () и другие, как SetCookie () называются.