Sécurité : interdire le changement d'id

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Sécurité : interdire le changement d'id

par Kaoteknik » 27 nov. 2006, 12:50

Bonjour,

je reviens sur les lieux du "crime" juste pour cliquer sur le bouton "résolu", puisque je suis enfin parvenu à gérer plusieurs tables dans une base de données (non sans quelques difficultés et de très nombreux essais, et au prix de nouveaux cheveux blancs).

Le tutorial m'aura en tout cas été d'un secours inespéré. Je tiens donc encore à vous remercier pour vos conseils toujours précieux et professionnels. :)

par Kaoteknik » 18 nov. 2006, 18:35

Merci, je pense que ça va bien m'aider ! :)

par Cyrano » 18 nov. 2006, 13:55

par Kaoteknik » 18 nov. 2006, 13:48

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:

par Cyrano » 18 nov. 2006, 11:39

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.

par Kaoteknik » 18 nov. 2006, 11:31

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... :?

par Kaoteknik » 17 nov. 2006, 20:46

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 ! :)

par Ultim4T0m » 17 nov. 2006, 18:38

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 ^^')

par Devether » 17 nov. 2006, 18:11

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é.

par Kaoteknik » 17 nov. 2006, 17:42

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 ! :)

par Kaoteknik » 13 nov. 2006, 00:24

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...

par Kaoteknik » 12 nov. 2006, 23:57

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);

par Ultim4T0m » 12 nov. 2006, 23:40

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']

par Cyrano » 12 nov. 2006, 23:37

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)

par Kaoteknik » 12 nov. 2006, 21:38

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
}
?>