Мой конфигурационный файл выглядит так:
ini_set('session.cookie_secure',1); ini_set('session.cookie_httponly',1); ini_set('session.use_only_cookies',1); session_start(); //database connection part...
При доступе к этой странице через https://www.mysite.com/config.php , файл cookie PHPSESSID в слоте «Безопасный» пуст. Посещение страницы через http://www.mysite.com/config.php показывает тот же самый файл cookie с тем же значением.
Я новичок в этом, поэтому, возможно, я ошибаюсь, но этого не должно быть, не так ли? Что я делаю не так?
Благодаря!
Идентификатор сеанса будет отправлен клиенту независимо от HTTP или HTTPS. Вы должны сделать это различие в своем коде, потому что, по-видимому, PHP этого не делает.
Справьтесь с этим на http (не https), оставьте cookie_secure установленным на «on». Вы увидите, что файл cookie передается клиенту. (Используйте здесь свой любимый анализ файлов cookie.) Но при перезагрузке куки-файлы не отправляются обратно на сервер. cookie_secure – клиент будет передавать cookie только через безопасное соединение.
<?php ini_set('session.cookie_secure','on'); session_name('test'); session_start(); session_regenerate_id(); echo "test: '".$_COOKIE['test']."'"; ?>
Измените настройку на «off», и после второй перезагрузки вы увидите, что cookie сеанса передается обратно на сервер.
Чтобы проверить, что вы в безопасном соединении, и даже вызывать session_start:
<?php $secure = isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] != "" ); if(!$secure) { $r = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; header("Location: $r"); exit("use https!"); } //if($secure) { session_start(); /* and other secure happenings;;; */ //} ?>
или Как узнать, используете ли вы HTTPS без $ _SERVER ['HTTPS']
Примечание. Это выглядит как недостаток безопасности в PHP, так как идентификатор сеанса будет передаваться в открытом виде: согласно OWASP это именно то, что защищает SecureFlag. https://www.owasp.org/index.php/SecureFlag — Я использую PHP 5.5.8; Возможно, это «особенность» языка. Определение, по-видимому, направлено исключительно на клиента, а не на сервер.
Метод ini_set требует строкового значения, поэтому обновите свой код до следующего:
ini_set('session.cookie_secure', '1'); ini_set('session.cookie_httponly', '1'); ini_set('session.use_only_cookies', '1'); session_start();