protection url $_GET

protection url $_GET - PHP - Programmation

Marsh Posté le 10-07-2018 à 00:38:05    

Bonjour à tous,
 
J'ai une question au sujet de la protection des données transmises par URL.
Je tente de créer un site web avec une base membres. Dans ce site, il est possible pour les membres de créer un espace qui pourrait être accessible par les autres membres à l'aide d'un code unique (généré automatiquement lors de la création de cet espace et qui servira d'identification d'espace)... Je créé une page php dans laquelle chaque membre peut retrouver les espaces auxquels il a accès. En cliquant sur un des liens il aura alors accès à l'espace dédié (réalisé à l'aide d'un transfert de données via URL-> espace.php?code=<?php echo $donnees['code']) sauf qu'en modifiant l'url il est possible d'avoir accès à des espaces qu'il n'est pas censé pouvoir accéder. J'ai essayé de créer un bout de code (cf. ci-après) mais il est clair que je m'y prend très mal.
 
Je voudrait que : si ce membre modifie l'url qu'il ne puisse pas avoir accès aux autres espaces compte tenu qu'il n'est pas inscrit dans la BDD (table 'membres_espace').
 
Je comprends qu'il est nécessaire de:
 
1) vérifier si le code de l'url est valide -> si $_Get = code (table 'membres') et récupérer l'id de cette espace (si existant)
 
2) vérifier si l'id de la session est associé à l'id de l'espace (table 'membres_espace')
 
Malheureusement je n'arrive pas à mettre ça en forme dans mon code.
 
Dans une BDD, j'ai créé une table nommée espace qui se remplie à chaque création d'espace et contenant 5 colonnes :
 
Id
 
Code
 
Date
 
Nom
 
Créateur
 
Une autre table nommée membres avec les colonnes classiques : Id, pseudo, pass, ...
 
Et une table de liaison membres_espace regroupant id_espace et id_membres.
 
 

Code :
  1. <?php
  2.  
  3. ini_set('display_errors', '1');
  4. ini_set('error_reporting', E_ALL);
  5. session_start();
  6.  
  7. try
  8. {
  9.  
  10. $bdd = new PDO('mysql:host=localhost;dbname=membres;charset=utf8', 'root', 'root');
  11. $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  12.  
  13. }
  14. catch (PDOException $e)
  15. {
  16.    die('Erreur : '.$e->getMessage());
  17. }
  18.  
  19. if (isset($_SESSION['id']) AND $_SESSION['pseudo'])
  20. {
  21.    $getid=intval($_SESSION['id']);
  22.    $requser=$bdd->prepare('SELECT * FROM membres WHERE id = ?');
  23.    $requser->execute(array($getid));
  24.    $userinfo = $requser->fetch();
  25.  
  26. if (isset($_GET['cde']) AND $_GET['cde'])
  27. {
  28. $code=htmlspecialchars($_GET['code']);
  29. $recde=$bdd->prepare('SELECT * FROM membres, espace, membres_espace WHERE code = ? AND espace.id = id_espace AND '.$getid.' = id_membres');
  30. $recde->execute(array($code));
  31. $page = $recde->fetch();
  32.  
  33.  
  34.    }
  35.  else
  36.  {
  37.    header("Location: espace.php?id=".$_SESSION['id']);
  38.  }
  39.  }
  40.  
  41.    ?>


 
En vous remerciant

Reply

Marsh Posté le 10-07-2018 à 00:38:05   

Reply

Marsh Posté le 10-07-2018 à 11:04:08    

Bonjour,
 
Je dirai :
 
- une table pour les espaces : id_espace, lien_espace, cle_espace, nom_espace, date_espace, createur_espace
- une table pour les accès aux espaces : id_espace, id_membre
 
Sur la page où le membre retrouve les espaces auxquels il a accès tu fais une requête sur la table des accès aux espaces avec l'id du membre et tu récupères les id_espace liés à l'id_membre.
Une fois les id_espace récupérés tu récupères les lien_espace correspondant dans la table des espaces.
Le créateur de l'espace peut diffuser un lien contenant la clé, lorsque l'utilisateur clique sur le lien il a la possibilité de s'inscrire ou non à l'espace. Si le membre valide l'inscription tu recherches dans la table des espaces à quel id_espace correspond la clé puis tu ajoutes dans la table des accès aux espaces l'id_membre et l'id_espace correspondant à la clé.
Sur chaque page d'espace, tu vérifies ensuite dans la table d'accès aux espaces si l'id_membre existe pour l'id_espace.
 
Après, dans ce cas, n'importe quel membre qui récupères la clé peut s'inscrire. Tu peux ajouter un niveau de sécurité en invitant des membres directement plutôt que de faire une diffusion de clé.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 10-07-2018 à 22:04:10    

Bonjour MaybeEijOrNot  
C'est exactement ce dont je souhaite faire...
Je tâtonne depuis plusieurs jours, mais rien ne marche.

Reply

Marsh Posté le 14-07-2018 à 00:07:44    

attention, la fonction htmlspecialchars s'utilise en réalité lors de l'affichage des données en HTML.
 
Pour nettoyer des données avant utilisation avec une DB, il faut plutot utiliser des focntions de nettoyage (http://php.net/manual/fr/filter.filters.sanitize.php)
 
Une petite lecture indispensable:
https://www.phptherightway.com/#data_filtering
 


---------------
collectionneur de pâtes thermiques
Reply

Sujets relatifs:

Leave a Replay

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