Question

Quelles sont quelques lignes directrices pour maintenir une sécurité de session responsable avec PHP ?Il y a des informations partout sur le Web et il est temps que tout se retrouve au même endroit !

Était-ce utile?

La solution

Il y a plusieurs choses à faire pour assurer la sécurité de votre session :

  1. Utilisez SSL lors de l’authentification des utilisateurs ou lors de l’exécution d’opérations sensibles.
  2. Régénérez l'identifiant de session chaque fois que le niveau de sécurité change (comme la connexion).Vous pouvez même régénérer l'identifiant de session à chaque demande si vous le souhaitez.
  3. Interdire les séances
  4. N'utilisez pas de registres globaux
  5. Stockez les détails d’authentification sur le serveur.Autrement dit, n'envoyez pas de détails tels que le nom d'utilisateur dans le cookie.
  6. Vérifier la $_SERVER['HTTP_USER_AGENT'].Cela ajoute une petite barrière au détournement de session.Vous pouvez également vérifier l'adresse IP.Mais cela pose des problèmes aux utilisateurs dont l'adresse IP change en raison de l'équilibrage de charge sur plusieurs connexions Internet, etc. (ce qui est le cas dans notre environnement ici).
  7. Verrouillez l'accès aux sessions sur le système de fichiers ou utilisez la gestion de session personnalisée
  8. Pour les opérations sensibles, envisagez de demander aux utilisateurs connectés de fournir à nouveau leurs informations d'authentification.

Autres conseils

Une ligne directrice est d'appeler session_regenerate_id chaque fois que le niveau de sécurité d'une session change.Cela permet d’éviter le détournement de session.

Mes deux (ou plus) centimes :

  • Ne fais confiance a personne
  • Filtrer l'entrée, échapper la sortie (le cookie, les données de session sont également votre entrée)
  • Évitez XSS (gardez votre HTML bien formé, jetez un oeil à PHPTAL ou HTMLPurificateur)
  • Défense en profondeur
  • Ne pas exposer les données

Il existe un petit mais bon livre sur ce sujet : Sécurité PHP essentielle par Chris Shiflett.

Sécurité PHP essentielle http://shiflett.org/images/essential-php-security-small.png

Sur la page d'accueil du livre, vous trouverez des exemples de code intéressants et des exemples de chapitres.

Vous pouvez utiliser la technique mentionnée ci-dessus (IP & UserAgent), décrite ici : Comment éviter le vol d'identité

Je pense que l'un des problèmes majeurs (qui est résolu dans PHP 6) est Register_globals.À l'heure actuelle, l'une des méthodes standards utilisées pour éviter register_globals est d'utiliser le $_REQUEST, $_GET ou $_POST tableaux.

La façon "correcte" de le faire (à partir de la version 5.2, même si c'est un peu bogué, mais stable à partir de la version 6, qui arrive bientôt) est de passer par filtres.

Donc au lieu de :

$username = $_POST["username"];

vous feriez:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

ou même juste :

$username = filter_input(INPUT_POST, 'username');

Ce document de fixation de la session a de très bons indicateurs sur les endroits où une attaque peut survenir.Voir également page de fixation de session sur Wikipédia.

D'après mon expérience, utiliser l'adresse IP n'est pas vraiment la meilleure idée.Par exemple;mon bureau dispose de deux adresses IP qui sont utilisées en fonction de la charge et nous rencontrons constamment des problèmes d'utilisation des adresses IP.

Au lieu de cela, j'ai opté pour stocker les sessions dans une base de données distincte pour les domaines de mes serveurs.De cette façon, personne sur le système de fichiers n'a accès à ces informations de session.C'était vraiment utile avec phpBB avant la version 3.0 (ils ont depuis corrigé ce problème) mais c'est toujours une bonne idée je pense.

C'est assez trivial et évident, mais assurez-vous de session_destroy après chaque utilisation.Cela peut être difficile à mettre en œuvre si l'utilisateur ne se déconnecte pas explicitement, un minuteur peut donc être défini pour ce faire.

Voici un bon Didacticiel sur setTimer() et clearTimer().

Le principal problème avec les sessions PHP et la sécurité (outre le piratage de session) vient de l'environnement dans lequel vous vous trouvez.Par défaut, PHP stocke les données de session dans un fichier dans le répertoire temporaire du système d'exploitation.Sans aucune réflexion ni planification particulière, il s'agit d'un répertoire lisible dans le monde entier, de sorte que toutes les informations de votre session sont publiques pour toute personne ayant accès au serveur.

Quant au maintien de sessions sur plusieurs serveurs.À ce stade, il serait préférable de basculer PHP vers des sessions gérées par l'utilisateur où il appelle les fonctions fournies pour CRUD (créer, lire, mettre à jour, supprimer) les données de session.À ce stade, vous pouvez stocker les informations de session dans une base de données ou une solution de type memcache afin que tous les serveurs d'applications aient accès aux données.

Le stockage de vos propres sessions peut également être avantageux si vous êtes sur un serveur partagé, car cela vous permettra de les stocker dans la base de données sur laquelle vous avez souvent plus de contrôle que le système de fichiers.

J'ai organisé mes séances comme ceci-

sur la page de connexion :

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(phrase définie sur une page de configuration)

puis sur l'en-tête qui se trouve dans le reste du site :

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache ajoute un en-tête :

X-XSS-Protection    1

Je vérifierais à la fois l'IP et l'agent utilisateur pour voir s'ils changent

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}

Si vous utilisez session_set_save_handler() vous pouvez définir votre propre gestionnaire de session.Par exemple, vous pouvez stocker vos sessions dans la base de données.Reportez-vous aux commentaires php.net pour des exemples de gestionnaire de session de base de données.

Les sessions de base de données sont également utiles si vous disposez de plusieurs serveurs. Sinon, si vous utilisez des sessions basées sur des fichiers, vous devrez vous assurer que chaque serveur Web a accès au même système de fichiers pour lire/écrire les sessions.

Vous devez être sûr que les données de session sont en sécurité.En regardant votre php.ini ou en utilisant phpinfo() vous pouvez trouver vos paramètres de session._session.save_path_ vous indique où ils sont enregistrés.

Vérifiez l'autorisation du dossier et de ses parents.Il ne doit pas être public (/tmp) ni être accessible par d'autres sites Web sur votre serveur partagé.

En supposant que vous souhaitiez toujours utiliser la session php, vous pouvez configurer php pour qu'il utilise un autre dossier en modifiant _session.save_path_ ou enregistrer les données dans la base de données en modifiant _session.save_handler_ .

Vous pourrez peut-être définir _session.save_path_ dans votre php.ini (certains fournisseurs le permettent) ou pour Apache + mod_php, dans un fichier .htaccess dans le dossier racine de votre site :php_value session.save_path "/home/example.com/html/session".Vous pouvez également le définir au moment de l'exécution avec _session_save_path()_ .

Vérifier Tutoriel de Chris Shiflett ou Zend_Session_SaveHandler_DbTable à définir et un gestionnaire de session alternatif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top