Cookie仍然使用ini_set设置在HTTP上('session.cookie_secure',1);

时间:2013-12-30 11:27:55

标签: cookies php php-ini

我的配置文件如下所示:

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,但值相同。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

session_start();

答案 1 :(得分: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']."'";
?>

将设置更改为“off”,在第二次重新加载后,您将看到会话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;;; */
  //}
?>

How to find out if you're using HTTPS without $_SERVER['HTTPS']

注意:这看起来像PHP中的安全漏洞,因为会话ID将以明文形式传输:根据OWASP,这正是SecureFlag旨在防止的。 https://www.owasp.org/index.php/SecureFlag ---我使用的是PHP 5.5.8;也许这是该语言的“特征”。该定义似乎仅针对客户端而非服务器。