JeuWeb - Crée ton jeu par navigateur
est ce que ma session est sécurisée? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : est ce que ma session est sécurisée? (/showthread.php?tid=4566)

Pages : 1 2


est ce que ma session est sécurisée? - php_addict - 31-01-2010

bonjour

je sollicite une fois de plus votre avis sur un autre sujet: sessions et securité:

voila ce que j'ai pour habitude de faire:
Code :
// On demarre la session
ini_set('session.use_trans_sid', '0');
ini_set('session.use_cookies', '1');
ini_set('session.use_only_cookies', '1');
ini_set('url_rewriter.tags','');
session_start();
// verifie si le joueur est connecté (login + password)
if (
   isset($_SESSION['connecte'])
   && !empty($_SESSION['connecte'])
   && $_SESSION['connecte']===4946546
)
{
}
else
{
   exit;
}

la variable $_SESSION['connecte'] est initialisé lors de la verification login+password

est ce que cette facon de faire est correcte pour securiser une session (vol de session et autres trucs de hacker que j'ignore...) ???

je suis preneur de tout conseils, liens, docs etc...:respect:

merci de m'avoir lu

faites de beaux reves


RE: est ce que ma session est sécurisée? - Ekilio - 01-02-2010

Pour répondre à ta question, le plus simple est de détailler le principe des sessions (Et comme ça, tu comprendras que non, ce n'est pas sécurisé contre le vol de session, mais c'est plus ou moins impossible à sécuriser).

Donc, une session, c'est quoi ? C'est un moyen de transférer des informations d'une page à une autre. Quelques rappels pour commencer : lorsqu'on navigue sur internet, on utilise le protocole HTTP. Ce protocole n'est pas authentifié : cela signifie que pour le serveur, et donc pour PHP, il n'y a aucun moyen de savoir, lorsqu'un visiteur charge une page, puis une autre, qu'il s'agit du même visiteur et pas de deux visiteurs différents qui auraient successivement chargé deux pages différentes.

Le principe des sessions va être de remédier à ce problème, en enregistrant une caractéristiques chez le visiteur, qui sera transmise de page en page et donc permettra de "reconnaitre" le visiteur d'une page à l'autre. PHP réalise cela en enregistrant un cookie (donc un fichier texte) sur l'ordinateur du client, et en le lisant à chaque page ; ce fichier contient un nombre (l'identifiant de session) qui est associé à un autre fichier texte, celui-ci stocké coté serveur. Ainsi, il n'y a que ce nombre qui est sur l'ordinateur du client, les autres informations (login et password dans ton cas) sont "sûres" puisque sur le serveur.

Maintenant, le vol de session, qu'est-ce que c'est ? Et bien, cela consiste d'abord à récupérer un identifiant de session appartenant à une autre personne (de préférence un administrateur). Cela peut être réalisé, par exemple, si il est possible d'executer du code javascript sur le site : dans ce cas, on place un code javascript qui lit le cookie écrit par php (rappel : les cookies sont lisibles par n'importe quelle méthode tant qu'on est sur le même site), et qui charge une image sur un serveur contrôlé par le pirate. Laquelle image aura en paramètre get (?id=XXXX) l'identifiant et sera générée par php, avec un enregistrement.

La seconde étape consiste à modifier le cookie pour remplacer notre propre id de session par celui que l'on a intercepté. Des extensions firefox font ça très bien, j'utilise firecookie pour ma part, qui s'intègre à firebug. Et ainsi, lorsqu'on va actualiser la page, le serveur va voir un ID de session sur notre cookie, lire les informations de session correspondantes, considérer que nous sommes l'administrateur, et hop ! Ca fait des chocapic (ou des problèmes, c'est selon).

Alors, comment s'en protéger ? Et bien, il n'y a pas de méthode miracle. A mon avis, la manière la plus simple de faire consiste à empêcher le vol de l'id à la base, plutôt qu'à chercher à empecher qu'il soit modifier, puisque c'est impossible (par définition, l'id de session doit être sur le pc du client, et tout ce qui est sur le pc du client est modifiable et falsifiable). Ca implique à la fois une sécurisation de ton code contre les attaques XSS, et une sécurisation de ta façon d'agir (la tienne et celle de tes administrateurs) pour ne pas utiliser leur compte administrateur dans un endroit à risque (typiquement, les cyber-cafés ou les accès de fac peuvent facilement être espionnés).

PS : Si tu veux t'entrainer de façon légale au piratage, fais un tour sur Hack This Site. C'est un site tout ce qu'il y a de plus légal qui propose des challenges et des missions sur des mini-sites créés par le propriétaire de HTS et pour ce but, et qui contiennent tous une faille de sécurité. Ca permet d'en apprendre beaucoup, par la pratique !


RE: est ce que ma session est sécurisée? - php_addict - 01-02-2010

salut et merci pour ta reponse!

donc je dois securiser tout mes script contre les attaques XSS c'est tout ??? cela implique simplement des htmlentities sur les données de mes formulaires, c'est tout?

bonne journée


RE: est ce que ma session est sécurisée? - Ekilio - 01-02-2010

Ce n'est pas "tout" au sens où tu dois sécuriser beaucoup d'autres choses. Mais en l'occurence, l'attaque par vol de session peut venir de là (ou, encore une fois, d'un virus, de l'utilisation d'un pc non-sécurisé, d'un espionnage de réseau, etc...)

Mais disons que c'est la seul précaution en code que tu peux prendre ; en ne te contentant pas des formulaires, attention, on peut en injecter partout, même dans l'URL si tu utilises des paramètres GET. Le principe est en fait toujours le même : partout où l'utilisateur peut envoyer des données, il peut tenter de te pirater.


RE: est ce que ma session est sécurisée? - php_addict - 01-02-2010

oulalala oui, j'ai completement oublier les GET...

encore merci ;-)


RE: est ce que ma session est sécurisée? - Anthor - 01-02-2010

Outre XSS, il y a aussi CSRF...

Tu peux ajouter des jetons aux formulaires, vérifier, que les entêtes du navigateurs sont les mêmes, il existe plein de méthodes.
Généralement les frameworks intègrent ces sécurités par défaut.


RE: est ce que ma session est sécurisée? - php_addict - 01-02-2010

salut

oulala merci je ne connaissais meme pas CSRF...

Outre XSS, il y a aussi CSRF...il y a d'autres failles?

quant tu parle de jetons dans les formulaires, c'est pas un truc du genre :?

Code :
<input type="hidden" name="jetons" value="654df654dfg"></input>

où value est le time() crypté?

ca complique la chose sans framework...

encore merci


RE: est ce que ma session est sécurisée? - Ekilio - 01-02-2010

value n'est pas le time() crypté, mais un jeton qui va être passé à la fois par le formulaire et un autre endroit (typiquement, la session).

Le principe des CSRF est d'amener l'utilisateur, sans qu'il le sache, à executer une action. Quelques exemples :

Mettons que tu es administrateur du jeu. Tu te connectes au jeu, ta session se fait par cookie. Je reprends pour commencer l'exemple de wikipédia : j'apprends que l'url pour monter mes caracteristiques est monter.php?personnage=25 (où 25 est mon ID). Si je poste sur ton forum un truc comme ça :

[ img]http://www.tonjeu.com/monter.php?personnage=25[/ img]

Ton navigateur va chercher à charger la page comme une image. Les cookies sont envoyés dans les images ; donc tu vas automatiquement être connecté, et ça va monter mon personnage, sans même que tu ne t'en aperçoive.

Autre exemple : je sais que le formulaire pour supprimer un personnage ressemble, dans le code, à ça :

Code PHP :
<?php 
<form method="post" action="supprimer.php">
Id à supprimer : <select name="personnage">
<
option value="1">Supprimer le personnage 1</option>
<
option value="2">Supprimer le personnage 2</option>
<
option value="3">Supprimer le personnage 3</option>
</
select>
<
input type="submit" /></form>

Un truc tout simple. Mettons maintenant que, en tant que membre de ton jeu, je veux que le personnage 2 soit supprimé. Si je t'amène (par exemple par un lien sur le forum) à valider un formulaire à la con de ce genre :

Code PHP :
<?php 
<form method="post" action="http://www.tonjeu.com/supprimer.php">
Entrez un chiffre : <input name="chiffre" />
<
input type="hidden" name="personnage" value="2" /><input type="submit" /></form>

Si tu valides mon formulaire, tu seras redirigé vers ta page de suppression, avec en paramètre post les paramètres qu'il y aurait si tu venais de supprimer le personnage 2.

Bien entendu, dans les deux cas, ces attaques sont simples et assez grossières, mais c'est le principe de base. Donc, pour éviter ça, il faut :

- Ne pas faire d'action importantes par get
- Ajouter un token de courte durée, qui doit obligatoirement être valide, dans les formulaires.

Encore un dernier exemple pour bien faire comprendre : sur jeuweb, le lien pour marquer tous les fora comme lus est le suivant : http://archive.jeuweb.org/misc.php?action=markread

Donc, étant donné qu'en voyant ce forum, nous sommes connectés, si je faisais :

[ img]http://archive.jeuweb.org/misc.php?action=markread[/ img]

Chaque personne voyant ce message aurait tous les fora marqués lus... sans rien faire !


RE: est ce que ma session est sécurisée? - php_addict - 02-02-2010

merci de ta reponse je vais etudier tout ceci de plus pres


RE: est ce que ma session est sécurisée? - phenix - 02-02-2010

Le mieux pour évité les problème, c'est de travailler uniquement en session, et de n'envoyer que les actions au serveur.

Par exemple, dans ma session j'ai l'ID du personnage, l'utilisateur veux attaquer un monstre, j'envoie juste l'ID du monstre et l'action (Ici attaquer).

Avec ce système, tu ne sais pas me mentir puisque je vérifie que ton action est correct car ta session ne me ment pas. (Même si tu peux mentir sur l'action ou sur l'ID du monstre)

Perso, pour sécuriser la session, je stock l'ip dans une session à la connexion du joueur et je vérifie tout le temps si elle est la même.