在 PHP 中的 PHPSESSID cookie 上设置 httpOnly 和安全

Posted

技术标签:

【中文标题】在 PHP 中的 PHPSESSID cookie 上设置 httpOnly 和安全【英文标题】:Set httpOnly and secure on PHPSESSID cookie in PHP 【发布时间】:2011-10-12 21:46:51 【问题描述】:

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

我找到了http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-httponly。有更好的建议吗?

谢谢

【问题讨论】:

那和session.cookie_secure 基本上就是这样。我认为没有更简单/更好的方法。 您是否知道 ini_set() 与 session.cookie_httponly 和 session.cookie_secure 一起工作得很好?只需在调用 session_start() 之前设置它们。 【参考方案1】:

我认为最好的是: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 ]]]] )

【讨论】:

是的,但这会影响所有 cookie? 这只会影响单个站点的会话 cookie (PHPSESSID)。你想要一个服务器范围的设置吗? 我的错。暂时失明...结合 session_get_cookie_params() 来获取生命周期、路径等,然后将它们传递回 session_set_cookie_params() 将完成我需要的一切。谢谢! 我建议在 php.ini 级别进行设置。原因是很容易弄乱 PHP 代码。例如,一些复杂的 PHP 应用程序可以通过直接 html 文档请求、AJAX 请求、cron 任务等来访问,这些应用程序可能有多个调用 start_session() 的地方。此外,配置可能已关闭。只是我的输入,我认为这在 php.ini 中作为 session.cookie_domain=1session.cookie_secure=1 最有意义。简单,完成。 ryanm :根据 php.ini 和 php.net/manual/en/… session.cookie_domain 是域的字符串,而不是布尔值; cookie 对其有效的域。 ; php.net/session.cookie-domain session.cookie_domain =【参考方案2】:

我无法让安全标志与session_set_cookie_params(...) 一起使用,所以我所做的是,在session_start() 设置PHPSESSID 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 中检查 PHPSESSID cookie 时,它​​的“Send for”属性设置为“Encrypted connections only”,其“Expires”属性设置为“At end of session”。

【讨论】:

session_set_cookie_params 不行时,这个方法对我有用。 还有一个更简洁的替代方案:session_regenerate_id()。见***.com/a/27242745/560114。 (不确定在较新版本的 PHP 中是否仍然需要这种解决方法 [您的或 session_regenerate_id()]。) 没关系,事实证明我被缓存抛弃了——只需使用 ini_set() 设置 session.cookie_httponly 和 session.cookie_secure 或将设置放在 htaccess 文件中就足够了,至少自 PHP 5.3.3 起。【参考方案3】:
ini_set('session.cookie_httponly', 1);

more information here 在 PHP 文档中

【讨论】:

注意:还有一个session.cookie_secure 设置。 如果您使用 Apache 模块,也可用于设置策略:php_flag session.cookie_httponly on and php_flag session.cookie_secure on【参考方案4】:

如果您使用的是 Apache,请在您的 .htaccess 上尝试此操作

php_value session.cookie_httponly 1

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

为此目的使用 .htaccess 只会减慢您的应用程序的速度。

我认为最好将此 sn-p 添加到您的主配置文件(例如 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 的人

【讨论】:

【参考方案7】:

对于 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文件中。

【讨论】:

【参考方案8】:

PHP >=7.0

以来的更优雅的解决方案
session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);

session_start

session_start options

【讨论】:

以上是关于在 PHP 中的 PHPSESSID cookie 上设置 httpOnly 和安全的主要内容,如果未能解决你的问题,请参考以下文章

$_SESSION 创建但 $_SERVER['HTTP_COOKIE'] 中没有 PHPSESSID

PHP PHPSESSID 利用混乱

Cookie “PHPSESSID” 将很快被视为针对 <file> 的跨站点 cookie,因为该方案不匹配

如何在 Wordpress 中更改 PHPSESSID cookie 域名?

出现多个sessid

PHP.ini 中的session 相关设置