我的配置文件如下所示:
ini_set('session.cookie_secure',1);
ini_set('session.cookie_httponly',1);
ini_set('session.use_only_cookies',1);
session_start();
//database connection part...
通过 https://www.mysite.com/config.php 访问此页面时,PHPSESSID cookie 的“安全”插槽为空。通过 http://www.mysite.com/config.php 访问该页面会显示完全相同的 cookie,具有相同的值。
我是新手,所以也许我错了,但这不应该发生,对吧?我做错了什么?
谢谢!
ini_set方法需要一个字符串值,因此请将代码更新为以下内容:
ini_set('session.cookie_secure', '1');
ini_set('session.cookie_httponly', '1');
ini_set('session.use_only_cookies', '1');
session_start();
无论是HTTP还是HTTPS,会话id都会发送到客户端。您必须在代码中做出这种区分,因为显然 PHP 没有。
在 http(不是 https)上摆弄这个,将 cookie_secure 设置为“on”。您将看到 cookie 被传输到客户端。 (此处使用您最喜欢的 cookie 分析。)但是,重新加载时,cookie 不会提交回服务器。 cookie_secure - 客户端将仅通过安全连接传输cookie。
<?php
ini_set('session.cookie_secure','on');
session_name('test');
session_start();
session_regenerate_id();
echo "test: '".$_COOKIE['test']."'";
?>
将设置更改为“关闭”,第二次重新加载后,您将看到会话 cookie 被传输回服务器。
验证您是否处于安全连接,甚至应该调用 session_start:
<?php
$secure = isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] != "" );
if(!$secure) {
$r = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
header("Location: $r");
exit("use https!");
}
//if($secure) {
session_start();
/* and other secure happenings;;; */
//}
?>
或如何确定您是否使用不带 $_SERVER['HTTPS'] 的 HTTPS
注意:对我来说,这看起来像是 PHP 中的一个安全缺陷,因为会话 id 将以明文形式传输:根据 OWASP,这正是 SecureFlag 旨在防止的情况。 https://www.owasp.org/index.php/SecureFlag --- 我正在使用 PHP 5.5.8 ;也许这是该语言的一个“特征”。该定义似乎仅针对客户端而不是服务器。
看来你是对的,我遇到了同样的问题。要确保会话 cookie 在 HTTPS 安全通道中可用,只需将 cookie 重命名为前缀为“__Secure-”。例如:
session_start( ['name' => '__Secure-SessionID' ] );
如果需要,将其他设置添加到数组中。如果您在本地环境上进行测试,您可能会在非安全通道上执行此操作。要解决这个问题,请使用常量:
define( 'DEBUG', strpos( $_SERVER['SERVER_NAME'], 'localhost' ) !== false );
session_start( ['name' => DEBUG ? 'SessionID' : '__Secure-SessionID' ] );
我认为这是 PHP 中的错误(在 8.2.11 上测试),并且与文档相矛盾。