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 :

Sécurité des liens avec variables en paramètres


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut Sécurité des liens avec variables en paramètres
    Bonjour,

    J'utilise des requêtes $_GET pour récupérer les paramètres de les liens.

    Par exemple:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="accueil.php?page=Flash">

    Et je sécurisais mes liens en utilisant un fichier includes.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $checkPage = array('Livre' => 'livre.php', 'Series' => 'series/series.php'
    ...
    Hors, pour afficher les fiches séries, je ne crée plus une page par fiche série, je passe maintenant par une base de données.
    J'utilise maintenant des variables en lieu et place des noms de pages.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="accueil.php?page=Series_Record&series='.$row['seriesId'].'&title='.$row['seriesTitle'].'">'.$row['seriesTitle'].'</a>

    Comment puis-je, dans ce cas, sécuriser tout ça ?

  2. #2
    Nb
    Nb est déconnecté
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 163
    Par défaut
    Ben quand tu reçoit le seriesId j imagine que tu vas chercher le detail en bd donc tu fais une requete préparée avec l id récupéré et un minimum nettoyé.

    Ps. Je ne sais pas ce que tu cherches à faire mais tu sembles passer en parametre l id et le titre d une serie pour en recuperer le detail en base, si c est le cas le titre ne sert a rien puisque tu as un id.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Ps. Je ne sais pas ce que tu cherches à faire mais tu sembles passer en parametre l id et le titre d'une série pour en récupérer le detail en base, si c est le cas le titre ne sert a rien puisque tu as un id.
    Effectivement, je me rends compte que c'est inutile.

    J'utilise déjà des requêtes préparées. Mais j'aimerais éviter qu'on ne puisse rentrer un paramètre dans l'url, car cela planté la page. Je préférerais un message d'erreur ou que
    ça provoque une redirection vers une autre page.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2014
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2014
    Messages : 461
    Par défaut
    Une requête préparée fait deux appels à la BDD. A mon avis, elle mobilise inutilement des ressources lorsque le paramètre passé est censé être un entier (à moins bien sûr qu'elle ne soit réutilisée dans le script), ce qui, si j'ai bien compris est le cas ici. Il suffit de vérifier que c'en est bien un par la fonction ctype_digit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(ctype_digit($_GET['mavariable')) {
        // OK, traitement
    }
    else {
       // redirection ou ce qu'on veut
    }
    Je veux bien être contredit si je dis une bêtise.

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 325
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 325
    Billets dans le blog
    17
    Par défaut
    Je suis d'accord avec domi65 sur les requêtes préparées.

    Mais j'aimerais éviter qu'on ne puisse rentrer un paramètre dans l'url, car cela planté la page
    Il faut accepter que l'utilisateur puisse modifier l'URL.
    À toi d'avoir un code suffisamment robuste pour prendre en compte la situation.

    Si l'utilisateur supprime un paramètre => Tu dois prendre en compte son absence et afficher "Pas de résultat" ou "Requête incorrecte"
    Si l'utilisateur remplace l'ID série par une valeur farfelue => Tu dois afficher "Pas de résultat" ou "Requête incorrecte"
    etc.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Par défaut
    Bonjour et merci pour vos réponses.

    Je n'ai pas eu beaucoup le temps de me consacrer à tout ça ces temps-ci.

    Après maints essais, je ne parviens pas à afficher un message d'erreur en cas de paramètre erroné ou d'absence de paramètre.

    Voila ce qui me semblait pourtant le plus adapté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = <<<SQL
    	SELECT * FROM SERIES
    	WHERE seriesId = :seriesId
    	SQL;
    $idQuery = $pdo->prepare($sql);
    $idQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    $idQuery->execute();
    $row = $idQuery->fetch();
    if(!isset($row)) {
       	include('error.php');
    }
    J'ai essayé également avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $sql = <<<SQL
    	SELECT * FROM SERIES
    	WHERE seriesId = :seriesId
    	SQL;
    $idQuery = $pdo->prepare($sql);
    $idQuery->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
    $idQuery->execute();
    $row = $idQuery->fetch();
    if($row = 0) {
       	include('error.php');
    }
    Je reviens également sur ma réponse précédente:
    Ps. Je ne sais pas ce que tu cherches à faire mais tu sembles passer en paramètre l id et le titre d'une série pour en récupérer le détail en base, si c est le cas le titre ne sert a rien puisque tu as un id.
    Effectivement, je me rends compte que c'est inutile.
    J'ai tout de même besoin du paramètre 'title' pour afficher le titre de la série comme titre de page.
    Mais c'est peut-être l'un des nœuds du problème ?

Discussions similaires

  1. faire des liens avec le resultat de ma requete mysql
    Par rane dans le forum Requêtes
    Réponses: 12
    Dernier message: 10/03/2006, 17h29
  2. vue avec variable en paramètre
    Par yayooyayoo2005 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 27/02/2006, 14h25
  3. [VB6] Déclaration d'un tableau avec variable en paramètre.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/10/2005, 12h21
  4. Réponses: 9
    Dernier message: 24/05/2005, 16h34
  5. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50

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