3600, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'Lax', ]); session_start(); // Ouverture de session (avant tout autre envoi au client!!!) Initialiser_session(); } //************************************************************************************************************ // Fonction : Initialise une session neuve, UNE fois : valeurs par défaut, paramètres de TB_Configuration, langues, // textes. Auparavant fait uniquement par index.php : une page ouverte directement (lien d'invitation // scanné sur un téléphone, favori...) utilisait des variables inexistantes (synthèse §47). // Reçoit : Rien // Retour : Rien //************************************************************************************************************ function Initialiser_session() { if (isset($_SESSION['session_initialisee'])) return; $_SESSION['acces_valide'] = false; $_SESSION['display_menu'] = false; $_SESSION['langue'] = 'FR'; // Valeur par défaut, remplacée par Langue_par_defaut de TB_Configuration $_SESSION['shipmember'] = array('Cle_primaire' => 0, 'Prenom' => "", 'Nom' => "", 'Entreprise' => "", 'Rue' => "", 'Code_postal' => "", 'Ville' => "", 'ID_Pays' => 75, 'Telephone' => "", 'Email' => "", 'Commentaires' => "", 'Niveau_acces' => 0); $_SESSION['droits_acces'] = 0; $_SESSION['bateau_shipmember'] = array(); $_SESSION['acces'] = 0; $_SESSION['modifier_texte'] = 0; Ouverture_bdd(); // Paramètres de configuration générale : $reponse = Requete_bdd('SELECT Nom, Valeur FROM TB_Configuration WHERE Validite=1', __FILE__, __LINE__); while ($donnees = Recherche_ligne_bdd($reponse)) { if ($donnees['Nom'] == "Langue_par_defaut") $_SESSION['langue'] = $donnees['Valeur']; else $_SESSION['Config__'.$donnees['Nom']] = $donnees['Valeur']; } Liberation_jeu_de_resultat_bdd($reponse); // ID des langues selon leur préfixe : $reponse = Requete_bdd('SELECT ID, Prefix FROM TB_Langues', __FILE__, __LINE__); while ($donnees = Recherche_ligne_bdd($reponse)) $_SESSION['id_langue'][$donnees['Prefix']] = $donnees['ID']; Liberation_jeu_de_resultat_bdd($reponse); Fermeture_bdd(); chargement_langue(); // Textes de la langue en cours $_SESSION['session_initialisee'] = true; } //************************************************************************************************************ // Fonction : Insertion de l'entête des pages HTML ; essentiellement la partie
. // Au passage, cette fonction étant la première appelée par chaque page (après l'ouverture // de session obligatoire pour pouvoir accéder aux variables de session), on vérifie si // l'environnement est correctement positionné. Si ce n'est pas le cas, par exemple avec // l'accès à la BDD non établi ou aucune langue sélectionnée, elle renvoit immédiatement // vers le fichier 'index.php' qui s'en chargera. // Reçoit : Rien // Retour : Rien //************************************************************************************************************ function Entete_page_html() { // Vérification à chaque ouverture de page que les variables de session sont bien initialisées (le test se fait sur quelques "échantillons" supposés représentatifs...) : if ((!isset($_SESSION['langue'])) OR (!isset($_SESSION['display_menu']))) { header('Location:index.php?origine='.basename($_SERVER['SCRIPT_FILENAME'])); exit(); } // Entête HTML : echo ''; echo ''; echo ''; echo ''; echo 'ShipHeart - Simplicity is true luxury'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ""; echo ""; echo ""; echo ""; echo ""; // gestion des fichiers CSS (et de scripts spécifiques à certains fichiers) : switch(basename($_SERVER['SCRIPT_FILENAME'])) { case "administration.php" : { echo ''; break; } case "textes.php" : { echo ''; break; } case "bateaux.php" : { echo ''; break; } case "cartes.php" : { echo ''; break; } case "mentions_legales.php" : { echo ''; break; } case "shipmembers.php" : { echo ''; break; } case "uploads.php" : { echo ''; break; } case "versions.php" : { echo ''; break; } } echo ''; // CSS de Bootstrap echo ''; // CSS général, tous écrans. echo ''; // CSS pour les petits écrans (doit être placé à la fin car il override les CSS globaux) // Chargement de srcipts JS généraux : echo ''; // Pour Google Charts (graphiques) echo ''; echo ''; echo ''; } //************************************************************************************************************ // Fonction : Insertion de l'entête des pages avec l'affichage du bandeau de titre et les menus. // Puis affichage des messages d'erreur et d'information en les marquant de façon différenciée // selon que le menu est déployé ou non et/ou que le message d'erreur existe et/ou que le // message d'information existe. // Reçoit : Les message d'erreur et le message d'information (de plus, on retrouve le nom du fichier via les variables du serveur) // Retour : Rien //************************************************************************************************************ function Entete_page($message_erreur, $message_information) { $nom_page = basename($_SERVER['SCRIPT_FILENAME']); // Détermination de la nouvelle langue par rapport à l'actuelle : if ($_SESSION['langue'] == "FR") $new_langue = "EN"; else $new_langue = "FR"; echo '
'; //---------------------------------- // Bandeau gauche : echo '
'; // echo ' '; // echo ''; //-------------------------------------------------------------------------------------------- // Menu afficher / masquer -- Mobile //-------------------------------------------------------------------------------------------- echo ''; //-------------------------------------------------------------------------------------------- // Script d'affichage/masquage du menu : //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- // Affichage des messages d'erreur et d'info sous le menu : //-------------------------------------------------------------------------------------------- if (!PRODUCTION) $message_erreur .= "/!\ Base de données de test [".BDD_DATABASE."]
"; // else $message_erreur .= "Base de données de production [".BDD_DATABASE."]
"; if ($message_erreur != "") echo '
'.$message_erreur.'
'; if ($message_information != "") echo '
'.$message_information.'
'; } //************************************************************************************************************ // Fonction : Insertion du pied de page // Reçoit : Rien (mais on retrouve le nom du fichier via les variables du serveur) // Retour : Rien //************************************************************************************************************ function Pied_de_page() { $nom_page = basename($_SERVER['SCRIPT_FILENAME']); // echo ""; echo ''; echo '
'; echo '
'; //================================================================================== // Script JS pour pieds de page : ?>'; echo ''; } // Fin de la fonction Pied_de_page() //************************************************************************************************************ // Jeton anti-CSRF (synthèse §48) : un jeton aléatoire par session, inclus dans chaque formulaire et vérifié à chaque // requête POST - un formulaire envoyé depuis un autre site ne peut pas le connaître. Complète SameSite=Lax. //************************************************************************************************************ // Fonction : Jeton de la session (créé au premier appel). // Retour : Le jeton (64 caractères hexadécimaux) function Jeton_csrf() { if (empty($_SESSION['jeton_csrf'])) $_SESSION['jeton_csrf'] = bin2hex(random_bytes(32)); return $_SESSION['jeton_csrf']; } // Fonction : Champ caché portant le jeton, à placer dans chaque formulaire POST. // Retour : Le code HTML du champ function Champ_jeton_csrf() { return ''; } // Fonction : Vérifie le jeton reçu dans la requête POST (comparaison à temps constant). // Retour : true si le jeton est présent et correct function Jeton_csrf_valide() { return (isset($_POST['jeton_csrf']) && is_string($_POST['jeton_csrf']) && hash_equals(Jeton_csrf(), $_POST['jeton_csrf'])); }