Sécuriser les sessions [Résolu]

Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Bonjour ici :) ,

Je me forme en ce moment au PHP.

Du coup forcement je regarde un peut la sécurité. Et je cherche à éviter le vol de session (enfin j'apprends quoi ^^)

Ce genre de chose vous paraît correct et suffisant d'un point de vue générale ou non ;
 if (!isset($_SESSION['IP_CLIENT']))
{
$_SESSION['IP_CLIENT'] = $_SERVER['REMOTE_ADDR'];
}
else
{
if ($_SESSION['IP_CLIENT'] != $_SERVER['REMOTE_ADDR'])
{
//Vole de session ! (interdi l'IP client, envois de mail, ...)
}
}


Merci d'avance
Afficher la suite 

6 réponses

Messages postés
27288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 janvier 2020
321
Commenter la réponse de jordane45
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
0
Merci
Merci, j'avais déjà consulté le 1er lien mais je découvre le second.

Bon en résumé, sécuriser les sessions ce n'est pas si facile :/

Les changements d'IP (cher OAL notament, évoqués dans le second lien) sont une réalité "vrais", ou son plutôt anecdotique ?

Sinon le coup des tickets, ça me plais pas mal.
Ca ne posera vraiment pas de soucis si mon visiteur fait "précédant" ? Je ne pense pas que cela affecte les cookies, dans le doute je préfère demander ^^ (encore débutant en PHP).
Commenter la réponse de Polack77
Messages postés
27288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 janvier 2020
321
0
Merci
si mon visiteur fait "précédant" ? Je ne pense pas que cela affecte les cookies, dans le doute je préfère demander

Ca ne modifie les cookies "que" si la page consultée contient du code qui les modifie....
Dans le cas contraire..ça n'a aucune incidence.

Comme indiqué dans beaucoup de discussions... le vol de cookie est quelque chose d'assez rare (car assez compliqué à mettre en place... puisqu'il faut "intercepter" la connexion de l'utilisateur)...;
Mais pour assurer une bonne "protection" à ton site.. le mieux est de passer par du SSL (crypter toute ta session en bref)...

L'utilisation de variables ( IP .. autre Cookie...) pour essayer de controler que la session appartient bien au bon utilisateur n'est de toute façon pas "sûre" .. puisqu'il est possible de toutes les contourner ... émuler un fausse IP par exemple...


Comme conseillé dans de nombreux sujets relatifs à la sécurité... il vaut mieux centrer tes efforts sur les failles XSS et l'injection SQL...Cela limite grandement les marges de manoeuvres des éventuels pirates.


Commenter la réponse de jordane45
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
0
Merci
OK, j'avais compris que le SSL est ce qui ce fait de "mieux". Mais pour ce que je veux faire actuellement, ça serait utiliser un bazooka sur une mouche. Je n'ai pas de donnée confidentielle à gérer (bon sauf si un co_ d'utilisateurs utilise son N° de CB comme nom d'utilisateur ou mot de passe XD ). Mais je m'intéresse bien sûr au sujet.

La faille XSS, je l'ai écrit en gros, souligner, surligner, colorier, un vrai Sapin de noël celle ça.
Mais puisqu'on en parle, la fonction "htmlspecialchars" me suffisante (vue qu'elle remplace entre autres les carac < et >, ça me semble OK) . Et concernant l'injection de SQL (je n'ai pas encore potassé ce sujet par contre), ça fait le job ?

Merci encore de ton intérêt :)
jordane45
Messages postés
27288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 janvier 2020
321 -

Et concernant l'injection de SQL (je n'ai pas encore potassé ce sujet par contre), ça fait le job ?

Ben en gros.. (des tutos te l'expliquerons surement mieux et plus en détail que moi).. c'est pour éviter qu'un utilisateur s'amuse à passer dans ses variables des choses pouvant générer des requêtes erronées donnant accès , par exemple, à la liste de tous les users de ta BDD ....

Imaginons que tu ais un formulaire dans lequel l'utilisateur doive saisir son login et son mot de pass...et qu'il s'amuse à ajouter à son login :
  OR 1=1; --


Si toi de ton côté tu as fait une requête du genre :
SELECT * FROM matable
WHERE login = '$login'
AND Password = '$Password'



Ta requête sera transformée de cette façon :
SELECT * FROM matable
WHERE login = '$login'
OR 1=1; --AND Password = '$Password'

.... Ce qui revient donc à lister tous tes users...


Pour y remedier, il est conseillé, par exemple, d'utiliser les fonctions comme mysqli_prepare () ou PDO:prepare() => http://php.net/manual/fr/pdo.prepare.php

Mais comme je te le disais.. regarde les Tutos.. ils sont plus "clairs" que moi. ^^
Polack77
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Hmmmmm ok j'ai compris ce qu'est l'injection de SQL... Pas mal en faite comme idée ^^. Tout simple mais peut faire de gros dégats.

Et prime si on connaît un peut le SQL on peut faire joujou avec ce genre de méthode. Même pour se prémunir de ça, si on connaît un peut le SQL aussi, c'est vraiment facile en fait. Il faut échapper certains caractères (heeeee comme toujours quand on utilise des données clients pour construire les requêtes).

Remplacer la simple côte par deux simple coôtes, habitude que j'ai prise suite à des clients utilisant des noms comme "l'bomec" par exemple ( -_- ) ce qui fait tout planter si on n'échappe pas correctement. (J'avais même fait craquer un collègue en insérant un caractère 0 dans un nom d'utilisateur ^^). Dans ton exemple ça donnerait :

SELECT * FROM matable
WHERE
login = '$login'' OR 1 = 1; ''--' AND Password = '$Password';


Donc pas de problème. Passer toutes les données en Base64 peut aussi être une solution bazooka ^^.

Mais l'idée reste pas mal (et même portable sur d'autres programmes... Rahaha j'ai encore un collègue qui vas avoir une surprise :p). Je vais vérifier si d'autre carac de contrôles serait pas utilisable aussi...

Une dernière fois merci, je pense que le sujet est clos (enfin j'ai les réponses à mes questions en tout cas :p)
jordane45
Messages postés
27288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 janvier 2020
321 -
Si la question est résolue..
Merci de ne pas oublier de clôturer le sujet
(en cliquant sur le lien "Marquer comme résolu" qui se trouve sous le titre de la question)

Cordialement,
Jordane
Polack77
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
J'arrive, j'arrive je relis le sujet voire si ne n'oublie vraiment rien ^^

Bonne fin de journée :)
Polack77
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
En finale j'ai quand même encore une toute petite question (je n'ouvre pas un nouveau sujet car tout ça est lié).
Dans le second lien que tu m'as donné : http://guillaume-affringue.developpez.com/securite/chiffrement/?page=4

Il y a une ligne qui attire mon attention :
$_COOKIE['ticket'] = $ticket;

Et ce n'est pas la 1re fois que je vois cette syntaxe.
L'utilisation de la fonction setcookie n'est pas obligatoire ? Soit :
setcookie('ticket', $ticket);


(j'avoue que si les deux syntaxes étaient correctes, étant de formation C/C++ à la base, ça me piquerait les yeux une nouvelle fois. Mais je reconnais aussi qu'une des syntaxes est très pratique d'utilisation et que l'autre est très souple, donc je pardonne d'avance cette hérésie, enfin si elle existe bien ^^)
---
n.b. message corrigé suite à la réponse de jordane45 ;)
Commenter la réponse de Polack77
Messages postés
27288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 janvier 2020
321
0
Merci
Donc là ..oui c'est en effet étrange comme écriture...
ça stockera bien la variable $ticket dans la variable $_COOKIE ... mais ça ne l'écrira pas sur le poste du user (à vérifier.. mais je ne pense pas me tromper)....

EDIT : En fait, c'est utilisé pour forcer la variable globale $_COOKIE le temps que tu lances une nouvelle "requete" php
Sinon ta variable ne sera pas initialisée (celle que tu envoies via setCookie) tant que tu n'auras pas rechargé la page)

Tu peux tester ça par exemple:
$valeur = "coucou" ;
// on stocke la valeur dans le cookie : test
setcookie('test', $valeur, time()+60*30);

if(isset($_COOKIE['test']) && !empty($_COOKIE['test']){
 // le cookie existe bien :
 echo "<br> Il devrait contenir : ".$test;
 echo "la valeur actuelle du cookie est :".$_COOKIE['test']."<br>";
}else{
 echo "le cookie test est n'existe pas ou est vide !<br>";
 // on charge le cookie avec la valeur : $test
 $_COOKIE['test'] = $test;
 echo "<br> Maintenant  la valeur du cookie est :".$_COOKIE['test']."<br>";
}
Commenter la réponse de jordane45
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
0
Merci
Désolé pour la réponse tardive.

OK, donc si on veut la variable sur la page courante ET sur la/les page/s suivante/s faut faire les deux. Il me semblait bien aussi que c'était pas normal ^^.

Je commence à me sentir armé niveau sessions et cookies (vus la qte de doc avalées ça serait dommage quand même ^^). Et tu m'auras bien aidé, que la farce soit avec toi (oui ce soir c'était tomates farcies maison, alors forcément des séquelles sont là XD)
jordane45
Messages postés
27288
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 janvier 2020
321 -
Tu auras fait un bon repas aujourd'hui.. tomates farcies + des tonnes de cookies... attention à l'indigestion ;-)

Bonne soirée.
Commenter la réponse de Polack77