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 08/12/2006, 13h16   #1
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 130
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 130
Points : 27
Points : 27
Par défaut [Sécurité] Problème de sécurité

Bonjour j'ai crée un espace membre (php avec base mysql).

Quand la personne rempli son formulaire, elle accède à ces informations (page afficher.php).

Cette personne peut modifier ces informations (page modifier.php).

Le probleme, je peux passer une adresse par l'url pour tous les personnes inscrites:

Code :
1
2
 
http://www.monsite/afficher.php?id=1
En tapant cette adresse et en changeant l'id j'ai accès à toutes les pages .

Pourtant j'ai mis ca en haut de ma page afficher.php

Code :
1
2
3
4
5
6
7
8
9
 
<?
session_start();
 
if(!isset($_SESSION['login'])) {
  include('login.htm');
  exit;
}
?>
Mais cela ne marche pas

Merci de votre aide
pod1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 13h23   #2
Membre habitué
 
Avatar de galak63
 
Inscription : novembre 2006
Messages : 126
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 126
Points : 134
Points : 134
ce n'est pas
Code :
include( "login.htm" );
mais :
galak63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 13h45   #3
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par galak63
ce n'est pas
Code :
include( "login.htm" );
mais :
Non plus, non...

Code :
header("Location: login.htm");
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 13h48   #4
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 130
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 130
Points : 27
Points : 27
Merci mais cela ne change rien, je peux toujours accèder a toutes les pages en changeant l'id de l'url.

Je me permet de montrer mes pages.

Page verif.php : verifier le formulaire et affiche une partie des infos de l'utilisateur

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
<?php 
session_start();
 
$base = mysql_connect '', '', '');
mysql_select_db ('', $);  ?>
 
 
<table width="500"><tr><td class="titre_infos">Espace Membre</td></tr>
<tr><td><a  href="http://www.annuaire-les-vacances.com/membre/logout.php">Déconnexion </a></td></tr></table>
<?php
 
 
if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) {
  extract($_POST);
 
  $sql = "select pwd from tbl_user where login='".$login."'";
  $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
 
  $data = mysql_fetch_assoc($req);
 
  if($data['pwd'] != $pass) {
    echo '<table align=center><tr><td width=500 class=descriptif_infos>Mauvais login / password. Merci de recommencer</td></tr></table>';
    header('login.htm'); 
    exit;
  }
  else {
 
    $_SESSION['login'] = $login;
 
    echo '';
 
  }   
}
else {
  echo '<table width=500 align=center><tr><td width=650 class=descriptif_infos>Vous avez oublié de remplir un champ.</td></tr></table>';
   header('login.htm'); 
   exit;
}
 
 
$sql = "SELECT * FROM gites, tbl_user WHERE gites.mailProprio=tbl_user.login AND tbl_user.login='".$_SESSION['login']."'";
 
    $requete = mysql_query( $sql, $cnx ) ;
   $id  = $_GET["id"] ;
 
    while( $result = mysql_fetch_object( $requete ) )
 
    {
       echo("<table width=500><tr><td width=450 class=descriptif_infos>
	   <b>".$result->nomGite."</b><br>".$result->regionGite."<br>".$result->dptGite."<br></td><td>&nbsp;</td><td class=descriptif_infos> 
	   <a href=\"#\" onClick=\"javascript:twNeowin('afficher.php?id=".$result->id."','monPopUp',600,400);\">modifier</a></td></tr><tr><td>&nbsp;</td></tr>\n") ;
 
    }
 
  ?>
Page afficher.php, la personne peut modifier ses infos

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
<?
session_start();
 
if(!isset($_SESSION['login'])) {
 
 echo '<table><tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
   echo '<tr><td align=center width=650 class=texte_formulaire>Vous n\'êtes pas autorisé à acceder à cette zone</td></tr>';
     echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr></table>';
  header('login.htm');
  exit;
}
 
 
    $cnx = mysql_connect ('', '', '');
 
    $db = mysql_select_db( '' ) ;
 
  $id  = $_GET["id"] ;
 
  /
$sql = "SELECT * FROM gites   WHERE id = ".$id ;
 
 
  $requete = mysql_query( $sql, $cnx ) or die( mysql_error());
 
 
  if( $result = mysql_fetch_object( $requete ) )
  {
 
  ?>  
 
 
  <form name="insertion" action="modifier.php" method="POST">
  <input type="hidden" name="id" value="<?php echo($id) ;?>">
 <div class="membre">
 <table  border="0" align="center" cellspacing="2" cellpadding="2">
  <tr><td width="400" class="titre_infos">Modifier votre annonce</td></tr></table>
 
  <table  border="0" align="center" cellspacing="2" cellpadding="2">
      <tr align="center">
      <td class="descriptif_infos"><div align="left">Titre</div></td>
      <td ><textarea name="nomGite" cols="80"><?php echo($result->nomGite) ;?></textarea></td>
    </tr>
    <tr align="center">
      <td  class="descriptif_infos"><div align="left">Description</div></td>
      <td ><textarea name="descriptionGite" cols="80"><?php echo($result->descriptionGite) ;?></textarea></td>
    </tr>
    <tr align="center">
	<tr>
	  <td  class="descriptif_infos">R&eacute;gion</td>
 
      <td class="descriptif_infos">
     <?php
echo "<select name=\"regionGite\">";
$opt = ($result->regionGite == 'Alsace')?(' selected="selected"'):('');         
echo "<option value=\"Alsace\"$opt>Alsace</option>";
 
$opt = ($result->regionGite == 'Aquitaine')?(' selected="selected"'):('');
echo "<option value=\"Aquitaine\"$opt>Aquitaine</option>";
 
 
$opt = ($result->regionGite == 'Poitou-Charentes')?(' selected="selected"'):('');
echo "<option value=\"Poitou-Charentes\"$opt>Poitou-Charentes </option>";
 
$opt = ($result->regionGite == 'Rhône-Alpes')?(' selected="selected"'):('');
echo "<option value=\"Rhône-Alpes\"$opt>Rhône-Alpes</option>";
 
 
echo "</select>";
 
?>
 
 
 
      <td class="descriptif_infos" colspan="2"><input type="submit" value="modifier"></td>
    </tr>
Et pour finit, pour valider les modifications, ca envoi vers la page modifier.php

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
<?
session_start(); ?
 
if(!isset($_SESSION['login'])) {
 
  echo '<table><tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
  echo '<tr><td width=650 class=texte_formulaire>&nbsp;</td></tr>';
   echo '<tr><td align=center width=650 class=texte_formulaire>Vous n\'êtes pas autorisé à acceder à cette zone</td></tr></table>';
  header('login.htm');
  exit;
}
?>   
 
 
    $cnx = mysql_connect ('', '', '');
 
    $db = mysql_select_db( '' ) ;
 
 
  $nomGite     = $_POST["nomGite"] ;
  $descriptionGite = $_POST["descriptionGite"] ;
  $regionGite = $_POST["regionGite"] ;
  $dptGite        = $_POST["dptGite"] ;
  $typeGite        = $_POST["typeGite"] ;
  $multiTv        = $_POST["multiTv"] ;
  $capaciteGite        = $_POST["capaciteGite"] ;
    $nomProprio        = $_POST["nomProprio"] ;
   $id         = $_POST["id"] ;
 
 
  $sql = "UPDATE gites
          SET nomGite        = '$nomGite', 
	      descriptionGite     = '$descriptionGite',
		  regionGite    = '$regionGite',
		  typeGite           = '$typeGite',
		  multiTv			= '$multiTv',
		  capaciteGite           = '$capaciteGite',
		  nomProprio           = '$nomProprio',
 
          WHERE id = '$id' " ;
 
 
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
 
 
  if($requete)
  {
    echo("<br><br><br><table width=630><tr><td align=center class=descriptif_infos>La modification a été correctement effectuée</td></tr></table>") ;
 
  }
  else
  {
    echo("<br><br><br><table><tr><td class=descriptif_infos>La modification a echouée</td></tr></table>") ;
 
  }
?>
Ca fais pas mal de teps que je consulte tous les forums, les tuto et je n'ai jamais su regler ce probleme.

Merci d'avance pour votre aide
pod1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 13h56   #5
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
preferes <?php à <? (obsolete)
tu as un saut de ligne avt ton session start à supprimer mais tu aurais du avoir l'erreur de header deja envoyé;

met ton error reporting à 0 pour voir ttes les erreurs : error_reporting(0);
ça nous permettra de mieux t'aider
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 13h57   #6
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par pod1978
Merci mais cela ne change rien, je peux toujours accèder a toutes les pages en changeant l'id de l'url.
Bonjour
Je ne vois pas le rapport entre :
1. Le paramètre id dans l'URL
2. Le fait que tu rediriges vers une autre page si une certaine variable de session n'est pas positionnée.
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 14h24   #7
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 130
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 130
Points : 27
Points : 27
Exusez moi mais je ne comprend pas tres bien ce que tu veux dire Eusebius.


Je reformule ma question

Lorsque je remlis le formulaire, je peux consulter mes infos mais le probleme c'est que si je ne ferme pasmon explorateur et que j'ouvre un nouvel onglet si je copie l'url suivante:
http://monsite.fr/afficher.php?id=1235, j'ai accès aux infos d'autres membres.

Et le fais de rajouter ce code en haut de mes pages , je croyais que ca aller me regler ce probleme de sécurité
Code :
1
2
3
4
5
6
7
8
9
 
<?
session_start();
 
if(!isset($_SESSION['login'])) {
header("Location: login.htm");
  exit;
}
?>

Mais ce n'est pas le cas
pod1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 14h28   #8
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
OK je vois, du moment que tu es connecté, tu peux accéder aux données d'un autre compte.

Pour contrer ça, il faut qu'au lieu de vérifier si $_SESSION['login'] est simplement présente, vérifier sa valeur pour savoir si le visiteur a le droit d'accéder à la page (si tu as un id par compte, tu peux mettre cet id dans une variable de session à l'authentification, par exemple)
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 15h21   #9
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 130
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 130
Points : 27
Points : 27
J'ai en effet dans ma bdd mysql un champ qui s'appelle
idmembre

Il faudrais donc que je récupère ce champ lorsque la personne a validé son formulaire:

$_SESSION['idmembre'] = $idmembre;


Et ensuite en haut de mes pages je devrais mettre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
<?
session_start();
 
 
if(!isset($_SESSION['idmembre'])) {
 
 
header("Location: login.htm");
  exit;
}
?>
J'ai testé cela mais ca ne fonctionne toujors pas
pod1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 15h36   #10
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Il faut que tu vérifies que $_SESSION['idmembre'] est bien égal à $_GET['id'], c'est ça ta condition de sécurité...
Code :
1
2
3
4
5
6
7
<?
  session_start();
  if((!isset($_SESSION['idmembre'])) || ($_SESSION['idmembre'] != $_GET['id'])){ 
    header("Location: login.htm");
    exit;
  }
?>
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 16h16   #11
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 130
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 130
Points : 27
Points : 27
J'ai a peu pres compris.

Lorsqu le formulaire d'authentification est soumis, je récupère les champs login et pwd de ma table mysql tbl_user.

Ensuite j'ai une deuxieme table mysql qui s'appelle gites dans laquelles il y bon nobre de champs dont
id
mailProprio...

La relation se fait en fait entre le champ login de la table tbl_user et le champ mailProprio de la table gites et non entre le champ idmembre de la table tbl_user et le champ id de la table gites.

J'ai donc essayé ce que vous m'avez dis:

J'ai récupére le champ mailProprio comme ceci
Code :
1
2
 
$mailProprio=$_GET["mailProprio"];
dans ma page verif.php

Et ensuite dans les autres pages j'ai mis cela au début:
Code :
1
2
3
4
5
6
7
 
<?
session_start();
 
if((!isset($_SESSION['login'])) || ($_SESSION['login'] != $_GET['mailProprio']))
{ header("Location: login.htm");
 exit; } ?>
La bonne nouvelle est lorsque maintenant je tape une url du type:
http://monsite.fr/afficher.php?id=1222, je n'y plus accès et je suis redirigé vers la page login.htm.

Par contre lorsque je veux afficher et modifier mes infos, ca me met ausis cette page login.htm.

Je viens de tester l'affichage et je crois que le problème est que je n'arrive pas à récupérer la valeur du champ mailProprio.

C'est sur la page verif.php ou je dois récupérér ce champ mais pas moyen.

Je vous montre la page car sur cette page j'ai su récupérer des champs de cette table mais d'une autre facon:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
sql = "SELECT * FROM gites, tbl_user WHERE gites.mailProprio=tbl_user.login AND tbl_user.login='".$_SESSION['login']."'";
 
   echo $login;
    //exécution de la requête:
    $requete = mysql_query( $sql, $cnx ) ;
   $id  = $_GET["id"] ;
   $mailProprio=$_GET["mailProprio"];
   $login=$_GET["login"];
 
 
    //affichage des données:
    while( $result = mysql_fetch_object( $requete ) )
 
    {
       echo("<table width=500><tr><td width=450 class=descriptif_infos>
	   <b>".$result->nomGite."</b><br>".$result->regionGite."<br>".$result->dptGite."<br></td><td>&nbsp;</td><td class=descriptif_infos> 
	   <a href=\"#\" onClick=\"javascript:twNeowin('afficher.php?id=".$result->id."','monPopUp',600,400);\">modifier</a></td></tr><tr><td>&nbsp;</td></tr>\n") ;
 
    }
 
  ?>
En effet les champs nomGite, regionGite font partie de la table mailProprio mais je ne sais pas quelle est le code pour récupérer un champ ca celui-ci ne fonctionne pas:
Code :
1
2
 
$mailProprio=$_GET["mailProprio"];
Merci encore pour votre aide
pod1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 16h20   #12
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Dans ton URL, tu as l'id, le mail du proprio et le login ??
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 16h23   #13
Nouveau Membre du Club
 
Inscription : mars 2005
Messages : 130
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 130
Points : 27
Points : 27
Non dans mon url je n'ai que l'id de la table gites
pod1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 17h03   #14
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
Citation:
Envoyé par pod1978
Non dans mon url je n'ai que l'id de la table gites
Alors ça veut dire quoi le $_GET["mailProprio"] ???
http://fr2.php.net/manual/fr/languag...predefined.php
Eusebius 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 09h11.


 
 
 
 
Partenaires

Hébergement Web