PHP Повар сеанса ie случайным образом небезопасен, не может заменить безопасный повар ie, 90% всех Firefox пользователей - PullRequest
3 голосов
/ 09 марта 2020

Catalyst:

Ошибка Gecko 1617361 - это серьезная ошибка, связанная с приготовлением ie, когда браузеры Gecko случайным образом отказываются отправлять заголовок HTTP Cookie (либо крайне сложно воспроизвести, либо (для непрофессионала) очень трудно убежать (просто очистить печенье)). Позже выяснилось, что Gecko не сообщает об ошибке , когда незащищенные куки-файлы не могли перезаписывать безопасные куки-файлы. Однако после изменения имени сеанса cook ie с session на session2 и установки всех параметров безопасности / домена на FALSE Gecko по-прежнему отказывается отправлять заголовок HTTP Cook ie . Эта ошибка достаточно серьезна, так что она поражает 90% всех браузеров Gecko, что мешает им загружать сайты, работающие на моей платформе. Как кто-то принципиально против монополий, мне нужно решить эту проблему на всех фронтах.

Какие ошибки какие?

  • Gecko Ошибка 1617361 - это когда Gecko случайным образом выбирает , а не установите заголовок HTTP Cookie.
  • Ошибка Gecko 1623284 (ниже) о том, что Gecko не потрудился упомянуть, что сессия Cook ie была неприемлема, поскольку она небезопасна, а текущий безопасен .
  • Эта ошибка связана с выяснением того, как мой код PHP может сгенерировать сеансовый повар ie без флагов безопасности / домена / любых других параметров .

Вопрос:

Как мой код PHP ниже не сможет установить session cook ie как безопасный в любом контексте запроса (на живых (или "производственных") серверах) и как бы я переписал код, чтобы гарантировать, что сессия Cook ie не только безопасна, когда он установлен, хотя всегда безопасен, когда он повторно инициализируется для последующих запросов страницы?

Сообщение об ошибке

Следующие Инг - ошибка , о которой прямо говорится в этом посте . Это сообщение об ошибке генерируется только тогда, когда в Firefox you go - about:networking#logging, установите cookie:5 в значение «Current Load Modules» (разделитель запятых) и ведите журнал, пока проблема возникает, следовательно, сложность и разочарование не только одного, а нескольких ошибок. Вот сообщение об ошибке, которое он генерирует:

W / cook ie отклонено, потому что cook ie не может сохранить, потому что более старый повар ie является безопасным поваром ie, но более новым поваром ie это небезопасный повар ie

Подробности:

Хотя есть две ошибки, относящиеся к этому сообщению, ошибка, которую я пытаюсь устранить, когда моя * Код 1107 * возобновляет сеанс, но не делает его готовым ie secure . В попытке решить проблему с исходной ошибкой катализатора мой сервер теперь использует setcookie('session2',session_id(),time()+3600,'/',$_SERVER['HTTP_HOST'], FALSE, FALSE);, пока и эта ошибка, и мой собственный код PHP не будут исправно работать.

  • Я рад обновить задайте вопрос и укажите любой другой соответствующий код.
  • Данный домен связан с моим профилем, хотя, как я уже говорил, я установил сеанс cook ie на небезопасный.
  • Эта ошибка Кажется, что происходит как в локальной / WAMP, так и в реальной / LAMP-среде.

Требования проверки для приемлемого ответа

  • Мне нужно иметь возможность воспроизвести возникновение сеанса повара ie когда он отказывается от отправки в качестве безопасного (домен в моем профиле является хорошим примером поведения HTTP моей платформы).
  • Мне нужно понять, что насчет моего кода, среды и / или любого другого ошибки в PHP, которые вызывают эту проблему.
  • Мне нужно иметь возможность точно знать, что сеансовые cookie-файлы, отправляемые во всех случаях, являются безопасными, особенно если Браузеры Gecko не сообщают вам об ошибке в консоли разработчика (опубликовано ошибка 1623284 для этого).
  • Я не использовать платформы или библиотеки для любого моего кода клиент / сервер.

Вот оригинальный код PHP, который обрабатывал сессии:

<?php
if (substr($_SERVER['DOCUMENT_ROOT'],0,1) == '/' && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')
{
 ini_set('session.cookie_secure', 1);
 ini_set('session.gc_maxlifetime', 3600);
 session_set_cookie_params(3600);
}
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_samesite','Strict');
ini_set('session.use_only_cookies', 1);
session_name('session');
session_start();
?>

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Этот вопрос очень похож на тот, который был у меня однажды. Проблема была в том, что куки не сохраняются как защищенные, а когда они уже представлены как защищенные, не могут быть перезаписаны в каком-то случайном случае.

Я понял, что это произошло до того, как я перенаправил пользователя. Дальнейшие исследования показали мне, что проблема в том, что новые браузеры не позволяют использовать безопасные куки-файлы без HTTPS-соединения, и, поскольку я выполняю PHP сеанс, прежде чем перенаправить пользователей в URL, возникла проблема.

Вы можете проверить Теория выше легко, а также вы можете воспроизвести, если вы будете sh. Надеюсь, это поможет, по крайней мере, вы можете исключить.

2 голосов
/ 18 марта 2020

Это было немного сложно, но я надеюсь, что нашел решение для вас. Я предполагаю (1) решит вашу проблему. Все остальное не является обязательным и должно помочь вам уменьшить некоторые потенциальные проблемы.

1. При использовании samesite = Strict

добавьте ваше доменное имя к параметрам по умолчанию ie. Я смог воспроизвести вашу проблему с вашим фрагментом кода. Мой браузер Opera не показывал повара ie и полностью их игнорировал.

Интересно, что при попытке запроса curl в CLI был доступен заголовок set-cookie, который начал меня сильно озадачивать.

Если вы включите samesite=Strict, тогда вы ДОЛЖНЫ установить свой домен в пределах session_set_cookie_params, иначе мой браузер его игнорировал.

session_set_cookie_params(3600, '/', 'cookie-test.local');

решал проблему для меня.

2. Ваш сайт отправляет заголовок "set-cook ie" дважды с различными настройками

$ curl -I -X GET https://www.jabcreations.com/ | grep set-cookie
set-cookie: session2=e633d6fcb7fb426f86b065173bc6c8ab; expires=Wed, 18-Mar-2020 20:05:21 GMT; Max-Age=3600; path=/; secure; HttpOnly; SameSite=Strict
set-cookie: session2=e633d6fcb7fb426f86b065173bc6c8ab; expires=Wed, 18-Mar-2020 20:05:21 GMT; Max-Age=3600; path=/; domain=www.jabcreations.com

Я смог воспроизвести это с помощью следующего кода. Мой Opera-браузер также показывает мне ошибку в заголовке специфической c запроса. Рядом с поваром ie вы увидите маленький желтый значок «опасности». В моем случае это показало, что я пытался использовать безопасный повар ie для незащищенного соединения.

setcookie('session2', session_id(), time() + 3600, '/', "", false, false);
setcookie('session2', session_id(), time() + 3600, '/', "", true, true);

В этом случае я бы попытался определить ваше использование функции session_ и ваше setcookie() Применение.

Поскольку вы не используете какой-либо конкретный фреймворк, я бы дал первое предположение для автозагрузчика и / или оператора include или require, который используется дважды внутри вашего проекта.

Пожалуйста, дайте Я знаю, как вы загружаете свои файлы внутри вашего проекта.

3. (Offtopi c) Ваш сайт отправляет файлы cookie для ваших активов

Я не уверен, действительно ли это нужно вашим ресурсам, но я бы не стал отправлять файлы cookie для ваших активов. Я бы сказал, что в большинстве случаев неуместно управлять поваром ie на ваших ресурсах. Я бы их убрал. Это уменьшит количество потенциальных конфликтов повара ie в вашем браузере, и проблемы повара ie могут быть уменьшены до соответствующих запросов.

4. (Offtopi c) Минимальное изменение вашего состояния

Я не уверен, что HTTPS всегда строчные или нет, но php $ _ документация SERVER состояния:

Установите непустое значение, если скрипт запрашивался по протоколу HTTPS. Примечание: обратите внимание, что при использовании ISAPI с IIS значение будет off , если запрос не был сделан через протокол HTTPS.

В соответствии с этим я бы изменил условие на :

if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
   // ssl mode..
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...