如何告诉 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 控制台,这需要设置为“无”:

设置了与 URL 处的跨站点资源关联的 cookie,但未设置该SameSite属性。SameSite=None它已被阻止,因为 Chrome 现在仅在使用和设置时才提供带有跨站点请求的 cookie Secure。您可以在应用程序>存储>Cookies 下的开发人员工具中查看 cookie,并在 URL 和 URL 中查看更多详细信息。

因此,我无法再设置跨站点 cookie。解决方法是什么?


慕娘9325324
浏览 432回答 4
4回答

慕工程0101907

您可以使用 将值设置为“无” 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 不需要它,但浏览器需要它。

守候你守候我

ini_set('session.cookie_secure', "1"); ini_set('session.cookie_httponly', "1"); ini_set('session.cookie_samesite','None'); session_start();phpinfo 中的 php 7.4 相同站点phpinfo 中不存在 php 7.2 samesite$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();

青春有我

坏的:session.cookie_samesite=None正确的:session.cookie_samesite="None"在这里解释

MMMHUHU

如果使用 nginx,也可以使用 lua 修改 cookie。这有点 hacky,但我发现它适用于遗留网站:    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    location ~ \.php$ {            include snippets/fastcgi-php.conf;            fastcgi_pass unix:/run/php/php5.6-fpm.sock;            # This is the relevant part:            header_filter_by_lua '                    local cookies = ngx.header.set_cookie                    if cookies then                            if type(cookies) ~= "table" then                                    cookies = {cookies}                            end                            local gsub = string.gsub                            local changed                            for i, cookie in ipairs(cookies) do                                    local new_cookie = gsub(cookie, "^PHPSESSION=(.*)", "PHPSESSION=%1; Samesite=strict", 1)                                    if new_cookie ~= cookie then                                            cookies[i] = new_cookie                                            changed = true                                    end                            end                            if changed then                                    ngx.header.set_cookie = cookies                            end                    end            ';            # End Lua    }您可能需要调整正则表达式 (gsub),但我发现它运行良好。
打开App,查看更多内容
随时随地看视频慕课网APP