在PHP中的PHPSSID cookie上设置httpOnly和secure


Set httpOnly and secure on PHPSESSID cookie in PHP

在PHPSSID cookie上设置httponly和安全标志的推荐方法是什么?

我发现http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-httponly。有什么更好的建议吗?

感谢

ini_set('session.cookie_httponly', 1);

有关PHP文档的更多信息

在我看来,最好是:http://www.php.net/manual/en/function.session-set-cookie-params.php

void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )

我无法使安全标志与session_set_cookie_params(...)一起工作,所以我所做的是,在session_start()设置PHPSSID cookie后,我用setcookie(...)重置它。最后一个参数true使cookie具有一个安全标志。

<?php  
session_start();  
$currentCookieParams = session_get_cookie_params();  
$sidvalue = session_id();  
setcookie(  
    'PHPSESSID',//name  
    $sidvalue,//value  
    0,//expires at end of session  
    $currentCookieParams['path'],//path  
    $currentCookieParams['domain'],//domain  
    true //secure  
);  
?>

当我在Firefox中检查PHPSSID cookie时,其"发送"属性被设置为"仅加密连接",其"过期"属性被设为"会话结束时"。

PHP>=7.0以来的更优雅的解决方案

session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);

会话启动

session_start选项

我通过HTTPS使用Apache httpd,设置session.cookie_httponly = 1&session.cookie_secure = 1适用于我。

对于一个WordPress网站,我使用以下PHP代码修复了它:

add_action('init', 'start_session', 1);
function start_session() {
    if(!session_id()) {
        session_start();
        $currentCookieParams = session_get_cookie_params();
        $sidvalue = session_id();
        setcookie(
            'PHPSESSID',//name
            $sidvalue,//value
            0,//expires at end of session
            $currentCookieParams['path'],//path
            $currentCookieParams['domain'],//domain
            true //secure
        );
    }
}
add_action('wp_logout','end_session');
add_action('wp_login','end_session');
function end_session() {
    session_destroy();
}

将代码粘贴到functions.php文件中。

如果您正在使用Apache,请在.htaccess 上尝试

php_value session.cookie_httponly 1

为此目的使用.htaccess只会降低应用程序的速度。

我认为最好将这个片段添加到主配置文件(例如config.php(或主包含文件(例如global.php(中

    // Prevents javascript XSS attacks aimed to steal the session ID
    ini_set('session.cookie_httponly', 1);
    // Prevent Session ID from being passed through  URLs
    ini_set('session.use_only_cookies', 1);

如果您使用https://而不是http://,那么也要执行

     // Uses a secure connection (HTTPS) 
     ini_set('session.cookie_secure', 1); 

此方法也适用于那些无法访问php.ini 的用户