Serveur Apache HTTP Version 2.4

Apache > Serveur HTTP > Documentation > Version 2.4 > Modules

# Module Apache mod_session_dbd

Description: | Support des session basé sur DBD/SQL
Statut: | Extension
Identificateur de Module: | session_dbd_module
Fichier Source: | mod_session_dbd.c
Compatibilité: | Disponible depuis la version 2.3 d'Apache

### Sommaire

### Avertissement

Les modules de session font usage des cookies HTTP, et peuvent à ce titre être victimes d'attaques de type Cross Site Scripting, ou divulguer des informations à caractère privé aux clients. Veuillez vous assurer que les risques ainsi encourus ont été pris en compte avant d'activer le support des sessions sur votre serveur.

Ce sous-module du module `mod_session` fournit le support du stockage des sessions utilisateur dans une base de données SQL en utilisant le module `mod_dbd`.

Les sessions sont soit anonymes, et la session est alors identifiée par un UUID unique stocké dans un cookie au niveau du navigateur, soit propres à l'utilisateur, et la session est alors identifiée par l'identifiant de l'utilisateur connecté.

Les sessions basées sur SQL sont dissimulées au navigateur, et permettent ainsi de préserver la confidentialité sans avoir recours au chiffrement.

Plusieurs serveurs web d'une forêt de serveurs peuvent choisir de partager une base de données, et ainsi partager les sessions entre eux.

Pour plus de détails à propos de l'interface des sessions, voir la documentation du module `mod_session`.

### Sujets

- Configuration de DBD
- Sessions anonymes
- Sessions propres à un utilisateur
- Nettoyage de la base de données

### Directives

### Traitement des bugs

- Journal des modifications de httpd
- Problèmes connus
- Signaler un bug

### Voir aussi

- `mod_session`
- `mod_session_crypto`
- `mod_session_cookie`
- `mod_dbd`

## Configuration de DBD

Pour que le module `mod_session_dbd` puisse être configuré et maintenir une session, il faut tout d'abord configurer le module `mod_dbd` pour que le serveur puisse exécuter des requêtes vers la base de données.

Quatre types de requêtes sont nécessaires pour maintenir une session, sélectionner ou mettre à jour une session existante, insérer une nouvelle session et supprimer une session vide ou arrivée à expiration. Ces requêtes sont configurées comme dans l'exemple suivant :

### Exemple de configuration de DBD

    DBDriver pgsql
    DBDParams "dbname=apachesession user=apache password=xxxxx host=localhost"
    DBDPrepareSQL "delete from session where key = %s" deletesession
    DBDPrepareSQL "update session set value = %s, expiry = %lld, key = %s where key = %s" updatesession
    DBDPrepareSQL "insert into session (value, expiry, key) values (%s, %lld, %s)" insertsession
    DBDPrepareSQL "select value from session where key = %s and (expiry = 0 or expiry > %lld)" selectsession
    DBDPrepareSQL "delete from session where expiry != 0 and expiry < %lld" cleansession

## Sessions anonymes

Les sessions anonymes sont identifiées par un UUID unique, et stockées dans un cookie au niveau du navigateur. Cette méthode est similaire à celle utilisée par la plupart des serveurs d'applications pour stocker les informations de session.

Pour créer une session anonyme, la stocker dans une table de base de donnée postgres nommée apachesession, et sauvegarder l'identifiant de session dans un cookie nommé session, configurez la session comme suit :

### Session anonyme basée sur SQL

    Session On
    SessionDBDCookieName session path=/

Pour plus d'exemples sur la manière dont une application CGI peut accéder aux informations de session, voir la section exemples de la documentation du module `mod_session`.

Pour des détails sur la manière dont une session peut être utilisée pour stocker des informations de type nom d'utilisateur/mot de passe, voir la documentation du module `mod_auth_form`.

## Sessions propres à un utilisateur

Les sessions propres à un utilisateur sont identifiées par le nom de l'utilisateur authentifié avec succès. Ceci permet d'assurer une confidentialité optimale, car aucun traitement externe à la session n'existe en dehors du contexte authentifié.

Les sessions propres à un utilisateur ne fonctionnent que dans un environnement d'authentification correctement configuré, qu'il s'agisse d'une authentification de base, à base de condensés (digest) ou de certificats client SSL. Suite à des limitations dues à des dépendances mutuelles, les sessions propres à un utilisateur ne peuvent pas être utilisées pour stocker les données d'authentification en provenance d'un module comme `mod_auth_form`.

Pour créer une session propre à un utilisateur, la stocker dans une table de base de données postgres nommée apachesession, avec comme clé de session l'identifiant utilisateur, ajoutez les lignes suivantes :

### Session propre à un utilisateur basée sur SQL

    Session On
    SessionDBDPerUser On

## Nettoyage de la base de données

Avec le temps, la base de données va commencer à accumuler des sessions expirées. Pour le moment, le module `mod_session_dbd` n'est pas en mesure de gérer automatiquement l'expiration des sessions.

### Avertissement

L'administrateur devra mettre en oeuvre un traitement externe via cron pour nettoyer les sessions expirées.

## Directive SessionDBDCookieName

Description: | Nom et attributs du cookie RFC2109 qui contient l'identifiant de session
Syntaxe: | `SessionDBDCookieName nom attributs`
Défaut: | `none`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDCookieName` permet de spécifier le nom et les attributs optionnels d'un cookie compatible RFC2109 qui contiendra l'identifiant de session. Les cookies RFC2109 sont définis à l'aide de l'en-tête HTTP `Set-Cookie`.

Une liste optionnelle d'attributs peut être spécifiée pour ce cookie, comme dans l'exemple ci-dessous. Ces attributs sont insérés dans le cookie tels quels, et ne sont pas interprétés par Apache. Assurez-vous que vos attributs sont définis correctement selon la spécification des cookies.

### Cookie avec attributs

    Session On
    SessionDBDCookieName session path=/private;domain=example.com;httponly;secure;version=1;

## Directive SessionDBDCookieName2

Description: | Nom et attributs du cookie RFC2965 qui contient l'identifiant de session
Syntaxe: | `SessionDBDCookieName2 nom attributs`
Défaut: | `none`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDCookieName2` permet de spécifier le nom et les attributs optionnels d'un cookie compatible RFC2965 qui contiendra l'identifiant de session. Les cookies RFC2965 sont définis à l'aide de l'en-tête HTTP `Set-Cookie2`.

Une liste optionnelle d'attributs peut être spécifiée pour ce cookie, comme dans l'exemple ci-dessous. Ces attributs sont insérés dans le cookie tel quel, et ne sont pas interprétés par Apache. Assurez-vous que vos attributs sont définis correctement selon la spécification des cookies.

### Cookie2 avec attributs

    Session On
    SessionDBDCookieName2 session path=/private;domain=example.com;httponly;secure;version=1;

## Directive SessionDBDCookieRemove

Description: | Détermine si les cookies de session doivent être supprimés des en-têtes HTTP entrants
Syntaxe: | `SessionDBDCookieRemove On|Off`
Défaut: | `SessionDBDCookieRemove On`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDCookieRemove` permet de déterminer si les cookies contenant l'identifiant de session doivent être supprimés des en-têtes pendant le traitement de la requête.

Dans le cas d'un mandataire inverse où le serveur Apache sert de frontal à un serveur d'arrière-plan, révéler le contenu du cookie de session à ce dernier peut conduire à une violation de la confidentialité. À ce titre, si cette directive est définie à "on", le cookie de session sera supprimé des en-têtes HTTP entrants.

## Directive SessionDBDDeleteLabel

Description: | La requête SQL à utiliser pour supprimer des sessions de la base de données
Syntaxe: | `SessionDBDDeleteLabel étiquette`
Défaut: | `SessionDBDDeleteLabel deletesession`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDDeleteLabel` permet de définir l'étiquette de la requête de suppression à utiliser par défaut pour supprimer une session vide ou expirée. Cette étiquette doit avoir été définie au préalable via une directive `DBDPrepareSQL`.

## Directive SessionDBDInsertLabel

Description: | La requête SQL à utiliser pour insérer des sessions dans la base de données
Syntaxe: | `SessionDBDInsertLabel étiquette`
Défaut: | `SessionDBDInsertLabel insertsession`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDInsertLabel` permet de définir l'étiquette de la requête d'insertion par défaut à charger dans une session. Cette étiquette doit avoir été définie au préalable via une directive `DBDPrepareSQL`.

Si une tentative de mise à jour d'une session ne concerne aucun enregistrement, c'est cette requête qui sera utilisée pour insérer la session dans la base de données.

## Directive SessionDBDPerUser

Description: | Active une session propre à un utilisateur
Syntaxe: | `SessionDBDPerUser On|Off`
Défaut: | `SessionDBDPerUser Off`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDPerUser` permet d'activer une session propre à un utilisateur, dont la clé sera le nom de l'utilisateur connecté. Si l'utilisateur n'est pas connecté, la directive sera ignorée.

## Directive SessionDBDSelectLabel

Description: | La requête SQL à utiliser pour sélectionner des sessions dans la base de données
Syntaxe: | `SessionDBDSelectLabel étiquette`
Défaut: | `SessionDBDSelectLabel selectsession`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDSelectLabel` permet de définir l'étiquette de la requête de sélection par défaut à utiliser pour charger une session. Cette étiquette doit avoir été définie au préalable via une directive `DBDPrepareSQL`.

## Directive SessionDBDUpdateLabel

Description: | La requête SQL à utiliser pour mettre à jour des sessions préexistantes dans la base de données
Syntaxe: | `SessionDBDUpdateLabel étiquette`
Défaut: | `SessionDBDUpdateLabel updatesession`
Contexte: | configuration du serveur, serveur virtuel, répertoire, .htaccess
Statut: | Extension
Module: | mod_session_dbd

La directive `SessionDBDUpdateLabel` permet de définir l'étiquette de la requête de mise à jour par défaut à charger dans une session. Cette étiquette doit avoir été définie au préalable via une directive `DBDPrepareSQL`.

Si une tentative de mise à jour d'une session ne concerne aucun enregistrement, c'est la requête d'insertion qui sera appelée pour insérer la session dans la base de données. Si la base de données supporte InsertOrUpdate, modifiez cette requête pour effectuer la mise à jour en une seule requête au lieu de deux.