Un formulaire en plusieurs pages

Un formulaire en plusieurs pages - PHP - Programmation

Marsh Posté le 12-09-2008 à 13:59:06    

Bonjour à tous,
 
Je souhaite faire un formulaire en plusieurs pages correspondantes à différentes étapes. Grosso modo, à chaque étape on fait un enregistrement dans une base et ces enregistrements sont reliés entres eux par des clés primaires/étrangères.
On m'a dit qu'il y avait des techniques classiques pour aborder ce genre de problème mais je n'ai rien trouvé de convainquant sur le net.
 
Ce qui me pose soucis c'est surtout la sécurité. Imaginez que dans la premiere partie on remplisse un auteur et dans l'autre un article. Il faudra transmettre l'id de l'auteur. Or même s'il est en hidden il est facile de le changer avant le POST du deuxième formulaire (formulaire de l'article) et ainsi faire croire qu'un article donné est associé à un autre auteur. L'auteur n'est pas l'utilisateur du formulaire, j'ai pris l'exemple classique auteur/article donc il ne s'agit pas d'un problème d'authentification de l'utilisateur.

Reply

Marsh Posté le 12-09-2008 à 13:59:06   

Reply

Marsh Posté le 12-09-2008 à 14:03:00    

l'id de l'auteur devrait etre stocké en session

Reply

Marsh Posté le 12-09-2008 à 14:51:41    

A noter que par sécurité, il est préférable de lié, dans la session, l'id de l'auteur à un code qui sera mis dans un champ hidden du formulaire.
Ca évitera tout problème si un utilisateur à la mauvaise idée de commencer une nouvelle saisie avant d'avoir finis la première et qu'il se décide ensuite à compléter sa première saisie.

Reply

Marsh Posté le 12-09-2008 à 14:59:23    

si l'user n'a pas de cookies, je recommande d'enregistrer tous les champs précedent dans un hidden :)


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 12-09-2008 à 15:01:37    

non
les donénes critiques ( qui est l'auteur par exemple ) ne doivent pas etre modifiables par l'auteur

Reply

Marsh Posté le 12-09-2008 à 15:04:39    

Dans la session de l'utilisateur je stocke son id (clé primaire de la table des utilisateurs).
 
Je me suis peut être mal exprimé, je reprends:
 
Imaginez qu'un utilisateur crée une nouvelle fiche auteur dans la première étape. Ensuite dans la deuxième étape, il doit crée un article censé être en relation avec cet auteur, donc on pourrait penser qu'il suffit de mettre l'id de l'auteur qui vient d'être crée en hidden dans ce nouveau formulaire. Mais il est alors facile pour l'utilisateur de changer cet id en sorte de lier l'article qui va écrire à un auteur qu'il n'a pas crée !
 
est-ce plus clair ?
 
EDIT: ce que j'appelle auteur n'est pas l'utilisateur ! Un utilisateur peut créer des fiches "auteur" et attacher des "article" à ces auteurs. Mais je veux que les articles attachés le soient sur l'auteur qui a été crée dans l'étape précédente et aucun autre.


Message édité par cimourdain le 12-09-2008 à 15:09:13
Reply

Marsh Posté le 12-09-2008 à 15:19:00    

cimourdain > Regarde la solution que je te propose, ça devrait répondre à ce que tu demandes. Si je n'ai pas été assez clair, j'essaierais de te pondre un petit exemple.

Reply

Marsh Posté le 12-09-2008 à 15:27:16    

je vois pas en quoi ca réponds à mon problème en fait ! désolé

Reply

Marsh Posté le 12-09-2008 à 15:42:18    

Bon ok, voilà un exemple tout con :

Code :
  1. $code=rand(0,10000);
  2. $_SESSION['AuteurId'][$code]=$IdDeLAuteur;
  3. echo '<input type="hidden" name="AuteurId" value="' . $code '">';


Quand tu reçois :

Code :
  1. if isset($_SESSION['AuteurId'][$_POST['AuteurId']]) {
  2.  $IdDeLAuteur=$_SESSION['AuteurId'][$_POST['AuteurId']];
  3. }else{
  4.  die('Auteur introuvable');
  5. }


 
Avec cette méthode, tu es sur que l'utilisateur ne pourra pas taper dans un auteur qu'il n'a pas créé au cours de la session courante.
 
EDIT : Si tu ne veux que le tout dernier auteur créé dans la session, tu peux aussi affecter l'identifiant directement dans $_SESSION['AuteurId'], ne rien passer dans le formulaire (vu que t'as la donné dans la session) et éviter simplement le "isset", le "rand" et tout ce qui va avec. Ca revient à ce que les autres t'ont indiqué plus haut.


Message édité par omega2 le 12-09-2008 à 15:53:00
Reply

Marsh Posté le 12-09-2008 à 15:57:31    

C'est une solution sauf que je remplacerai  

Code :
  1. $code=rand(0,10000);


par

Code :
  1. $code= uniqid();


Ou par n'importe quel uuid (perso j'aime bien le uuid() mysql).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed