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 '
';
//--------------------------------------------------------------------------------------------
// 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 '
';
//==================================================================================
// 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']));
}