如何在Codeigniter中设置session.cookie值httponly

时间:2014-08-17 10:53:47

标签: php codeigniter cookies

我正在使用Codeigniter框架进行开发,我必须在我的应用程序上应用一些安全性。我希望我的cookie具有httponly属性,可以通过一些配置更改在整个应用程序中应用。我在我的application / config文件中做了以下更改

$config['cookie_secure']    = TRUE;
$config['cookie_httponly'] = TRUE;

我为php.ini文件设置了更改

ini_set( 'session.cookie_httponly', 1 );

在上述更改后,我可以看到我的本地服务器上的cookie属性已更改为httponly,但是当我在实时服务器上部署应用程序时,它无法正常工作。我无法理解我需要应用哪些其他更改。

2 个答案:

答案 0 :(得分:3)

启用https的网站(例如https://www.samplewebsite.com)支持httpsonly Cookie,您无需手动设置。只需要求您的服务提供商将“cookie_httponly”值更改为true,或者如果您有服务器访问权限,请自行设置。您还可以将以下代码应用于.htaccess文件。

Header edit Set-Cookie ^(.*)$ $1;Secure;HttpOnly
Header set Set-Cookie "%{http_cookie}e; HTTPOnly" env=http_cookie   

答案 1 :(得分:0)

我在这里遇到了类似的问题,答案非常简单。您需要在其中一个CodeIgniter系统库system / libraries / Session.php中修改一个函数,如下所示:

/**
* Write the session cookie
 *
 * @access  public
 * @return  void
 */
function _set_cookie($cookie_data = NULL)
{
    if (is_null($cookie_data))
    {
        $cookie_data = $this->userdata;
    }

    // Serialize the userdata for the cookie
    $cookie_data = $this->_serialize($cookie_data);

    if ($this->sess_encrypt_cookie == TRUE)
    {
        $cookie_data = $this->CI->encrypt->encode($cookie_data);
    }
    else
    {
        // if encryption is not used, we provide an md5 hash to prevent userside tampering
        $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
    }

    $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time();

    // Set the cookie
    setcookie(
                $this->sess_cookie_name,
                $cookie_data,
                $expire,
                $this->cookie_path,
                $this->cookie_domain,
                $this->cookie_secure,
                true// <-- SYSTEM LIBRARY MODIFICATION TO SET httpOnly to true!!
            );
}

上述函数_set_cookie()需要一个额外的参数,它将强制所有cookie都是HTTP Only。 您可以扩展此库并添加该函数的新版本(推荐),但为了简单起见,我在此处对其进行了硬编码。