刚收到安全审核的结果 - 除了两件事之外一切都清楚
没有http标志的会话cookie。
没有设置安全标志的会话cookie。
应用程序以php编码,修复建议如下:
我查看过示例,但并不完全了解如何在Linux服务器上实现。我无法访问 .ini 文件。是否可以在htaccess文件中设置它们?
或者,我在代码中如何以及在何处实现?
答案 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;
}
}