Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment sécurisé une page?

Sujet résolu
    16 janvier 2018 à 9:19:33

    Bonjour à tous,

    Je suis entrain de créer une page où le client pourra voir sa commande récapitulatif.

    En faite il ouvre la page où il y a toutes ces commandes et clique sur la commande qu'il désire. 

    L'adresse ressemblera à ça : http://monsite/.../commande_vue.php?c=59

    59 étant la ligne de la commande dans ma base de données.

    ma question est comment sécurisé les pages car par exemple si une personne change le numéro, il ne doit pas tombé sur des commandes qui ne sot pas à lui et le numéro doit être valide.

    Mon code 

    $commande_id = (int) $_GET['c'];
                <!--/////////////////////////////  CORPS  //////////////////////////////// -->
     
                    <div id="haut_menu_grand"><h3>Modalité de la commande</h3></div>
                 
                    <div id="milieu_menu_grand">
                        <?php
                        $req = $bdd->prepare('SELECT * FROM commandes WHERE membre_id = :membre_id AND commande_id = :commande_id');
                        $req->execute(array(
                                'membre_id' => $_SESSION['membre_id'],
                                'commande_id' => $commande_id)) or die(print_r($req->errorInfo()));
                        $donnees = $req->fetch();
                        ?>
                         
                        <p class="corps_milieu_grand">
                        </p>
                         
                        <h4>Date et numéro de commande</h4>
                        <p class="corps_milieu_grand">
                        Date de commande : <?php echo date('d/m/Y', $donnees['date_commande']); ?><br /><br />
                        Numéro de commande : <?php echo $donnees['date_commande']; ?><br /><br /><br />
                        </p>
                         
                         
                        <h4>Mode de paiement et adresse postale</h4>
                        <p class="corps_milieu_grand">
                        Mode de paiement : <?php echo $donnees['mode_paiement']; ?><br /><br />
                         
                        <?php
                        if($donnees['adresse_livraison'] == 'principale')
                        {
                            $req1 = $bdd->prepare('SELECT * FROM membres WHERE membre_id = :membre_id');
                            $req1->execute(array(
                                    'membre_id' => $_SESSION['membre_id'])) or die(print_r($req->errorInfo()));
                            $donnees1 = $req1->fetch();
                        ?>
                            Adresse postale :<br /> <?php echo $donnees1['rue']; ?><br /><?php echo $donnees1['code_postal']; ?><br /><?php echo $donnees1['commune']; ?><br />
                        <?php
                        }
                        if($donnees['adresse_livraison'] == 'secondaire')
                        {
                            $req1 = $bdd->prepare('SELECT * FROM membres WHERE membre_id = :membre_id');
                            $req1->execute(array(
                                    'membre_id' => $_SESSION['membre_id'])) or die(print_r($req->errorInfo()));
                            $donnees1 = $req1->fetch();
                        ?>
                            Adresse postale :<br /> <?php echo $donnees1['rue2']; ?><br /><?php echo $donnees1['code_postal2']; ?><br /><?php echo $donnees1['commune2']; ?><br />
                        <?php
                        }
                        ?>
                        </p>
                     
                    </div>
                 
                    <div id="bas_menu_grand"></div>
                 
                 
                 
                 
                 
                 
             
                    <div id="haut_menu_grand"><h3>Récapitulatif de votre commande</h3></div>
                 
                    <div id="milieu_menu_grand">
                        <?php
     
                         
                         
                        $rst = $bdd -> query("SELECT pr.prix AS prix, pr.designation AS designation,
                        c.couleur AS couleur_produit, pa.taille AS taille, pa.prenom_oui_non AS prenom_oui_non,  pa.texte AS texte, pa.telephone AS telephone,
                        pa.texte_couleur AS texte_couleur, pa.texte_police AS texte_police, pa.numero_broderie AS numero_broderie, pa.panier_id AS panier_id
                                                FROM panier AS pa
                                                INNER JOIN produits AS pr
                                                ON pa.produit_id = pr.produit_id
                                                INNER JOIN couleurs AS c
                                                ON pa.couleur_produit = c.couleur_id OR pa.couleur_biais = c.couleur_id
                                                WHERE pa.commande_id= ".$commande_id . " AND pa.membre_id = ".$_SESSION['membre_id'])or die(print_r($bdd->errorInfo()));
                        $cmpt=0; 
                        ?>               
                        <table class="panier">
                         
                            <tr>
                                <th class="panier">Image</th>
                                <th class="panier"></th>
                                <th class="panier">Désignation</th>
                                <th class="panier">Prix</th>
                            </tr>
                        <?php
                        While($donnees = $rst->fetch())
                        {
                            $designation = $donnees['designation'];
                            $prix = $donnees['prix'];
                            $couleur_produit = $donnees['couleur_produit'];
                            $taille_produit = $donnees['taille']; 
                            $prenom_oui_non = $donnees['prenom_oui_non'];
                            $texte = $donnees['texte'];
                            $telephone = $donnees['telephone'];
                            $texte_couleur = $donnees['texte_couleur'];
                            $texte_police = $donnees['texte_police'];
                            $numero_broderie = $donnees['numero_broderie'];
                        ?>
                            <tr>
                                <td class="panier" rowspan="2"><img src="../img/produits/petite_image/couverture.jpg" alt="image" style="width:80px;height:80px;"></td>
                                <td class="panier_vide" rowspan="2"></td>
                                <td class="panier_designation"><span><?php echo $designation; ?></td>
                                <td class="panier_prix" rowspan="2"><?php echo $prix; ?> €TTC</td>
                            </tr>
                            <tr>
                                <td class="panier_constitution">
                                    <?php
                                    if(!$couleur_produit || $couleur_produit === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Couleur produit : ' . $couleur_produit . '<br />';
                                    }
                                     
                                    if(!$taille_produit || $taille_produit === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Taille : ' . $taille_produit . '<br />';
                                    }
                                     
                                    if(!$prenom_oui_non || $prenom_oui_non === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Prénom? : ' . $prenom_oui_non . '<br />';
                                    }
                                     
                                    if(!$texte || $texte === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Prénom ou texte : ' . $texte . '<br />';
                                    }
                                     
                                    if(!$telephone || $telephone === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Téléphone ou mail : ' . $telephone . '<br />';
                                    }
                                     
                                    if(!$texte_couleur || $texte_couleur === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Couleur du prénom ou texte : ' . $texte_couleur . '<br />';
                                    }
                                     
                                    if(!$texte_police || $texte_police === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Police du prénom ou texte : ' . $texte_police . '<br />';
                                    }
                                     
                                    if(!$numero_broderie || $numero_broderie === '0')
                                    {
                                        echo '';
                                    }
                                    else
                                    {
                                        echo 'Numéro broderie : ' . $numero_broderie . '<br />';
                                    }
                                    ?>
                                </td>
                            </tr>
                        <?php
                         $Total=$prix * 1;
                         $cmpt+=$Total;
                           
                        }
                        ?>
                        </table>
                        <p class="total">
                        <?php echo 'Sous-total : '.$cmpt.' €<br />';
                     
                        if($cmpt < '25')
                        {
                            $liraison = '5,50';
                            $totalg = $cmpt + $liraison;
                            echo 'Livraison = ' . $liraison . '€ <br /> Total = ' . $totalg . '€'; 
                            $_SESSION['montant_total'] = $totalg;
                        }
                        else
                        {
                            $liraison = '0';
                            $totalg = $cmpt + $liraison;
                            echo 'Livraison = ' . $liraison . '€ <br /> Total = ' . $totalg . '€';
                            $_SESSION['montant_total'] = $totalg;
                        }
                        ?>
                        </p>
                     
         
                    </div>
                 
                    <div id="bas_menu_grand"></div>
                     
                     
                     
                <!--/////////////////////////////  FIN CORPS  //////////////////////////////// -->



    Merci d'avance

    -
    Edité par psgman80 16 janvier 2018 à 9:20:10

    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2018 à 9:34:34

      Bonjour à toi,

      Ce système est présent sur pas mal de systèmes de livraision, La Poste, DPD, etc.

      Le problème est que ton lien "commande_vue.php?c=59" est beaucoup trop évident il suffit d'incrémenter le chiffre pour changer de commande. Il faut donc générer un lien "http://php.net/manual/fr/function.uniqid.php".

      A ton niveau je pense que tu n'as pas encore touché aux réécritures, la solution la plus simple serait d'ajouter un champ à ta commande : "uniqid" puis lors de la création de cette dernière tu insert dans ce champ une valeur unique à ta commande.

       Ensuite, tu n'as plus qu'à faire en sorte qu'au lieu que l'url soit en fonction de l'ID de la commande qu'elle soit en fonction de l'uniqid.

      https://mon-site.fr/commande_vue.php?c=43761894528764581254896

      Cette méthode à ses avantages car elle permet de pouvoir accéder au site de n'importe qu'elle appareil. Cependant toute personne connaissant le lien peut accéder à la page.

      -
      Edité par Martin PAUCOT 16 janvier 2018 à 9:36:09

      • Partager sur Facebook
      • Partager sur Twitter
      Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter | Développeur Web et Mobile chez Beemoov
        16 janvier 2018 à 9:35:16

        Salut,

        Quand tu créée une nouvelle commande en bdd, ajoute une ligne, avec l'utilisateur qui a accès à cette commande.

        Lors de l'accès à la page, tu va vérifier si la session avec l'id d'utilisateur correspond bien à l'id en bdd.

        A+

        • Partager sur Facebook
        • Partager sur Twitter
          16 janvier 2018 à 9:35:43

          À première vue tu utilises les sessions, donc quand un utilisateur se connecte sur la page tu vérifies que la session existe et qu'elle concorde avec celle dans ta BDD, sinon tu rediriges l'utilisateur sur une page de connexion. Tu peux aussi hasher l'id de la commande, c'est un peu plus clean qu'un simple entier.

          edit: bon tu as plein de choix ^^

          -
          Edité par xoxotf 16 janvier 2018 à 9:37:01

          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2018 à 10:16:38

            Merci pour vos réponses.

            Dans un premier temps je vais vérifier si la personne est connecté.

            Ensuite cette adresse me paraissez trop simple http://monsite/.../commande_vue.php?c=59 mais si met comme dit Martin un uniqID cela fait peut être plus serieux ^^

            Après j'utilise le timestamp lors de la création de la commande pour le numéro de commande pourquoi pas utiliser ce numéro?

            Cela fera http://monsite/.../commande_vue.php?c=1516094144

            Apres tant que personne accède au commande des autres cela me va. Et cela se fait avec la vérification de la session


            Vous en pensez quoi?

            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2018 à 11:27:51

              UID, hash du timespamp ou de l'id de le la commande c'est plus propre dans tout les cas :)

              -
              Edité par xoxotf 16 janvier 2018 à 11:28:25

              • Partager sur Facebook
              • Partager sur Twitter
                16 janvier 2018 à 12:42:41

                > ma question est comment sécurisé les pages car par exemple si une personne change le numéro, il ne doit pas tombé sur des commandes qui ne sot pas à lui et le numéro doit être valide.

                Dans tes requêtes de sélection, il suffit d'ajouter un WHERE membre_id = :membre_id (apparemment tu le fais déjà) pour t'assurer qu'il s'agit des commandes de l'utilisateur connecté, il faut donc tester le retours de fetch si échec tu affiches un message du genre (commande inexistante ou n'est pas associée à votre compte).

                PS: Je n'aime pas personnellement les or die surtout avec PDO, ça rend le code (plus) "laid",  il suffit simplement d'activer les erreurs avec PDO::ATTR_ERRMODE et PHP va se charger du reste.

                Côté sécurité aussi tes "echo" puisque tu es vulnérable aux injections XSS

                -
                Edité par WillyKouassi 16 janvier 2018 à 12:44:28

                • Partager sur Facebook
                • Partager sur Twitter
                le bienfait n'est jamais perdu

                Comment sécurisé une page?

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown