web-dev-qa-db-fra.com

Les sessions PHP PHP sont-elles sécurisées?

Je suis principalement un programmeur C++, mais j'essaie de récupérer du PHP.

Apparemment, la façon de mettre en œuvre des sessions utilisateur Web consiste à stocker l'ID de connexion de l'utilisateur dans un cookie à l'aide de la variable $ _SESSION.

N'est-il pas possible pour quelqu'un de simplement modifier son cookie, de lui accorder différents privilèges ou de se connecter en tant qu'utilisateur différent?

Il semble que ce mécanisme d'authentification consiste simplement à ce que l'utilisateur stocke son ID dans un fichier, puis à leur faire confiance pour ne pas le modifier.

Y a-t-il quelque chose qui empêche cela?

Merci!

31
James

Non, une session est stockée sur le serveur et inaccessible à l'utilisateur. Il est utilisé pour stocker des informations sur le site telles que les sessions de connexion.

Voici un exemple d'utilisation:

<?php
session_start();
if (password_verify($_POST['password'], $hash)) {
    $_SESSION['auth'] = true;
}
?>

La session est ensuite accessible sur le site pour vérifier si l'utilisateur a été authentifié.

<?php
session_start();
if ($_SESSION['auth']) {
    echo "You are logged in!";
}
?>

L'utilisateur ne peut pas modifier ces valeurs, mais l'ID de la session est stocké sur un ordinateur via un cookie sous la forme d'une longue chaîne aléatoire. Si un utilisateur non autorisé accède à ces chaînes, il leur est possible d'accéder au site.

15
James

Les sessions PHP ne sont sécurisées que lorsque votre application les crée. PHP sessions donnera à l'utilisateur une chaîne pseudo-aléatoire ("ID de session") pour lui permettre de s'identifier, mais si cette chaîne est interceptée par un attaquant, l'attaquant peut prétendre être cet utilisateur.

Que faire

Ces informations sont extraites de "Session Management Basics" dans le PHP manual , mais un peu simplifiées. Certaines choses ont peut-être été manquées. Assurez-vous de les lire comme bien.

  1. tilisez toujours HTTPS

    • Empêche les attaquants de lire le cookie d'ID de session
  2. Activer session.use_strict_mode :

  3. Activer sessions.use_only_cookies et désactivez session.use_trans_sid

    • Évite de partager accidentellement l'ID de session de l'utilisateur en partageant une URL avec l'ID de session qu'il contient
    • Empêche l'ID de session d'apparaître dans un en-tête Referer
  4. Périodiquement régénérer l'ID de session et invalider les anciens ID de session peu de temps après la régénération

    • Si un attaquant utilise l'ID de session d'un autre utilisateur, la régénération invalidera la session de l'utilisateur ou de l'attaquant, selon la demande qui régénère l'ID. Vous pouvez ensuite suivre quand quelqu'un essaie d'utiliser une session qui a déjà été régénérée et invalider la session régénérée à ce stade. L'utilisateur pourra se connecter, mais l'attaquant (espérons-le) ne le pourra pas.
  5. Gardez éventuellement des informations supplémentaires dans $_SESSION qui se rapporte à la demande (adresse IP, chaîne d'agent utilisateur, etc.)

    • Si un attaquant accède d'une manière ou d'une autre à un ID de session, cela peut éventuellement détecter l'intrusion avant que l'attaquant puisse accéder aux données. Cependant, gardez à l'esprit que cela peut aggraver l'expérience utilisateur. Par exemple, l'adresse IP peut changer lorsque l'utilisateur passe d'un réseau mobile au Wi-Fi, et la chaîne d'agent utilisateur peut changer lorsque son navigateur se met à jour automatiquement. Ajustez les données vérifiées en fonction des compromis que votre site est prêt à traiter.
36
0b10011

Répondre à cette question nécessite 2 approches:

  1. Les ID de session PHP sont assez difficiles à deviner pour la plupart des cas d'utilisation. Pas beaucoup plus dur ou moins dur que les autres systèmes largement utilisés.

  2. Ne faire confiance qu'à un cookie de session (et seulement à l'existence d'un cookie de session) ne semble pas aller très loin en termes de sécurité, peu importe d'où vient ce cookie de session - PHP ou ailleurs).

Donc, en bref: PHP les sessions sont aussi sécurisées que votre utilisation les rend. Cela est vrai pour tout système basé sur des cookies de session que je connais.

5
Eugen Rieck

Si c'est le cas:

$_SESSION['user'] = $username;

$username Ne sera alors pas directement stocké dans un cookie. Au lieu de cela, un identifiant de session unique sera généré et stocké dans un cookie.

Les informations que vous stockez dans $_SESSION Ne sont stockées que côté serveur et ne sont jamais envoyées au client. À la demande ultérieure du client, le serveur chargera les données de session par l'ID stocké dans le cookie lorsque vous effectuez session_start().

C'est relativement sûr. La seule chose qui puisse arriver, c'est que quelqu'un pourrait intercepter l'identifiant de session et ainsi voler la session des utilisateurs réels. Le HTTPS peut cependant empêcher cela.

3
d_inevitable

Quelle que soit la réponse que vous obtiendrez sur ce sujet, vous ne serez probablement pas satisfait car il y a tellement d'opinions différentes sur le sujet. Il y a même des livres entiers écrits sur les sessions et la sécurité PHP en général.

La meilleure réponse que vous pouvez espérer obtenir ici est probablement "les sessions sont aussi sûres que vous le souhaitez". Plus de travail et un plus grand nombre de précautions les rendront évidemment plus sûrs à utiliser mais la mise en œuvre elle-même prendra plus de temps. Comme pour tout, vous êtes le seul à mesurer le niveau de sécurité suffisant pour vos besoins.

1
brezanac

Étant donné que vous êtes un programmeur C++, il vous suffit de savoir que la session visible du côté client n'est qu'un pointeur sur un espace d'adressage différent (le serveur) et, par conséquent, la session n'est pas accessible à partir du mode client.

0
Michael Chourdakis