Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/06/2008, 13h38   #1
Membre confirmé
 
Avatar de Jihnn
 
Inscription : décembre 2005
Messages : 330
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 330
Points : 216
Points : 216
Par défaut [Cookies] Sécurité avec les sessions et actions importantes

Bonjour,

Je suis en pleine programmation d'un petit projet personnel. Possibilité de se créer un compte, de poster des news, des commentaires, etc.

Je travaille beaucoup avec les sessions, et j'ai justement une variable session qui me donne le flag de mon utilisateur connecté. Par exemple, si le flag est x, l'utilisateur est un admin.
L'admin peut poster, modifier ou effacer des news. Il peut aussi effacer les commentaires des utilisateurs.

Vous comprenez, j'ai un peu peur pour la sécurité de mon site. J'ai l'impression qu'une personne malveillante pourrait tout à fait voler ma session, ou celle d'un supermodérateur, pour modifier le site. Bon, on s'entend, modifier les news ou effacer des commentaires, c'est pas super grave, mais c'est pour le principe.

J'ai lu le début du tutoriel de sécurité des sessions (avec la BDD).

Question #1: Est-ce que j'ai vraiment à m'en faire à propos des sessions ?
Question #2: Si oui, est-ce qu'ajouter une fonction à la page de connexion pour ajouter la session à la BDD, et enlever l'entrée à la déconnexion, est assez ?

Merci d'avance,

Jihnn
Jihnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 15h25   #2
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 818
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2005
Messages : 818
Points : 456
Points : 456
Normalement c'est bon.

Si par exemple tu utilises les cookies, là tu peux t'inquiéter et vérifier qu'il n'y a pas de failles XSS sur ton site.
__________________
Solutions pour concessions et garages automobiles =>
http://www.fastback.be
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h03   #3
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
une session EST un cookie. Plus précisement, l'ID de session est stockée dans un cookie. Se faire voler le cookie c'est se faire voler la session.

Dejà, plusieurs choses :

* Soit tes admin doivent se relogger a chaque fois => dans ce cas la le cookie a une durée de vie tres limitée (limité au seul temps de connection sur le site, le risque est faible)
* Soit tu autorise une fonction "se souvenir de moi" et dans ce cas là tu augmente le risque, puisque le cookie peut persister 1 jour, 1 semaine, 3 mois, 2 ans... selon ce que tu parametre

Ensuite, tu as 4 cas de vols je dirais :
* L'acces physique a la machine. Tu peux pas y faire grand chose, mais le risque est faible, sauf en cas d'utilisation d'une machine publique (cyber café, etc...). Dans tout les cas, éviter de mettre l'ID de session en parametre d'une URL... tout passer dans des cookies c'est quand meme mieux
* Le "man in the middle" : En gros un gars qui va sniffer les paquets qui passe et récuperer toutes les infos... si tu n'as pas un chiffre d'affaire de quelques millions avec 300 concurrents, le risque se limite a l'apprenti hacker qui veux se faire les dents... mais ca demande trop de matos pour lui (a moins d'etre sur un reseau local ;o)
* La faille exploitée par un pirate
Tu as une faille sur ton site qui permet de voler ton ID de session. echo $_GET['toto']; par exemple (et oui, c'est une faille ^^). Une personne mal intentionnée peut l'utiliser pour récuperer l'ID de session
* La faille exploitée a son insu par le super utilisateur... uniquement si tu construit des URL avec l'ID de session en parametre. Le super admin veux montrer une page *publique* a de ses amis et copie/colle l'URL contenant... son ID de session => son ami pourra se connecter avec sa session.
Plus méchant, il clic sur un lien externe... le site cible peut enregistrer l'adresse HTTP_REFERER d'ou il vient... qui peut contenir l'ID de session dans l'URL ;o)

Se prémunir du vol de session ?
-- sans impact pour l'utilisateur --
=> ne JAMAIS passer l'ID de session en parametre d'une URL
=> éviter d'avoir des failles de sécurité classique sur son site ;o)
-- avec impact pour l'utilisateur (a pondérer selon ce que tu souhaites comme sécurité --
=> définir une durée de cookie la plus courte possible ;o)
=> implémenter des controles de session (par exemple lier une ID de session a une adresse IP. Si quelqu'un charge une session mais que son IP n'est pas celle qui a servie a créer la session... c'est qu'il y a vol... ou qu'il est derriere un proxy avec plusieurs point de sortie (par exemple AOL... pas de bol ^^))
=> implémenter des controles divers et variés. Tu peux enregistrer le type et la version du navigateur dans la session. Avec un peu de chance, le voleur n'aura pas la meme version du navigateur et tu pourras le detecter.
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h22   #4
Membre confirmé
 
Avatar de chtipitou
 
Étudiant
Inscription : mars 2006
Messages : 175
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2006
Messages : 175
Points : 204
Points : 204
tres bon article Fladnag, je prend note
__________________
42
there is no place like 127.0.0.1
Mangez des http://www.smarty.net avec vos PHP web s'il vous plait
var_dump retourne les informations structurées d'une variable, y compris son type et sa valeur. Les tableaux et les objets sont explorés récursivement, avec des indentations, pour mettre en valeur leur structure.
chtipitou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h30   #5
Membre confirmé
 
Avatar de Jihnn
 
Inscription : décembre 2005
Messages : 330
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 330
Points : 216
Points : 216
Merci beaucoup Fladnag.

Pour l'accès physique et le "man in the middle", on peut pas faire grand chose j'imagine

Mais tu donnes comme exemple "echo $_GET['toto'];", je ne comprends pas comment, avec celà, quelqu'un peut retrouver l'id de la session...

Sinon, je ne mets jamais la session_id en paramètre.

Par contre pour les cookies, c'est déjà un autre problème, j'aurais aimé compléter mon système en instaurant une fonction de ce genre... Par contre, un doute me vient à l'esprit : Est-ce que tu parles, par exemple, de mettre la session_id dans la valeur d'un cookie ? Par exemple, si je mettais seulement un cookie du genre "se_souvenir" avec valeur "true", "account" contenant le compte de l'utilisateur et "password" contenant le password (crypté évidemment :p), et que je connecte l'utilisateur via un script, y a-t-il un risque ?

Merci encore,

Jihnn
Jihnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h37   #6
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Alors, a choisir, il vaut mieux mettre l'ID de session dans un cookie plutot que le login ou le pass, meme crypté ;o)

Pour le echo $_GET['toto']; :

Code :
page.php?toto=<script>alert(document.cookies);</script>
Si tu fait ca, tu va executer du code javascript... qui va lire un cookie. Donc tu pourrais executer du code javascript qui redirige vers une page (le site du pirate) avec le cookie en parametre (rappel = le cookie contient l'ID de session !!)

Ca s'appelle du CSS (Cross Site Scripting) ou CCS (Cross Code Scripting) ou XSS, bref, y a quelques acronymes, tu choisis celui que tu veux ;o)

Apres, l'idée c'est d'envoyer un mail a un des membres contenant un lien piégé contenant l'URL "construite". Si le membre clic sur le lien, son ID de session sera envoyé sur le site du pirate, stockée, et le membre redirigé vers une page 404 de ton site, ni vu ni connu ;o)

Pour s'en protéger... verifier TOUTES les variables qui viennent de l'exterieur ($_GET, $_POST, $_COOKIE, $_FILES) et dans le cas de l'exemple :

Code :
echo htmlentities($_GET['toto']);
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h43   #7
Membre confirmé
 
Avatar de Jihnn
 
Inscription : décembre 2005
Messages : 330
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 330
Points : 216
Points : 216
Ah oui, j'y avais pas pensé, même si je protège toutes mes variables :p

Bon, alors je ne sais plus trop quoi faire pour le truc de "Se souvenir" maintenant :o
Jihnn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 18h27   #8
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Bah, apres ca c'est la theorie... en pratique, le "Se souvenir" est bien plus pratique que dangereux ;o) Rien ne t'empeche de mettre des cases "Se souvenir" avec des durées de cookies d'un ou deux mois pour tes utilisateurs "de base" qui ne peuvent que modifier leur données, et de mettre des cases "Se souvenir" avec des durées de cookies parametrables ou de durée inferieure (1 semaine, 2 jours) pour tes super utilisateurs, s'ils manipulent des données sensibles.

Tu peux aussi implémenter le controle de l'IP pour des super utilisateurs... s'il n'y en a aucun chez AOL ;o)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 21h38   #9
Membre confirmé
 
Avatar de juliens9
 
Directeur technique
Inscription : mars 2007
Messages : 192
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : mars 2007
Messages : 192
Points : 220
Points : 220
Pour augmenter aussi la sécurité pense a bien configurer ton pare feu. SI tu as iptables, change bien les politiques de INPUT, OUTPUT et FORWARD;
Cela evitera que l'on fasse des acces forcer a ton serveur pour pouvoir récuperer mots de passe et autre.

Ensuite pense bien au code de turing et autre pour le controle des mots de passe et autre variable. Beaucoup de hack sont fait en utilisant des taches automatisés et des robots. Cela te permettra de lutter contre ce type d'attaque.
juliens9 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 11h53   #10
Rédacteur/Modérateur
 
Avatar de 12monkeys
 
Homme Dr. Peters
Webmaster
Inscription : novembre 2006
Messages : 3 630
Détails du profil
Informations personnelles :
Nom : Homme Dr. Peters
Âge : 35
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Webmaster
Secteur : Service public

Informations forums :
Inscription : novembre 2006
Messages : 3 630
Points : 6 232
Points : 6 232
Bonjour

Citation:
Envoyé par Jihnn Voir le message
Pour le "man in the middle", on peut pas faire grand chose j'imagine
Pour compléter cet excellent post de Fladnag : http://guillaume-affringue.developpe...rement/?page=2, lire cette page et la suivante, pour voir comment y remédier, et d'ailleurs l'article en entier parce qu'il est excellent lui aussi...
__________________
Vous débutez dans la creation de sites web : les bases du html et débuter avec les CSS
Pas de MP pour des questions techniques ! Mode d'emploi du forum ; Règles ; Pensez à la balise code ; Pas de SMS !
Votez pour les messages qui vous ont aidés...
12monkeys est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h57.


 
 
 
 
Partenaires

Hébergement Web