“PHP设置cookie”;SameSite=严格;?
我最近读到了“同一站点”属性的“RFC6265”,我看了一些文章,其中提到2016年4月,Chrome 51和Opera 39实现了“同一站点”属性 我想知道当前的PHP是否支持使用此属性创建cookie 参考:“PHP设置cookie”;SameSite=严格;?,php,security,cookies,Php,Security,Cookies,我最近读到了“同一站点”属性的“RFC6265”,我看了一些文章,其中提到2016年4月,Chrome 51和Opera 39实现了“同一站点”属性 我想知道当前的PHP是否支持使用此属性创建cookie 参考: 根据,这似乎是PHP7.3的问题。投票结果显示,对cookie相关函数的更通用扩展正在实现中,php.ini文件中可能还有一个新的键 但正如Marc B所写的,您可以使用header()函数调用,我会在一些文件中使用它来包含其他初始内容。[重要更新:正如@caw在下面指出的,这
- 根据,这似乎是PHP7.3的问题。投票结果显示,对cookie相关函数的更通用扩展正在实现中,php.ini文件中可能还有一个新的键
但正如Marc B所写的,您可以使用header()函数调用,我会在一些文件中使用它来包含其他初始内容。[重要更新:正如@caw在下面指出的,这是一种黑客行为。现在停止使用它来避免令人不快的意外!或者至少在PHP版本检查中使用它,如
if(PHP\u version\u ID<70300){…}else{…}
]
似乎您可以滥用PHP的“setcookie”函数的“path”或“domain”参数来潜入SameSite属性,因为PHP不会转义分号:
setcookie('samesite-test', '1', 0, '/; samesite=strict');
然后PHP发送以下HTTP头:
设置Cookie:samesite test=1;path=/;samesite=strict
我几分钟前才发现这一点,所以请自行测试!我使用的是PHP7.1.11。1.For PHP>=v7.3
您可以使用$options
数组设置samesite
值,例如:
setcookie($name, $value, [
'expires' => time() + 86400,
'path' => '/',
'domain' => 'domain.com',
'secure' => true,
'httponly' => true,
'samesite' => 'None',
]);
samesite元素的值应为None
、Lax
或Strict
阅读更多的文章
2.对于PHPHeader always edit Set-Cookie (.*) "$1; SameSite=Lax"
这将使用SameSite=Lax
标志更新所有cookie
请参阅此处的更多信息:
2.2使用Nginx配置设置SameSite cookies
同样,这也会用SameSite=Lax
标志更新所有cookie
请参阅此处的更多信息:
2.3使用标题方法设置SameSite cookies
正如我们所知,cookies只是HTTP请求中的一个标头,具有以下结构
Set-Cookie: key=value; path=/; domain=example.org; HttpOnly; SameSite=Lax
因此,我们可以使用header
方法设置cookie
header("Set-Cookie: key=value; path=/; domain=example.org; HttpOnly; SameSite=Lax");
事实上,Symfony不是在等待PHP7.3,而是已经在幕后完成了
基于,这是我用来支持php=7.3的方法:
/**
*在PHP7.2(当前产品)和php>=7.3(当我们到达那里时)中都支持samesite cookie标志
*发件人:https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.md 及https://stackoverflow.com/a/46971326/2308553
*
*@见https://www.php.net/manual/en/function.setcookie.php
*
*@param string$name
*@param字符串$value
*@param int$expire
*@param string$path
*@param string$domain
*@param bool$secure
*@param bool$httponly
*@param string$samesite
*@返回无效
*/
函数setCookieSameSite(
字符串$name,字符串$value,
int$expire,string$path,string$domain,
bool$secure,bool$httponly,字符串$samesite='None'
):无效{
如果(PHP_版本_ID<70300){
setcookie($name、$value、$expire、$path.';samesite='。$samesite、$domain、$secure、$httponly);
返回;
}
setcookie($name,$value[
'expires'=>$expire,
“路径”=>$path,
“域”=>$domain,
“samesite”=>$samesite,
“安全”=>$secure,
“httponly”=>$httponly,
]);
}
添加到Marty Aghajanyan的答案中(因为显然我可以回答,但还没有评论)
在Apache中通过mod_头与PHP结合使用对我来说在Apache 2.4.29(Ubuntu)中不起作用。在查看文档()时,我注意到“始终”条件在某些情况下无法从相同的响应头池中工作。因此,以下内容对我设置SameSite参数起到了作用。(在我的例子中,我为最近的Chrome 80更新设置了None)
文档还建议,如果您想覆盖所有的基础,您可以添加带有或不带“always”的指令,但我还没有对此进行测试。我编写了一个用于设置samesite cookies的类
它适用于所有PHP版本。
它还检查浏览器是否正确支持samesite参数
用法如下:
//set samesite strict php cookie
SameSiteCookieSetter::setcookie('samesite_test','testvalue', array('samesite' => 'Strict'));
值得一提的是,macOS和iOS上的Safari 12不会识别SameSite属性的值None,默认值Strict
版本13将接受“无”,但没有显式设置值,默认为“Lax”
这里有一个很好的解释:
有很多示例显示了如何设置此属性,但没有太多解释
如果需要跨源发送cookie,请使用None指令退出SameSite限制。None指令要求还使用Secure属性
将SameSite
设置为None
或Lax
的示例仅适用于跨域场景。如果您的代码不是跨域的,请使用Strict
在live网站上解决SameSite问题后,您可能会在为本地开发环境设置PHPSESSID方面遇到问题。特别是如果您在没有HTTPS的情况下工作,并且通过在主机文件中映射IP在本地使用真实域名
要在Chrome上解决这个问题,首先,您必须打开Chrome标志管理页面
chrome://flags/#same-site-by-default-cookies
并将这些标志设置为禁用
- “SameSite默认cookies”
- “没有SameSite的Cookie必须是安全的”
然后重启chrome
如果您访问过HTTPS站点一次,PHPSESSID的cookie仍然无法设置,您将不会有php会话。该安全cookie将已设置。因此您需要删除
//set samesite strict php cookie
SameSiteCookieSetter::setcookie('samesite_test','testvalue', array('samesite' => 'Strict'));
chrome://flags/#same-site-by-default-cookies
if(isset($_COOKIE["PHPSESSID"])){
header('Set-Cookie: PHPSESSID='.$_COOKIE["PHPSESSID"].'; SameSite=None');
}