我希望任何人都能给我一些解决我问题的想法。我正在尝试应用SameSite cookie以使会话正常工作,但似乎不起作用。访问过的网站html:
<iframe src="https://www.example.com/test/iframe.php"></iframe>
iframe源站点:
<?php
header('Set-Cookie: cross-site-cookie=PHPSESSID; SameSite=None; Secure');
session_start();
if(!isset($_SESSION['test'])){
echo 1;
$_SESSION['test'] = 'ee2';
}else{
echo $_SESSION['test'];
}
如果我访问该网站,我仍然在浏览器控制台中收到A cookie associated with a cross-site resource at https://www.example.com/ was set without the SameSite attribute. It has been blocked, as Chrome now only delivers cookies with cross-site requests if they are set with SameSite=None and Secure.
消息,并且会话未保存。
我错过了什么吗?如果设置了跨站点cookie,为什么在控制台中会收到此消息?会话无法工作的原因可能是什么?我正在使用php 7.1.33。如果我直接打开iframe,它会正常工作,如果我使用浏览器打开该网站(默认情况下未启用Samesite cookie标志进行测试),它也可以正常工作。
答案 0 :(得分:7)
我通过编辑.htaccess解决了它
<ifmodule mod_headers.c>
Header always edit Set-Cookie ^(.*)$ $1;SameSite=None;Secure
</ifmodule>
答案 1 :(得分:3)
我暂时使用htaccess解决了我的问题:
Header edit Set-Cookie ^(.*)$ $1;SameSite=None;Secure
答案 2 :(得分:3)
设置会话和Cookie参数php:https://www.php.net/manual/en/function.session-set-cookie-params.php 浏览器: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
<?php
session_set_cookie_params(["SameSite" => "Strict"]); //none, lax, strict
session_set_cookie_params(["Secure" => "true"]); //false, true
session_set_cookie_params(["HttpOnly" => "true"]); //false, true
session_start(); //everything before this
或php.ini:
[Session]
session.cookie_samesite = "Strict"
session.cookie_secure = 1
session.cookie_httponly = 1
答案 3 :(得分:1)
我为此写了一个班。
https://github.com/ovunctukenmez/SameSiteSessionStarter
它还会检查浏览器是否正确支持samesite参数。
代替session_start();
像这样使用:
<?php
require_once 'SameSiteSessionStarter.php';
//start samesite none php session
SameSiteSessionStarter::session_start();
答案 4 :(得分:1)
我通过以下方式解决了该问题:
<?php
session_start();
header('Set-Cookie: PHPSESSID= ' . session_id() . '; SameSite=None; Secure');
答案 5 :(得分:0)
我发现 this worked for me - 将 SameSite 设置为“无” - 以及有关 here 含义的更多信息。
显然,浏览器不再允许你在 iframe 中设置你想要的任何东西,我试图在 iframe 中处理一个会话,加载到不同的域上,在这样做时,我注意到正在创建一个不同的会话OTHER 域而不是我在 iframe 中加载的域。这似乎已经解决了。我仍在测试中,但这是我今天早上开始寻找修复程序以来第一件奏效的事情。