libsession.inc.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <?php
  2. require_once 'lib/JWT.php';
  3. // Préparation d'un jeton de sécurité
  4. function prepareToken() {
  5. // On crée le header
  6. $header = [
  7. 'typ' => 'JWT',
  8. 'alg' => 'HS512'
  9. ];
  10. // On crée le contenu (payload)
  11. $payload = [
  12. 'user_id' => $_SESSION['noutilisateur'],
  13. // 'roles' => [
  14. // 'ROLE_ADMIN',
  15. // 'ROLE_USER'
  16. // ],
  17. 'courriel' => $_SESSION['adressecourriel']
  18. ];
  19. $jwt = new JWT();
  20. $jeton = $jwt->generate($header, $payload, $_ENV["SECRET"]);
  21. return sprintf("Bearer %s", $jeton);
  22. }
  23. /**
  24. * Pour l'ouverture de chaque page, vérifie si la constante est définie et égale.
  25. */
  26. function isValidConstant() {
  27. if (!defined("LIBERATIONSWEB")) {
  28. return -1;
  29. }
  30. if (isset($_SESSION['HTTP_USER_AGENT']) &&
  31. $_SESSION['HTTP_USER_AGENT'] != md5(filter_input(INPUT_SERVER, 'HTTP_USER_AGENT'))) {
  32. return -1;
  33. }
  34. return 1;
  35. }
  36. /**
  37. * Vérifie le facteur 2FA/MFA a été créé dans la bd pour l'utilisateur courant
  38. */
  39. function isSet2FA() {
  40. return (!empty($_SESSION["2fa_set"]) && $_SESSION["2fa_set"]);
  41. }
  42. /**
  43. * Check the validity of a JWT token.
  44. * @return boolean
  45. */
  46. function isValidToken() {
  47. $jeton = filter_input(INPUT_POST, 'jeton');
  48. if (empty($jeton)) {
  49. $jeton = filter_input(INPUT_GET, 'jeton');
  50. }
  51. // On vérifie si la chaine commence par "Bearer "
  52. $matches = array();
  53. if (!isset($jeton) || !preg_match('/Bearer\s(\S+)/', $jeton, $matches)) {
  54. return false;
  55. }
  56. // On extrait le token
  57. $jeton2 = str_replace('Bearer ', '', $jeton);
  58. $jwt = new JWT();
  59. if (
  60. // On vérifie la validité
  61. !$jwt->isValid($jeton2) ||
  62. // On vérifie la signature
  63. !$jwt->check($jeton2, $_ENV["SECRET"]) ||
  64. // On vérifie l'expiration
  65. $jwt->isExpired($jeton2)
  66. ) {
  67. return false;
  68. }
  69. return true;
  70. }
  71. /**
  72. * Est-ce que la session est fermée ou encore valide??
  73. */
  74. function isValidSession() {
  75. if (isValidConstant() == -1) {
  76. $code = -1; //La constante de départ manquante
  77. } elseif (!isset($_SESSION['utilisateur']) || $_SESSION['utilisateur'] == -1) {
  78. $code = -2; //Pas de session utilisateur
  79. } elseif (getMicroTime() - 3600 > $_SESSION['temps']) {
  80. $code = -3; //Délai d'inactivité dépassé
  81. } elseif (!isSet2FA()) { //Facteur 2FA créé ?
  82. $code = -4;
  83. } elseif (!isValidToken()) {
  84. $code = -6; //Pas de jeton de sécurité ou jeton invalide
  85. } elseif ($GLOBALS["IP"] !== getenv("REMOTE_ADDR")) {
  86. $code = -11; //Adresse Ip différente de celle d'origine
  87. } elseif (count(checkAccessAlreadyInUse()) > 0) {
  88. $code = -9; // Accès ne doit pas être déjà utilisé.
  89. } else {
  90. $code = 1; // Ok, tout est valide
  91. }
  92. return $code;
  93. }
  94. /**
  95. *
  96. * @return type
  97. */
  98. function checkAccessAlreadyInUse() {
  99. $sqlparam["connexion"] = "maitre";
  100. $sqlparam["table"][] = "administration";
  101. $sqlparam["where"][] = "refutilisateur = '" . $_SESSION["noutilisateur"] . "'";
  102. $sqlparam["where"][] = "acces=1";
  103. return executerRequeteSql($sqlparam);
  104. }
  105. /**
  106. *
  107. */
  108. function buildHeader() {
  109. header("Content-type: text/html; charset=utf-8");
  110. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
  111. header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
  112. //TODO vérification si cela bloque les requêtes AJAX nécessaires dans l'application (max-age=0).
  113. header("Cache-Control: no-store, no-cache, must-revalidate"); //, max-age=0"); // HTTP/1.1
  114. header("Cache-Control: post-check=0, pre-check=0", false);
  115. header("Pragma: no-cache");
  116. }
  117. /**
  118. * Préparation d'une nouvelle header d'une session
  119. */
  120. function prepareSession() {
  121. buildHeader();
  122. //Entête de la page
  123. $output = "<!DOCTYPE HTML PUBLIC \" - //W3C//DTD HTML 4.01 Transitional//EN\" ";
  124. $output .= "\"http://www.w3.org/TR/html4/loose.dtd\">\n ";
  125. $output .= "<HTML>\n";
  126. $output .= " <HEAD>\n";
  127. $output .= " <TITLE>" . $GLOBALS["APPLICATION"] . "</TITLE>\n";
  128. $output .= " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
  129. $output .= " <link type=\"text/css\" href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css' rel='stylesheet'>";
  130. $output .= " <link type=\"text/css\" href=\"css/jquery-ui.css\" rel=\"stylesheet\" />\n";
  131. $output .= " <script type=\"text/javascript\" src=\"js/jquery.js\"></script>\n";
  132. $output .= " <script type=\"text/javascript\" src=\"js/jquery-ui.js\"></script>\n";
  133. $output .= " <link type=\"text/css\" href=\"css/style_std.css\" rel=\"stylesheet\" />\n";
  134. $output .= " <link type=\"text/css\" href=\"css/style_alert.css\" rel=\"stylesheet\" />\n";
  135. $output .= " <script src=\"js/notifIt.min.js\" type=\"text/javascript\"></script>\n";
  136. $output .= " <link href=\"css/notifIt.min.css\" type=\"text/css\" rel=\"stylesheet\">\n";
  137. $output .= " <script type=\"text/javascript\" src=\"js/plugin_maskedinput.js\"> </script>\n";
  138. $output .= " <script src=\"js/plugin_validate.js\"></script>\n";
  139. $output .= " <script src=\"js/plugin_datepicker.js\"></script>\n";
  140. $output .= " <script src=\"js/fonctions.js\"></script>\n";
  141. $output .= " <script src=\"js/validations.js\"></script>\n";
  142. $output .= " <script src=\"js/jalert.js\"></script>\n";
  143. $output .= " <script src=\"js/horloge.js\"></script>\n";
  144. return $output;
  145. }
  146. /**
  147. *
  148. * @param type $msg
  149. */
  150. function retireVariableSession($msg = '') {
  151. $_SESSION = array();
  152. $params = session_get_cookie_params();
  153. setcookie(session_name(), "", time() - 42000,
  154. $params["path"],
  155. $params["domain"],
  156. $params["secure"],
  157. $params["httponly"]
  158. );
  159. if (!empty($msg)) {
  160. session_destroy();
  161. header("Location:index.php?msg=$msg", true, 303);
  162. exit;
  163. } else {
  164. header("Location:index.php");
  165. }
  166. }
  167. /**
  168. * Ferme la session en cours, dont le script a été ouvert dans une nouvelle fenêtre
  169. * autre que la fenêtre principale (pop-up).
  170. */
  171. function fermeSessionForm() {
  172. if (filter_input(INPUT_COOKIE, session_name(), FILTER_SANITIZE_STRING) !== "") {
  173. setcookie(session_name(), "", time() - 3600, "/");
  174. setcookie(session_name(), false);
  175. }
  176. $_SESSION = array();
  177. session_destroy();
  178. print prepareSession();
  179. $message = "<center>Une erreur s'est produite ou le temps est écoulé.<br><br>";
  180. $message .= "Vous devez être authentifié pour accéder à ce site.";
  181. $message .= "<br><br><input type='button' onclick='javascript:window.close();' value='Fermer la fenêtre'></center>";
  182. die($message);
  183. }
  184. /**
  185. * Filtrer toutes les valeurs saisies en POST/GET
  186. */
  187. function filterInputValue() {
  188. // Vérifier POST en premier
  189. if (filter_input_array(INPUT_POST)) {
  190. foreach (filter_input_array(INPUT_POST) as $clef => $valeur) {
  191. if (!is_array($valeur)) {
  192. $GLOBALS[$clef] = antiInjection($valeur);
  193. } else {
  194. $GLOBALS[$clef] = $valeur;
  195. }
  196. }
  197. }
  198. if (filter_input_array(INPUT_GET)) {
  199. foreach (filter_input_array(INPUT_GET) as $clef => $valeur) {
  200. if (!isset($GLOBALS[$clef])) {
  201. $GLOBALS[$clef] = antiInjection($valeur);
  202. }
  203. }
  204. }
  205. }
  206. /**
  207. * Ferme la session en cours
  208. *
  209. * @param type $msg
  210. */
  211. function fermeSessionUtilisateur($msg = '') {
  212. if (isset($_SESSION["utilisateur"]) && isset($_SESSION["adressecourriel"])) {
  213. $sqlparam["connexion"] = "maitre";
  214. $sqlparam["type"] = "UPDATE";
  215. $sqlparam["table"][] = "administration";
  216. $sqlparam["where"][] = sprintf("utilisateur = '%s'", addslashes($_SESSION["utilisateur"]));
  217. $sqlparam["where"][] = sprintf("email = '%s'", addslashes($_SESSION["adressecourriel"]));
  218. $sqlparam["champs"]["essais"] = 0;
  219. executerRequeteSql($sqlparam);
  220. }
  221. retireVariableSession($msg);
  222. }
  223. /**
  224. * Vérifie si le profil satisfait aux conditions d'utilisation
  225. * Token 2fa activé
  226. * Mot de passe temporaire remplacé par un nouveau mot de passe
  227. */
  228. function checkProfil($page) {
  229. $page2 = $page;
  230. $sqlparam["connexion"] = "maitre";
  231. $sqlparam["table"][] = "administration";
  232. $sqlparam["champs"][] = "refutilisateur";
  233. $sqlparam["champs"][] = "temporaire";
  234. $sqlparam["champs"][] = "secret2fa";
  235. $sqlparam["where"][] = "(temporaire = 1 OR secret2fa IS null)";
  236. $sqlparam["where"][] = "refutilisateur =" . $_SESSION["noutilisateur"];
  237. $result = executerRequeteSql($sqlparam);
  238. //Si l'un de ces 2 éléments est vide, retourne à la page profil
  239. if (!empty($result) && ($result[0]["temporaire"] == 1 || $result[0]["secret2fa"] == null)) {
  240. $page2 = "profil";
  241. }
  242. return $page2;
  243. }