Cookie 仍通过 ini_set('session.cookie_secure',1); 在 HTTP 上设置

问题描述 投票:0回答:3

我的配置文件如下所示:

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,具有相同的值。

我是新手,所以也许我错了,但这不应该发生,对吧?我做错了什么?

谢谢!

cookies php php-ini
3个回答
4
投票

ini_set方法需要一个字符串值,因此请将代码更新为以下内容:

ini_set('session.cookie_secure', '1');
ini_set('session.cookie_httponly', '1');
ini_set('session.use_only_cookies', '1');

session_start();

0
投票

无论是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 ;也许这是该语言的一个“特征”。该定义似乎仅针对客户端而不是服务器。


0
投票

看来你是对的,我遇到了同样的问题。要确保会话 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 上测试),并且与文档相矛盾。

© www.soinside.com 2019 - 2024. All rights reserved.