Page 1 sur 2

Sécurité : interdire le changement d'id

Posté : 12 nov. 2006, 21:06
par Kaoteknik
Encore là, à errer sur le forum, en quête de réponses... :oops:

Cette fois il s'agit d'une faille de sécurité dans mon petit programme.

J'ai un fichier "edition.php" qui permet aux personnes enregistrées de modifier leur compte. Pour accéder à cette page leur identifiant (id) passe dans l'url et les paramètres de leur compte s'affichent dans des champs de texte.

Le problème est que si un utilisateur change l'id dans l'url, il peut accéder aux compte d'une autre personne... Pas génial ! :(

J'ai cherché la solution auprès de " l'URL Rewriting", malheureusement mon hébergeur ne m'autorise pas à l'utiliser.

Qu'à cela ne tienne, j'ai cherché un autre moyen d'interdire l'accès à des identifiants autres que celui qui est attribué en démarrant une session. Voici ce que ça donne dans le code :
<?php
session_start();											

if(!isset($_SESSION['pseudos']) && !isset($_SESSION['id'])) {							
  echo 'Vous n\'êtes pas autorisé à accéder à cette zone. Veuillez vous identifier.';	
  include('formidentification.php');						
  exit;														
}

 require_once ("configbdd.php");
 $connexion=mysql_pconnect($dbhost, $utilisateur, $mdp);
 if (!$connexion)
 	{
 	echo "La connexion a échoué.";
	exit;
	}
if (!mysql_select_db(ma_bdd, $connexion))
	{
	echo "La connexion a échoué.";
	exit;
	}


$id=$_GET['id'];

if ($_SESSION['id']<>$id) {
	echo 'Vous n\'êtes pas autorisé à accéder au gestionnaire de cet utilisateur.';
	include ('formidentification.php');
	exit;
}

else {

$ma_requete=mysql_query("SELECT * FROM troupes WHERE id='$id'");
$result=mysql_fetch_array($ma_requete);
?>

<!-- formulaire qui reprend les infos de l'utilisateur -->

<?php
}
?>
Voilà... Ce qui se produit c'est qu'en fait personne n'a plus accès au fichier "edition.php", la redirection sur "formidentification.php" devient systématique.

je suis à court d'idées là ! :?

Posté : 12 nov. 2006, 21:23
par Cyrano
TOn formulaire d'identification utilise la méthode get ou post ?

Posté : 12 nov. 2006, 21:38
par Kaoteknik
Mon formulaire utilise la méthode POST

Voici le code complet, si ça peut aider :
<?php
session_start();											

if(!isset($_SESSION['pseudos']) && !isset($_SESSION['id'])) {							
  echo 'Vous n\'êtes pas autorisé à accéder à cette zone. Veuillez vous identifier.';	
  include('formidentification.php');						
  exit;														
}

 require_once ("configbdd.php");
 $connexion=mysql_pconnect($dbhost, $utilisateur, $mdp);
 if (!$connexion)
 	{
 	echo "La connexion a échoué.";
	exit;
	}
if (!mysql_select_db(ma_bdd, $connexion))
	{
	echo "La connexion a échoué.";
	exit;
	}


$id=$_GET['id'];

if ($_SESSION['id']<>$id) {
	echo 'Vous n\'êtes pas autorisé à accéder au gestionnaire de cet utilisateur.';
	include ('formidentification.php');
	exit;
}

else {

$ma_requete=mysql_query("SELECT * FROM troupes WHERE id='$id'");
$result=mysql_fetch_array($ma_requete);
?>

<form action="traitedition.php" method="POST">
<table border="0" cellpadding="0" cellspacing="0">
<tr><td>Prénom : </td><td><input name="prenom" type="text" value="<?php echo $result['prenom']; ?>" /></td></tr>
<tr><td>Modifier le mot de passe : </td><td><input name="password" type="password" value="<?php echo $result['password']; ?>" /></td></tr>

<!-- je vous épargne la totalité des champs qui sont tous sur le même modèle :) -->

<tr><td colspan="2"><input type="submit" name="soumettre" value="Envoyer" /></td></tr>
</table>
</form>

<?php
}
?>

Posté : 12 nov. 2006, 23:37
par Cyrano
Il ne faut pas mélanger les langages : on écrit pas "différent "<>" en PHP mais "!=", donc au lieu de :
if ($_SESSION['id'] <> $id)
il faut faire :
if ($_SESSION['id'] != $id)

Posté : 12 nov. 2006, 23:40
par Ultim4T0m
Bonsoir,

Pourquoi passer l'id par Get alors que tu l'as en Session ? Ne serait-ce pas plus simple de directement afficher le contenu que tu veux en te basant sur
$id = $_SESSION['id']

Posté : 12 nov. 2006, 23:57
par Kaoteknik
Bonsoir,

Pourquoi passer l'id par Get alors que tu l'as en Session ? Ne serait-ce pas plus simple de directement afficher le contenu que tu veux en te basant sur
$id = $_SESSION['id']
Le problème avec cette méthode c'est que je n'arrive pas à récupérer les informations de l'utilisateur dans les champs du formulaire...

J'ai changé mon code par ceci :
$id=$_SESSION['id'];
$ma_requete=mysql_query("SELECT * FROM troupes WHERE id='$id'");
$result=mysql_fetch_array($ma_requete);

Posté : 13 nov. 2006, 00:24
par Kaoteknik
Je viens de changer à nouveau le code :
<?php
$id=$_GET['id'];

if ($_SESSION['id'] != $id) {
	echo 'Vous n\'avez pas les autorisations pour modifier les paramètres de cet utilisateur.';
	include ('formidentification.php');
}
else {
$ma_requete=mysql_query("SELECT * FROM troupes WHERE id='$id'");
$result=mysql_fetch_array($ma_requete);
?>
 <!-- formulaire -->

<?php
}
?>
Toujours sans résultat...

Posté : 17 nov. 2006, 17:42
par Kaoteknik
Bonjour,

Je remonte ce topic car je n'ai toujours pas trouvé la solution...

Merci d'y jeter un oeil si vous le voulez bien ! :)

Posté : 17 nov. 2006, 18:11
par Devether
Bonjour,

Je vais te donner la méthode que j'utiliserais. après ça vaut ce que ça vaut.

1 - La 1ere page contient les champs à renseigner pour se loguer (login / passwd)
2 - Après validation tu vérifies si l'utilisateur est enregistré dans ta base et tu récupères son ID
3 - Tu enregistre l'ID dans la variable $_SESSION['ID']
4 - Si l'utilisateur veut modifier son profil il clique sur un lien générique du style :

Code : Tout sélectionner

<a href="modif_profil.php">Modifier mon profil</a>
5 - dans ta page modif_profil.php, tu testes si $_SESSION['ID'] existe et si oui tu fais une recherche des infos concernant cet Id dans ta base pour les afficher dans la page de profil.
6 - Après modification et validation, tu modifies les infos du profil concernant l'ID.


En gros ce que j'essaie de t'expliquer c'est que tu n'a pas besoin de passer l'ID de la personne dans l'URL. Récupérer l'ID par $_SESSION['ID'] c'est pas plus compliqué que par $_GET['ID'] sauf que dans le 1er cas c'est plus sécurisé.

Posté : 17 nov. 2006, 18:38
par Ultim4T0m
Bonsoir,

Pourquoi passer l'id par Get alors que tu l'as en Session ? Ne serait-ce pas plus simple de directement afficher le contenu que tu veux en te basant sur
$id = $_SESSION['id']
Le problème avec cette méthode c'est que je n'arrive pas à récupérer les informations de l'utilisateur dans les champs du formulaire...


C'est plus détaillé, mais je disais à peu près la chose dans le même but, mais apparement cela semble poser problème :? Tu pourrais expliquer un peu plus le problème rencontré par cette méthode (si toutefois il y en a un, je m'avance peut-être ^^')

Posté : 17 nov. 2006, 20:46
par Kaoteknik
Ok, merci à vous pour ces renseignements...

J'avais testé quelque chose dans ce genre là, récupérer l'id par le biais de la session, mais sans succès... J'ai du mal m'y prendre. Je réessaierai ! :)

Je vous tiens au courant si je réussi à faire quelque chose ! :)

Posté : 18 nov. 2006, 11:31
par Kaoteknik
Je crois comprendre d'où vient le problème :

Une même personne peut avoir plusieurs comptes, et pour chaque compte un identifiant différent est attribué en auto-incrémentation dans la base. Il faudrait que je puisse donner le même identifiant pour tous les comptes d'une même personne ; bien que cela devrait soulever un autre problème : comment définir ensuite sur quel compte la personne veut effectuer des changements ?

Je ne vois pas trop comment m'y prendre... :?

Posté : 18 nov. 2006, 11:39
par Cyrano
Non, dans ce cas, il faut distinguer deux entités :
-1- Le client;
-2- Le compte;
Partant du fait qu'un compte appartient à un et un seul client mais qu'un client peut avoir de 1 à n comptes, il te faut deux tables :
-1- Une table client avec sa clé primaire et les informations propres au client
-2- Une table compte avec sa clé primaire d'une part et une clé étrangère correspondant à la clé primaire du client correspondant.

De cette manière, un client peut avoir autant de compte que tu voudras, il n'y aura pas de conflit.

Posté : 18 nov. 2006, 13:48
par Kaoteknik
D'accord, mais dans ce cas comment faire le lien entre les deux tables ?

C'est un exercice auquel je ne me suis pas encore livré ! :oops:

Posté : 18 nov. 2006, 13:55
par Cyrano