会话cookie http&安全标志 - 你如何设置这些?

时间:2014-03-06 10:33:34

标签: php linux security

刚收到安全审核的结果 - 除了两件事之外一切都清楚

没有http标志的会话cookie。

没有设置安全标志的会话cookie。

应用程序以php编码,修复建议如下:

  1. 使用仅http标志设置会话cookie
  2. 使用安全标志设置会话cookie
  3. 我查看过示例,但并不完全了解如何在Linux服务器上实现。我无法访问 .ini 文件。是否可以在htaccess文件中设置它们?

    或者,我在代码中如何以及在何处实现?

4 个答案:

答案 0 :(得分:39)

您可以在发送标头之前设置它们。只需在代码中添加以下这些行。

<?php
// **PREVENTING SESSION HIJACKING**
// Prevents javascript XSS attacks aimed to steal the session ID
ini_set('session.cookie_httponly', 1);

// **PREVENTING SESSION FIXATION**
// Session ID cannot be passed through URLs
ini_set('session.use_only_cookies', 1);

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

答案 1 :(得分:33)

由于您要求.htaccess,此设置为PHP_INI_ALL,只需将其放入.htaccess:

php_value session.cookie_httponly 1
php_value session.cookie_secure 1

请注意,会话Cookie只会在此之后通过 https 请求发送。如果你在非安全的http页面中丢失了一个会话,这可能会让你感到惊讶(但是在评论中指出的话,首先是配置的重点......)。

答案 2 :(得分:1)

我知道这是专门说他们没有访问.ini文件的权限,但是对于那些通过搜索结果到达此处的人,.ini设置如下:

session.cookie_httponly = 1
session.cookie_secure = 1

默认情况下,大多数ini文件中已经存在cookie_secure,但已将其注释掉。因此取消注释该行并设置1。 httponly行也已经存在,但未注释掉,但默认为0。因此,您必须查找下来并进行设置。

答案 3 :(得分:0)

在使用 session_set_cookie_params 开始会话之前,您也可以使用 session_start 设置这些参数。

这是我的 php 会话类的一部分/开始,它自动将一些参数设置为正确的值,将其他参数设置为一些默认值。您可以通过使用参数 $moreoptions 覆盖它们来更改它们。

class Session {

/**
* The flag to define if we work under SSL
* @var bool
* @access private
*/
private static bool $IS_SSL;

/**
* The session cookie parameters
* @var array<string,mixed>
* @access private
*/
private static array $cookieparams = array('lifetime' => 86400,
                                           'path' => '/',
                                           'httponly' => true,
                                           'samesite' => 'Strict');

/**
* Starts the session with session_start()
*
* Note: If the session already has started nothing will happen
* @param array<string,mixed> $moreoptions   Optional: Array with cookie params to overrule the defaults
* @param string $sessionname                Optional: Another name for the session
* @return void
* @access public
*/
public static function start(array $moreoptions = array(), string $sessionname = '') : void {
    if (!self::hasStarted()) {
        self::$IS_SSL = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on';

        if (!empty($sessionname)) {
            session_name($sessionname);
        } elseif (self::$IS_SSL) {
            session_name('__Secure-PHPSESSID');
        }

        self::$cookieparams['domain'] = $_SERVER['SERVER_NAME'];
        self::$cookieparams['secure'] = self::$IS_SSL;

        session_set_cookie_params(array_merge(self::$cookieparams, $moreoptions)); 
        session_start();
    }
}

/**
* Tests if a session was started
* @return bool True if a session is running
* @access public
*/
public static function hasStarted() : bool {
    return session_status() === PHP_SESSION_ACTIVE;
}

}