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!
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.
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.
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.
Activer session.use_strict_mode
:
$userId-
)Activer sessions.use_only_cookies
et désactivez session.use_trans_sid
Referer
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
Gardez éventuellement des informations supplémentaires dans $_SESSION
qui se rapporte à la demande (adresse IP, chaîne d'agent utilisateur, etc.)
Répondre à cette question nécessite 2 approches:
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.
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.
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.
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.
É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.