sessions.inc.php 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. // Start session
  3. ini_set("session.cookie_httponly", 1);
  4. if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
  5. strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == "https") {
  6. ini_set("session.cookie_secure", 1);
  7. $IS_HTTPS = true;
  8. }
  9. elseif (isset($_SERVER['HTTPS'])) {
  10. ini_set("session.cookie_secure", 1);
  11. $IS_HTTPS = true;
  12. }
  13. else {
  14. $IS_HTTPS = false;
  15. }
  16. session_set_cookie_params($GLOBALS['SESSION_LIFETIME'], '/', $_SERVER['SERVER_NAME'], $IS_HTTPS, true);
  17. session_start();
  18. if (!isset($_SESSION['CSRF']['TOKEN'])) {
  19. $_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
  20. }
  21. // Set session IP and UA
  22. if (!isset($_SESSION['SESS_REMOTE_IP'])) {
  23. $_SESSION['SESS_REMOTE_IP'] = $_SERVER['REMOTE_ADDR'];
  24. }
  25. if (!isset($_SESSION['SESS_REMOTE_UA'])) {
  26. $_SESSION['SESS_REMOTE_UA'] = $_SERVER['HTTP_USER_AGENT'];
  27. }
  28. // Check session
  29. function session_check() {
  30. if (!isset($_SESSION['SESS_REMOTE_IP']) || !isset($_SESSION['SESS_REMOTE_UA'])) {
  31. return false;
  32. }
  33. if ($_SESSION['SESS_REMOTE_IP'] != $_SERVER['REMOTE_ADDR']) {
  34. return false;
  35. }
  36. if ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT']) {
  37. return false;
  38. }
  39. if (!empty($_POST)) {
  40. if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
  41. return false;
  42. }
  43. $_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
  44. $_SESSION['CSRF']['TIME'] = time();
  45. }
  46. return true;
  47. }
  48. if (isset($_SESSION['mailcow_cc_role']) && session_check() === false) {
  49. $_SESSION['return'] = array(
  50. 'type' => 'warning',
  51. 'msg' => 'Form token invalid or timed out'
  52. );
  53. $_POST = array();
  54. }
  55. // Handle logouts
  56. if (isset($_POST["logout"])) {
  57. if (isset($_SESSION["dual-login"])) {
  58. $_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"];
  59. $_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"];
  60. unset($_SESSION["dual-login"]);
  61. }
  62. else {
  63. session_regenerate_id(true);
  64. session_unset();
  65. session_destroy();
  66. session_write_close();
  67. header("Location: /");
  68. }
  69. }