security - sécurité - variable de session php




Sécurité de session PHP (9)

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache ajouter en-tête:

X-XSS-Protection    1

Quelles sont les directives pour maintenir une sécurité de session responsable avec PHP? Il y a de l'information partout sur le Web et il est temps que tout atterrisse au même endroit!


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 configuré pour le faire.

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


J'organise mes sessions 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();     
}

Je pense que l'un des problèmes majeurs (qui est traité dans PHP 6) est register_globals. À l'heure actuelle, l'une des méthodes standard utilisées pour éviter register_globals consiste à utiliser les $_REQUEST , $_GET ou $_POST .

La façon "correcte" de le faire (à partir de la version 5.2, bien que ce soit un peu buggé là-bas, mais stable à partir du 6, qui arrive bientôt) consiste à filters .

Donc 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');

L'une des recommandations consiste à appeler session_regenerate_id chaque fois que le niveau de sécurité d'une session change. Cela aide à prévenir le détournement de session.


L'utilisation de l'adresse IP n'est pas vraiment la meilleure idée de mon expérience. Par exemple; mon bureau a deux adresses IP qui s'utilisent en fonction de la charge et nous rencontrons constamment des problèmes d'utilisation d'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 de mes serveurs. De cette façon, personne sur le système de fichiers n'a accès à ces informations de session. Cela était vraiment utile avec phpBB avant la version 3.0 (ils ont depuis corrigé cela) mais c'est quand même une bonne idée je pense.


Mes deux cents (ou plus):

  • Ne fais confiance a personne
  • Filtre d'entrée, sortie d'échappement (cookie, données de session sont également vos entrées)
  • Évitez les XSS (gardez votre HTML bien formé, jetez un coup d'œil à PHPTAL ou HTMLPurifier )
  • Défense en profondeur
  • Ne pas exposer les données

Il existe un livre minuscule mais intéressant sur ce sujet: Essential PHP Security de Chris Shiflett .

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

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

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


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 de 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 avez plusieurs serveurs. Si vous utilisez des sessions basées sur des fichiers, vous devez vous assurer que chaque serveur Web a accès au même système de fichiers pour lire / écrire les sessions.






php