Samesite session cook ie настройка - пояснение в форме сообщения с другого сайта - PullRequest
1 голос
/ 09 июля 2020

Интересно, может ли кто-нибудь пояснить, почему это происходит при использовании samesite в сеансе php Cook ie.

example.com имеет следующее:

session_name('Example_Login');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_start();

test.com имеет следующую форму публикации на example.com:

<form method="post" action="https://www.example.com/" target="_blank" autocomplete="off">
    <input type="hidden" name="username" value="demo_user">
    <input type="hidden" name="password" value="demo_password">
    <input type="hidden" name="signin" value="signin">
    <button type="submit" name="submit">Login</button>
</form>

example.com получает сообщение, а с php я использую переменные $ _POST, отправленные для проверки входа в систему учетные данные и войдите в систему. Если эти значения действительны, пользователь не авторизуется на сайте example.com. Если я изменю параметр samesite в сеансе cook ie на example.com на 'lax', опубликованная форма будет работать должным образом.

Я прочитал параметр samesite перед его добавлением и ничего не увидел это запомнилось мне, где это повлияет на сообщения / получение. Что мне здесь не хватает? Я не понимаю, как параметр samesite КАКИ-либо влияет на то, что я здесь делаю. Я отправил сообщение из другого домена, получил переменные и сделал несколько logi c с php ... какое отношение имеет параметр samesite для сеанса cook ie к чему-либо здесь?

ОБНОВЛЕНИЕ:

Я немного отладил. Переменные сообщения отправляются и принимаются нормально, сеанс создается на example.com и создает множество переменных $ _SESSION, et c. Я сузил проблему до перенаправления, которое происходит после проверки имени пользователя / пароля в php. Если пользователь / пароль правильный и учетная запись существует, я сохраняю информацию о пользователе в $ _SESSION, тогда я вызываю следующее в php:

header("Location: /main.php");
exit();

Перенаправление происходит и при достижении main. php $ _SESSION пусто. Все его переменные исчезли. Я повторил это, и он показывает следующее:

Array
(
    [user] => Array
        (
            [session] => 1
        )

)

Я переключаю параметр samesite на 'lax'. Запустите ту же самую отладку, и $ _SESSION заполнится моей пользовательской информацией, как и ожидалось, которая была помещена туда перед перенаправлением.

Я также изменил свое перенаправление на абсолютное как header("Location: https://www.example.com/main.php");, чтобы увидеть, повлияло ли это, но проблема все еще остается.

Итак, мой вопрос теперь ... при использовании samesite='strict' в моем сеансе ... почему сеанс очищается после перенаправления на страницу в том же домене?

ОБНОВЛЕНИЕ 2:

Я изменил путь сохранения сеанса на другое место специально для отладки и посмотреть, что произойдет. Когда он достигает example.com, он создает файл сеанса, и значения, которые я добавил в него, уже там. Когда он достигает example.com/main.php (перенаправление), он создает новый файл сеанса, как показано выше. Мои настройки сеанса и запуск находятся в отдельном файле, который требуется в первую очередь на этих страницах:

session_name('Example_Login');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_start();

Итак, с samesite = 'strict' выше создается новый сеанс, но с samesite = 'lax' он использует тот же файл сеанса, что и на предыдущей странице. Что дает? Я вижу, где что-то идет не так, но не вижу, почему это происходит или как это исправить.

ОБНОВЛЕНИЕ 3:

Создан очень простой тест, чтобы продемонстрировать, что происходит и почему. См. Ответ ниже. Можно целый день спорить со мной, объясняя, почему это работает именно так, но я думаю, что лог c, происходящий здесь, ошибочен.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

SameSite=Strict означает, что повар ie не будет отправляться на межсайтовые запросы, которые включают межсайтовые POST запросы и перенаправления, инициированные межсайтовым POST запросом.

SameSite=Lax - правильный вариант для сеансового повара ie здесь. Возможность использовать здесь Strict не лучше и не безопаснее, это слишком ограничительно для этого варианта использования.

0 голосов
/ 09 июля 2020

Я свел все это до простого теста.

example.com имеет две страницы:

test1. php

<?php

//session name
session_name('Test');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_save_path($_SERVER['DOCUMENT_ROOT'].'/sessions');
session_start();

//session stuff
$_SESSION['sessiontest'] = 'worked';

//cookie stuff
setcookie('testing', 'worked', ['expires' => 0, 'path' => '/', 'domain' => 'example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);

//redirect to the other page
header("Location: /test2.php");
exit();

?>

test2 . php

<code><?php

//session name
session_name('Test');
session_set_cookie_params(['lifetime' => 0, 'path' => '/', 'domain' => '.example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'strict']);
session_save_path($_SERVER['DOCUMENT_ROOT'].'/sessions');
session_start();

echo '<pre>'.print_r($_SESSION,1).'
'; echo '
'.print_r($_COOKIE,1).'
'; ?>

test.com

<a href="https://www.example.com/test1.php">go to test</a>

Если вы начинаете с test.com, сеанс и готовите ie (создано на example.com/test1.php) пусты на example.com/test2.php. Все это связано с использованием цепочки и logi c для samesite, что, на мой взгляд, в данном случае ошибочно. На сайте, который должен защищать "извне", СОЗДАЮТСЯ сеанс и блокируемая им программа cook ie. Я уверен, что у кого-то будет аргумент, оправдывающий это, но, насколько я понимаю, все это было создано для смягчения результатов плохого кодирования ... и в этом случае ... мешает законному коду работать должным образом. . Этот пример показывает, что я ничего не `` использую '' с test.com ... но из-за того, что при переходе на example.com/test1.php происходит перенаправление, он видит сеанс и готовит ie, созданное на нем, как больше или менее "плохо" при достижении example.com/test2.php, потому что цепочка началась с test.com.

...