IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Ma page est-t'elle sécurisée ?


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut Ma page est-t'elle sécurisée ?
    Bonjour,

    Je viens vers vous pour savoir si ma page est bien sécurisée ou pas, car j'ai quelques doutes.. par exemple a la ligne 7 et 8 je sécurise la variable GET (id_block) qu'une fois le isset passé.. est-ce un danger ?
    J'ai bien essayé de mettre la ligne 7 $id_block = (int) $_GET['id_block']; tout en haut de la page mais la j'ai une erreur
    Notice: Undefined index: id_block ......
    logique car la variable est déclarée qu'une fois que l'utilisateur clique sur le lien de déblocage en bas.. mais dés qu'il arrive sur la page, pas de variable GET.. donc du coup j'ai inséré la ligne pour sécuriser la variable GET juste après le isset comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php
    logged_only();
     
    $user_id = $_SESSION['auth']->id; // Récupère l'id du membre connecté.
     
    // Débloquer un membre
    if (isset($_GET["id_block"])){
      $id_block = (int) $_GET['id_block']; // Sécurise la variable id_block passée par l'url.
      $pdo->exec("DELETE FROM blocage_users WHERE id=$id_block AND idmbr=$user_id");
      $_SESSION['flash']['success'] = 'Le membre vient d\'être <b>débloqué</b>. Il peut à nouveau vous envoyer des messages.';
    }
     
    ?>
     
    <h3>Membres bloqués</h3>
     
    <?php
    $reponse = $pdo->query('SELECT
    b.id as id_block,
    b.date_blocage as date_block,
    u.prenom as prenom_block,
    u.date_naissance as date_naissance_block,
    u.city as city_block
    FROM users u
    INNER JOIN blocage_users b
    ON b.idmbr_blocage = u.id
    WHERE b.idmbr = '.$user_id);
     
    while ($donnees = $reponse->fetch())
    {
    ?>
     
    - <?php echo $donnees->prenom_block; ?>, <?php echo age($donnees->date_naissance_block); ?>ans de <?php echo $donnees->city_block; ?> - <?php echo $donnees->date_block; ?> (<a href="index.php?p=complete&id_block=<?php echo $donnees->id_block; ?>">Débloquer</a>)<br>
     
    <?php } ?>
    MERCI pour votre aide

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non il n'y a pas de problème de logique dans la position de ton isset().

    Dans ce que tu nous montres, il n'y a pas de trou de sécurité :
    - la page est visiblement limitée aux utilisateurs connectés
    - la requête est limitée aux blocages de l'utilisateur connecté
    - les paramètres dans la requêtes sont surs
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Merci pour ta réponse rapide.
    Donc inutile de faire une requête préparée pour le delete ?

    Sinon dernière petite question en bonus^^ : comment faire (le plus simplement possible) pour que le titre h3 s'affiche uniquement si la requête sort un résultat ? Car la même en cas de zéro blocage il y a le titre.. Pas très pro^^

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Points : 154
    Points
    154
    Par défaut
    Je ne sais pas quel est le type de ta variable id_block, mais si tu recherches un maximum de sécurité pourquoi ne pas faire une preg_match sur ta variable id_block, il me semble qu'il ne peut s'agir que d'un nombre entier donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (isset($_GET["id_block"]) AND preg_match('#[0-9]+#',$_GET["id_block"])){
         //pourquoi mettre ta variable GET dans une autre variable
         $pdo->exec("DELETE FROM blocage_users WHERE id=$_GET["id_block"] AND idmbr=$user_id");
    }
    La solution proposé avant fonctionne déjà bien, mais je sais que j'utilise beaucoup cet méthode car tu peux restreindre fortement toutes les saisies de l'utilisateurs

    Qu'entends par pas de résultat ? sur ta requête delete ou sur ta condition ?
    Car si tu veux savoir si il y a bien eu une ou des lignes de supprimer tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $pdo->exec("DELETE FROM blocage_users WHERE id=$_GET["id_block"] AND idmbr=$user_id");
    $count = $pdo->rowcount();
    if($count>=1){
        //affichage de ton titre h3
    }

  5. #5
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par zigomato Voir le message
    Je ne sais pas quel est le type de ta variable id_block, mais si tu recherches un maximum de sécurité pourquoi ne pas faire une preg_match sur ta variable id_block, il me semble qu'il ne peut s'agir que d'un nombre entier.
    La solution proposé avant fonctionne déjà bien, mais je sais que j'utilise beaucoup cet méthode car tu peux restreindre fortement toutes les saisies de l'utilisateurs
    Je ne vois pas trop l'utilité d'utiliser un preg_match alors que mon code est sécurisé grâce a la ligne 8 (int).. mais merci pour ta solution.

    Citation Envoyé par zigomato Voir le message
    Qu'entends par pas de résultat ? sur ta requête delete ou sur ta condition ?
    non, pas dans le delete, dans le select en bas.. SI 1 résultat ou plus.. alors j'affiche le sous-titre h3.. sinon aucune utilité. Je viens de voir la doc php, le rowCount() fonctionne uniquement pour les DELETE, INSERT, ou UPDATE, PAS pour le Select. Sinon il faut utiliser un fetchColumn() ... doc http://php.net/manual/fr/pdostatement.rowcount.php

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par zigomato Voir le message
    mais si tu recherches un maximum de sécurité pourquoi ne pas faire une preg_match sur ta variable id_block,
    Justement si il n'attends qu'un entier utiliser un preg_match , c'est inutile et surdimensionné.

    Un cast en int ou un intval() sont plus efficace et plus lisible.

    Le preg_match n'a d'intérêt que sur des masques de saisie complexes.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Autre possibilité : utiliser la fonction filter_​input, qui valide et nettoie (et gère le isset)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    logged_only();
     
    $user_id = $_SESSION['auth']->id; // Récupère l'id du membre connecté.
     
    // Débloquer un membre
    $id_block = filtre_input(INPUT_GET, 'id_block', FILTER_VALIDATE_INT); // valide et Sécurise la variable id_block passée par l'url.
    if ($id_block !== false && $id_block !== null){
      $pdo->exec("DELETE FROM blocage_users WHERE id=$id_block AND idmbr=$user_id");
      $_SESSION['flash']['success'] = 'Le membre vient d\'être <b>débloqué</b>. Il peut à nouveau vous envoyer des messages.';
    }
    A lire sur le sujet : http://jcrozier.developpez.com/tutor...tres-securite/
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    merci pour le lien celira.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Comme le dit grunk, le preg_match est gourmand en ressources, beaucoup plus que les fonctions natives. Il suffit de faire quelques bench pour s'en rendre compte. Il ne faut donc l'utiliser qu'en dernier recours, quand on ne peut pas faire autrement.

    Faut que tout le monde s'y mette si on ne veut pas dépasser les 2 degrés de réchauffement climatique

  10. #10
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cette page est-elle déjà ouverte dans mon navigateur ?
    Par _rainbow dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/07/2012, 12h56
  2. [XML] ma structure est t-elle bonne ?
    Par guy2004 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 16/03/2006, 11h24
  3. comment savoir par quelle page est passé un visiteur
    Par emilie_per dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2006, 11h11
  4. Réponses: 1
    Dernier message: 22/12/2005, 17h28
  5. Tester si une page est ouverte
    Par Osmani dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/11/2005, 13h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo