Как указать PHP использовать SameSite = None для межсайтовых файлов cookie?

Согласно статье здесь https://php.watch/articles/PHP-Samesite-cookies и документацию по PHP на странице https://www.php.net/manual/en/session.security.ini.php, есть только 2 возможных варианта конфигурации для этой новой функции, добавленной в PHP 7.3:

  1. session.cookie_samesite = Слабость
  2. session.cookie_samesite = Строгий

Тем не менее, согласно консоли Chrome, для этого нужно установить значение «Нет»:

Файл cookie, связанный с межсайтовым ресурсом по URL-адресу, был установлен без атрибута SameSite. Он был заблокирован, так как Chrome теперь доставляет файлы cookie с межсайтовыми запросами, только если они установлены с SameSite=None и Secure. Вы можете просмотреть файлы cookie в инструментах разработчика в разделе Приложение> Хранилище> Файлы cookie и просмотреть более подробную информацию по URL-адресу и URL-адресу.

Из-за этого я больше не могу устанавливать межсайтовые файлы cookie. Какое обходное решение?


person Dane Iracleous    schedule 30.12.2019    source источник
comment
вы можете проверить здесь с помощью заголовка php. stackoverflow.com/a/63481019/6128573   -  person Sandeep Sherpur    schedule 19.08.2020


Ответы (6)


Вы можете установить значение Нет, используя ini_set. При использовании этой функции нет проверки, поддерживается ли значение:

ini_set('session.cookie_samesite', 'None');
session_start();

session_set_cookie_params также можно установить:

session_set_cookie_params(['samesite' => 'None']);
session_start();

Отчет об ошибке для поддержки этого в php.ini находится здесь.


Как сказано в @shrimpwagon в комментарий ниже, session.cookie_secure должно быть true, чтобы это работало. PHP этого не требует, в отличие от браузеров.

person Anonymous    schedule 30.12.2019
comment
Спасибо - мне удалось использовать следующий код, чтобы избавиться от сообщения Chrome и разрешить межсайтовым файлам cookie продолжить работу: session_set_cookie_params (['samesite' = ›'None', 'secure' =› true]); - person Dane Iracleous; 30.12.2019
comment
будьте осторожны, samesite = none не поддерживается в старых браузерах и полностью отклоняет cookie. проверьте это и не забудьте исключить старые браузеры при установке атрибута samesite в файл cookie сеанса: chromium.org/updates/same-site/incompatible-clients - person Volkan Ulukut; 17.02.2020
comment
Установка session.cookie_samesite = None в php.ini НЕ работала в PHP 7.3.15. Использование session_set_cookie_params, как описано выше, сработало. - person humbads; 17.03.2020
comment
Немного неверно. Должен быть: session_set_cookie_params(['SameSite' => 'None', 'Secure' => true]); - person shrimpwagon; 10.09.2020
comment
@shrimpwagon Обновлено - person Anonymous; 11.09.2020

Плохой:

session.cookie_samesite=None

Верный:

session.cookie_samesite="None"

Пояснение здесь

person vitaliytv    schedule 21.04.2020
comment
Не делай этого. Некоторые браузеры имеют ошибки и полностью отклоняют файлы cookie с SameSite = None. Сначала вам нужно обнюхать UserAgent. Вот объяснение от Google. - person Tell; 23.04.2020

ini_set('session.cookie_secure', "1"); ini_set('session.cookie_httponly', "1"); ini_set('session.cookie_samesite','None'); session_start();

php 7.4 Samesite в phpinfo введите здесь описание изображения

php 7.2 Samesite не существует в phpinfo. введите здесь описание изображения

$currentCookieParams = session_get_cookie_params();
$cookie_domain= 'your domain';
if (PHP_VERSION_ID >= 70300) {
session_set_cookie_params([
    'lifetime' =>  $currentCookieParams["lifetime"],
    'path' => '/',
    'domain' => $cookie_domain,
    'secure' => "1",
    'httponly' => "1",
    'samesite' => 'None',
]);
} else {
session_set_cookie_params(
    $currentCookieParams["lifetime"],
    '/; samesite=None',
    $cookie_domain,
    "1",
    "1"
);
}
session_start();

موفق باشید

person Farhad Aghasaghloo    schedule 27.08.2020

Этот метод может быть вам полезен.

Добавьте атрибуты заголовка на nginx ниже Secure + SameSite=None

место нахождения / {

proxy_cookie_path / /; безопасный; SameSite = нет;

}

Это работает на меня!

person Thanh Phong Đỗ    schedule 18.03.2020

Я использую cakephp 1.3. Мне нужен серверный файл cookie во внешнем интерфейсе, который не принадлежит к тому же домену. подробнее здесь.

https://stackoverflow.com/a/63481019/6128573

person Sandeep Sherpur    schedule 19.08.2020

Для PHP 5.6.40 существует обходной путь (параметр hack on path), который не требует перестройки PHP.

Если у вас нет проблем с восстановлением двоичного файла PHP, мне удалось перенести эту функцию с PHP 7.3 на PHP 5.6.40, и теперь есть запрос на перенос. Он мне понадобился для наших проектов, которые еще не перенесены. Я знаю, что ветка 5.6 устарела, я просто делюсь.

Запрос на извлечение: https://github.com/php/php-src/pull/6446

Наше репо с изменениями: https://github.com/Inducido/php-src/tree/PHP-5.6.40

Сборка протестирована на Debian 8.11

Новая особенность

Сессия:. Добавлена ​​поддержка директивы SameSite cookie для setcookie (), setrawcookie () и session_set_cookie_params (). Порт из ветки PHP 7.x, все они имеют дополнительный параметр samesite в самом конце (строка)

прототипы:

bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]])
(session_get_cookie_params updated too)

Изменения в обработке файлов INI

  • session.cookie_samesite. Новая опция INI, позволяющая установить директиву SameSite для файлов cookie. По умолчанию (пустая строка), поэтому директива SameSite не установлена. Может быть установлено значение Lax или Strict или None, которое устанавливает соответствующую директиву SameSite. при использовании None обязательно включайте кавычки, поскольку none интерпретируется как false в ini-файлах.

Это решает проблему. Этот Set-Cookie был заблокирован из-за пользовательских настроек в Chrome.

person Nadir    schedule 22.11.2020