Ранее установленный файл cookie "Samesite: Strict" недоступен в document.cookie Firefox и Safari
У нас есть файл cookie для XSRF/CSRF в начале сеанса пользователя. В какой-то момент пользователь переходит на другой домен (например, для оплаты), выполняет некоторые действия и переходит на наш домен. По возвращении в наш домен Firefox и Safari не могут прочитать файлы cookie, установленные как samesite: Strict, Chrome can. В случае Chrome и Firefox (но не Safari) они отображаются в разделе инструментов разработчика для файлов cookie.
В этом же объяснении на MDN объясняется, что при будущих запросах cookie будет отправляться вместе с заголовками запросов. Для всех трех браузеров это так. Объяснение не дает однозначного ответа: возможно ли прочитать этот файл cookie через document.cookie? Для Firefox, Safari и Chrome мы можем читать файлы cookie "Lax", но только для Chrome мы можем читать файлы "Strict". Это также верно при обновлении страницы, но не при открытии новой вкладки (т.е. только через навигацию).
Это ошибка в Safari и Firefox или в Chrome - или спецификация неубедительна? Какой будет спецификация (w3?)?
Это может быть легко воссоздано локально с веб-сервером с двумя vhosts, test.internalsite.com
а также test.externalsite.com
и эти страницы с некоторыми PHP:
<?php
setcookie("CSRFLax", "hiLax", array("path"=>"/", "samesite"=>"Lax", "domain"=>"test.internalsite.com"));
setcookie("CSRFStrict", "hiStrict", array("path"=>"/", "samesite"=>"Strict", "domain"=>"test.internalsite.com"));
?>
<html>
<body>External site
<p><a href="http://test.externalsite.com">Go to External site</a></p>
<p>Document cookie: <script>document.write(document.cookie);</script></p>
</body>
</html>
А также
<html>
<body>External site
<a href="http://test.internalsite.com">Go to internal Site</a>
</body>
</html>
0 ответов
В соответствии с рекомендациями нашего офицера безопасности, который не был склонен обсуждать возможность использования файлов cookie Lax вместо безопасных файлов cookie (что я вижу не иначе как по семантике), мы реализовали простой обходной путь, обновив файл страница. Это работает для получения строгих файлов cookie в Chrome и Safari.
var canReadStrictCookie = function(cookies) {
return cookies.toLowerCase().indexOf('mySameSiteSecureCookieName') !== -1;
};
if(document.location.href.indexOf('jmkCheck') === -1 && !canReadStrictCookie(document.cookie)){
document.location.href='?jmkCheck';
}
Я настоятельно рекомендую вам использовать настройку "Слабый", если вы сами контролируете файлы cookie. Название сбивает с толку, это не слабая безопасность (на самом деле это более безопасно, чем было до того, как был введен тот же сайт).