PHP Session de sécurité

voix
125

Quelles sont quelques lignes directrices pour le maintien de la sécurité de la session responsable avec PHP? Il y a des informations sur tout le web et il est temps tout a atterri en un seul endroit!

Créé 02/08/2008 à 03:41
source utilisateur
Dans d'autres langues...                            


13 réponses

voix
88

Il y a deux choses à faire afin de garder votre session sécurisée:

  1. Utiliser SSL lors de l'authentification des utilisateurs ou effectuer des opérations sensibles.
  2. Régénérer l'identifiant de session chaque fois que les changements de niveau de sécurité (tels que la connexion). Vous pouvez même régénérer l'identifiant de session chaque demande si vous le souhaitez.
  3. Le temps des sessions sur
  4. Ne pas utiliser le registre globals
  5. les détails d'authentification de magasin sur le serveur. Autrement dit, ne pas envoyer des détails tels que le nom d'utilisateur dans le cookie.
  6. Vérifiez la $_SERVER['HTTP_USER_AGENT']. Cela ajoute une petite barrière à session hijacking. Vous pouvez également vérifier l'adresse IP. Mais cela pose des problèmes pour les utilisateurs qui ont modifier l' adresse IP 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 utiliser la gestion de session personnalisé
  8. Pour les opérations sensibles connecté envisager de demander aux utilisateurs de fournir à nouveau leurs coordonnées authenication
Créé 11/08/2008 à 03:38
source utilisateur

voix
15

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

Créé 02/08/2008 à 03:43
source utilisateur

voix
11

Mes deux (ou plus) cents:

  • Ne fais confiance a personne
  • Filtre d'entrée, la sortie d'échappement (cookies, les données de session sont trop votre entrée)
  • Évitez XSS (garder votre code HTML bien formé, jetez un oeil à PHPTAL ou htmlpurifier )
  • Défense en profondeur
  • Ne pas exposer les données

Il y a un petit mais bon livre sur ce sujet: Essential sécurité PHP par Chris Shiflett .

Essential PHP Security http://shiflett.org/images/essential-php-security-small.png

Sur la page d'accueil du livre que vous trouverez quelques exemples de code intéressant et chapitres de l'échantillon.

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

Créé 06/04/2010 à 17:05
source utilisateur

voix
11

Je pense que l' un des problèmes majeurs (qui est adressée en PHP 6) est register_globals. À l' heure actuelle l' une des méthodes standard utilisées pour éviter register_globalsest d'utiliser les $_REQUEST, $_GETou les $_POSTtableaux.

La « bonne » façon de le faire ( à partir de 5,2, bien qu'il soit un peu buggé là, mais stable de 6, ce qui est à venir bientôt) est par les filtres .

Ainsi, au lieu de:

$username = $_POST["username"];

vous feriez:

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

ou même simplement:

$username = filter_input(INPUT_POST, 'username');
Créé 02/08/2008 à 03:55
source utilisateur

voix
9

Le présent document de fixation de session a de très bons pointeurs où l' attaque peut venir. Voir aussi la page de fixation de session sur Wikipedia .

Créé 05/03/2009 à 23:33
source utilisateur

voix
5

L'utilisation d'adresses IP n'est pas vraiment la meilleure idée dans mon expérience. Par exemple; mon bureau a deux adresses IP qui Habituez en fonction de la charge et nous courons constamment sur les problèmes en utilisant des adresses IP.

Au lieu de cela, j'ai opté pour le stockage des sessions dans une base de données séparée pour les domaines sur mes serveurs. De cette façon, personne sur le système de fichiers a accès à cette information de session. Cela a été très utile avec phpBB avant 3.0 (ils ont depuis réglé ça), mais il est toujours une bonne idée que je pense.

Créé 06/08/2008 à 21:44
source utilisateur

voix
3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache ajouter en-tête:

X-XSS-Protection    1
Créé 13/10/2011 à 03:40
source utilisateur

voix
3

Je mis mes séances comme des this-

sur la page de connexion:

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

(Expression définie sur une page de configuration)

puis l'en-tête qui est 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();     
}
Créé 19/07/2011 à 22:40
source utilisateur

voix
3

Le principal problème avec les sessions PHP et la sécurité (en plus de session hijacking) est livré avec quel environnement vous êtes. En PHP stocke par défaut les données de session dans un fichier dans le répertoire temporaire du système d'exploitation. Sans aucune pensée particulière ou la planification que ce répertoire est lisible du monde si toutes vos informations de session est publique à toute personne ayant accès au serveur.

En ce qui concerne le maintien de sessions sur plusieurs serveurs. À ce moment-là, il serait préférable de passer PHP aux sessions traitées utilisateur où il appelle vos fonctions fournis à CRUD (créer, lire, mettre à jour, supprimer) les données de session. À ce moment-là, vous pouvez stocker les informations de session dans une base de données ou memcache comme solution afin que tous les serveurs d'applications ont accès aux données.

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

Créé 03/08/2008 à 14:14
source utilisateur

voix
3

Ceci est assez trivial et évident, mais assurez - vous session_destroy après chaque utilisation. Cela peut être difficile à mettre en œuvre si l'utilisateur ne se connecte pas explicitement, donc une minuterie peut être réglée pour le faire.

Voici un bon tutoriel sur SetTimer () et clearTimer ().

Créé 02/08/2008 à 04:16
source utilisateur

voix
2

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

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

En supposant que vous voulez continuer à utiliser la session php, vous pouvez définir php utiliser un autre dossier en modifiant _session.save_path_ ou enregistrer les données dans la base de données en changeant _session.save_handler_.

Vous pourriez être en mesure de mettre _session.save_path_ dans votre php.ini (certains fournisseurs permettent) ou apache + mod_php, dans un fichier .htaccess dans votre dossier racine du site: php_value session.save_path "/home/example.com/html/session". Vous pouvez également le mettre à exécution avec _session_save_path () _.

Consultez le tutoriel de Chris Shiflett ou Zend_Session_SaveHandler_DbTable de définir et de gestionnaire de session de remplacement.

Créé 18/08/2008 à 18:12
source utilisateur

voix
2

Si vous 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 d'un gestionnaire de session de base de données.

DB sessions sont aussi bons si vous avez plusieurs serveurs sinon, si vous utilisez des sessions basées sur des fichiers que vous devez vous assurer que chaque serveur Web a accès au même système de fichiers pour lire / écrire les sessions.

Créé 09/08/2008 à 04:28
source utilisateur

voix
2

Je voudrais vérifier à la fois IP et l'agent utilisateur pour voir si elles changent

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Créé 04/08/2008 à 22:38
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more