session_regenerate_id и атрибуты безопасности - PullRequest
0 голосов
/ 06 ноября 2018

У меня странная проблема, когда после регенерации идентификатора сеанса с помощью

session_regenerate_id(true);

Кажется, что cookie теряет свои флаги «Безопасный, HttpOnly».

Я могу сбросить cookie с помощью

$params = session_get_cookie_params();
setcookie("PHPSESSID", session_id(), 0, $params["path"], $params["domain"],
    true,  // this is the secure flag you need to set. Default is false.
    true  // this is the httpOnly flag you need to set

);

но veracode (который мы используем для тестирования безопасности) помечает его как неуверенный, потому что первый cookie (тот, который регенерируется) не имеет защищенных тегов HttpOnly в заголовке.

Вот пример заголовка

Cache-Control: no-store, no-cache, must-revalidate
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Tue, 06 Nov 2018 12:56:41 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=98
Location: home.php
Pragma: no-cache
Server: Apache
Set-Cookie: PHPSESSID=18a289a6c8d34b0df72dafc9d5e12c92; path=/
Set-Cookie: PHPSESSID=18a289a6c8d34b0df72dafc9d5e12c92; path=/; secure; HttpOnly

Veracode помечает проблему, поскольку первый файл cookie не имеет безопасных тегов httpOnly. Я предполагаю, что чтение только первого, или кажется, что они не отображаются по умолчанию, небезопасно. Или есть лучший способ добиться того, что они просят? Вот мой код.

session_start();

$_SESSION = array();
session_unset();
session_destroy();
session_start(); //Not sure if this is needed

session_regenerate_id(true);
$params = session_get_cookie_params();
setcookie("PHPSESSID", session_id(), 0, $params["path"], $params["domain"],
    true,  // this is the secure flag you need to set. Default is false.
    true  // this is the httpOnly flag you need to set

);

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

В вашей локальной папке PHP.ini settings (обычно она называется user.ini и находится в корневом каталоге HTML вашей учетной записи на веб-сайте), вы можете установить значения PHP.ini:

session.cookie_secure=1
session.cookie_httponly=1
session.use_only_cookies=1

, и это будет означать, что любое использование сеансовых файлов cookie этой учетной записью (данным веб-сайтом) будет соответствовать вышеуказанным требованиям.

Это намного лучше, чем кодировать эти требования в ваших сценариях, так как это может быть легко пропущено или пропущено в дальнейшем.

Ваш сценарий может быть:

session_start();
...
session_regenerate_id(true);

И вы будете знать, что обо всем остальном позаботятся автоматически.


Вы можете прочитать немного больше о безопасности сеанса ЗДЕСЬ .

0 голосов
/ 06 ноября 2018

Вы можете

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

до session_start()

session_unset, destroy and start тогда не нужен. Также не присваивайте значение $_SESSION, поскольку вы перезаписываете данные сеанса.

https://secure.php.net/manual/en/function.session-set-cookie-params.php

...