为了账号安全,请及时绑定邮箱和手机立即绑定

如何告诉 PHP 将 SameSite=None 用于跨站点 cookie?

如何告诉 PHP 将 SameSite=None 用于跨站点 cookie?

PHP
慕娘9325324 2022-07-09 09:46:22
根据这里的文章https://php.watch/articles/PHP-Samesite-cookies和 PHP 文档在https://www.php.net/manual/en/session.security.ini.php,只有 2在 PHP 7.3 中添加的此新功能的可能配置选项:session.cookie_samesite=松懈session.cookie_samesite=严格然而,根据 Chrome 控制台,这需要设置为“无”:设置了与 URL 处的跨站点资源关联的 cookie,但未设置该SameSite属性。SameSite=None它已被阻止,因为 Chrome 现在仅在使用和设置时才提供带有跨站点请求的 cookie Secure。您可以在应用程序>存储>Cookies 下的开发人员工具中查看 cookie,并在 URL 和 URL 中查看更多详细信息。因此,我无法再设置跨站点 cookie。解决方法是什么?
查看完整描述

4 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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


查看完整回答
反对 回复 2022-07-09
?
守候你守候我

TA贡献1802条经验 获得超10个赞

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

phpinfo 中的 php 7.4 相同站点

//img1.sycdn.imooc.com//62c8de1b0001bac210070367.jpg

phpinfo 中不存在 php 7.2 samesite

//img1.sycdn.imooc.com//62c8de280001520009920351.jpg

$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();


查看完整回答
反对 回复 2022-07-09
?
青春有我

TA贡献1784条经验 获得超8个赞

坏的:

session.cookie_samesite=None

正确的:

session.cookie_samesite="None"

在这里解释


查看完整回答
反对 回复 2022-07-09
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

如果使用 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),但我发现它运行良好。


查看完整回答
反对 回复 2022-07-09
  • 4 回答
  • 0 关注
  • 426 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信