Variable $_SESSION

Résolu
MickaToast Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   -  
MickaToast Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Voilà, je suis débutant en PHP mais je me débrouille plutôt assez bien, par contre j'ai une question que je me pose depuis longtemps et je n'arrive pas à trouver de réponses sur internet.
Voilà ma question: Est-ce que une variable super globale tel que $_SESSION peut être modifiée directement par un utilisateur?

Voilà le contexte: Je souhaite créer un système de gestion de membres (avec base de données MySQL et tout le blablabla), dès qu'un utilisateur entre un bon identifiant (Pseudo + Mot de passe) une variable de type bool sera alors mis en place dans une variable super-globale nommée "$_SESSION["membre"]". Le site détectera alors si une variable "$_SESSION["membre"]" est définie comme TRUE, si elle l'est, l'utilisateur est un membre de mon site. La question que je me pose c'est est-ce qu'un inconnu (qui n'est pas membre) peut définir la variable $_SESSION["membre"] au serveur.

Merci par avance de votre aide!

1 réponse

Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Salut,

Non, à moins de pirater le serveur web ou d'utiliser des failles de sécurité, l'utilisateur ne peut pas modifier les variables serveur tel que $_SESSION.

Bonne journée
1
MickaToast Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   24
 
Merci de ta réponse!

Quels genres de failles de sécurités permet de créer/modifier une variable $_SESSION et comment les contrer? (Je connais déjà les failles XSS et les injections SQL et je sais les contrer).
0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
En plus des failles XSS, les attaques du type Man-in-the-middle ou CSRF peuvent permettent d'usurper l'identité d'un utilisateur identifié.
Pour les attaques CSRF, on utilise souvent des jetons de sessions (tokens).
http://blog.synapse-studio.fr/se-proteger-des-attaques-csrf/
Les attaques Man-in-the-middle sont plus rares et il faudrait crypter les échanges pour les contrer.

Les sessions php ne sont que des fichiers sur le serveur, donc un accès au système de fichier grâce à exploit php permet également de modifier les sessions.
Pour éviter cela il faut garder une version de php à jour et ne pas avoir de faille de sécurité dans son code.

Si tu contrôle bien les entrées et sorties de ton code php pour contrer les injections SQL, XSS et les attaques CSRF, tes sessions seront relativement bien sécurisées.
0
MickaToast Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   24
 
Super, merci beaucoup de tes réponses!

J'ai une dernière question qui concerne les failles XSS.

Est-ce que ça suffit si je contrôle seulement les entrées des utilisateurs et non pas les sorties.
Par exemple, pour enregistrer un message d'un utilisateur dans une base de données j'utilise:
1. Un formulaire (avec une action="send.php" pour le form et un name="message" pour le input) qui permet aux membres d'ajouter un message.
2. La page "send.php" qui capte les entrées (si elles sont présentes) et qui les enregistre sous forme de "strip_tags($_POST["message"])".

Par logique, du moins ma logique si elle est bonne, la base de données ne comportera aucune balise de type <script> car j'ai dis à l'entrée de faire un "strip_tags" sur la valeur $_POST["message"], je n'aurais donc pas besoin de filtrer les sorties, par exemple pour afficher ce message quelque part.
Est-ce donc correct si je filtre seulement les entrées et non pas les sorties, ou alors il faut absolument filtrer les deux?

Merci par avance de ta réponse :)
0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Il est plus sur de toujours filtrer également les sorties. "Never trust user inputs"

L'utilisation de strip_tags avant l'enregistrement en bdd n'est pas une très bonne façon de faire : celle-ci ne te protège pas des injections sql.

Pour l'enregistrement en bdd il faut utiliser soit :
- les requêtes préparées ou la méthode quote() avec l'api PDO
- mysqli_real_escape_string() avec l'api MySQLi
- mysql_real_escape_string() avec l'api MySQL (obsolète)

Ces méthodes sont les seules à connaitre les spécificités de ton SGBD (encodage, caractères spéciaux...) pour échapper correctement les entrées utilisateurs contre les injections sql.

Pour l'affichage des données non sures en html, il faut utiliser la fonction htmlentities() avec le bon encodage.
0
MickaToast Messages postés 142 Date d'inscription   Statut Membre Dernière intervention   24
 
D'accord, je vais appliquer ces fonctions à chaques entrées maintenant !
Merci beaucoup pour ton aide !

Bonne journée.
0