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é] Peut-on verrouiller les variables GET ?


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut [Sécurité] Peut-on verrouiller les variables GET ?
    Bonjour,

    Petite question de sécurité :

    Peut on protéger les variables dans l'url ?

    Je m'explique :

    J'ai une adresse du genre :

    Je souhaiterais que l'on ne puisse pas modifier l'id en

    Est ce possible de rendre impossible cette manipulation ?

    Merci par avance
    Le savoir est utile que s'il est partagé par tous.
    /(bb|[^b]{2})/
    !sleep() ? array((string))

  2. #2
    Membre régulier
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 82
    Points
    82
    Par défaut
    c'est pour ce genre de chose que POST est utile, c'est ce qui le différencie de GET


    sauf si tu veux interdite des valeurs fixes genre prendre que entre 1 et 123 là en get c'est fesable

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Dans les 2 cas c'est impossible. Il faut toujours vérifier les variables envoyées par un navigateur.

  4. #4
    Membre régulier
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par guidav Voir le message
    Dans les 2 cas c'est impossible. Il faut toujours vérifier les variables envoyées par un navigateur.
    je comprend pas
    En passant par post les valeurs ne sont pas changeables (facilement)

  5. #5
    Membre habitué
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 199
    Points
    199
    Par défaut
    Tu a précisé "facilement", donc c'est tout à fait changeable. Pour un agrs qui a l'habitude et qui te veux du mal, c'est super facile, au contraire...
    GET, POST, COOKIES, SERVER, il faut TOUT vérifier.
    SERVER aussi ? Eh bien oui ! Adresse IP, navigateur, Referer, etc. sont autant de valeurs "facilement" modifiables...

  6. #6
    Membre régulier Avatar de arthak
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 99
    Points
    99
    Par défaut
    Est ce possible de rendre impossible cette manipulation ?
    la manière de rendre impossible cette manipulation est de verfier par un script de l'integrité de ta variable, ce qu'il faut toujours faire.
    "On ne voit bien qu'avec le cœur, l'essentiel est invisible pour les yeux"
    Antoine de St Exupéry.

  7. #7
    Membre régulier
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 82
    Points
    82
    Par défaut
    la solution consiste-t-elle en un truck de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $var = $_POST['var'];
     
    if( isset($var) && is_numeric($var) && ...... toutes verifications ....)
    {
    code
    }

  8. #8
    Membre régulier Avatar de arthak
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 99
    Points
    99
    Par défaut
    Perso j'enrobe toutes mes variables dans ce type de fonctions pour automatiser le processus de traitement des variables extérieures. Tu peux sans doute l'agrémenter si tes variables sont sensiblement similaires.
    "On ne voit bien qu'avec le cœur, l'essentiel est invisible pour les yeux"
    Antoine de St Exupéry.

  9. #9
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    mouais mais dans le cas d'un id numeric par exemple

    voir le dossier de la personne à l'id = 3, je peux aussi regarder le dossier de la personne à l'id = 4. Comment donner l'accés à l'id = 3 et pas au reste des id...

    Je dois peut être passer par des variables de session...

    Merci de votre participation en tout cas
    Le savoir est utile que s'il est partagé par tous.
    /(bb|[^b]{2})/
    !sleep() ? array((string))

  10. #10
    Membre régulier Avatar de arthak
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 99
    Points
    99
    Par défaut
    c'est le plus simple si tu as un seul identifiant possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $ta_variable = je_recupere_le_post_de_ma_variable();
     
    if($ta_variable == 3)
    {
       // code
    }
    else
    {
       // autre code
    }
    "On ne voit bien qu'avec le cœur, l'essentiel est invisible pour les yeux"
    Antoine de St Exupéry.

  11. #11
    Membre régulier
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 82
    Points
    82
    Par défaut
    1 seul identifiant <=> static ^^ donc html pas php :p

  12. #12
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par syl2095 Voir le message
    mouais mais dans le cas d'un id numeric par exemple

    voir le dossier de la personne à l'id = 3, je peux aussi regarder le dossier de la personne à l'id = 4. Comment donner l'accés à l'id = 3 et pas au reste des id...

    Je dois peut être passer par des variables de session...

    Merci de votre participation en tout cas
    Pour ça il te faut définir un système de contrôle d'accès. Untel a l'id n°3, il ne peut voir que tel et tel profil, etc.

  13. #13
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par arthak Voir le message
    Perso j'enrobe toutes mes variables dans ce type de fonctions pour automatiser le processus de traitement des variables extérieures. Tu peux sans doute l'agrémenter si tes variables sont sensiblement similaires.
    Hum, ce code est faux.

    si tu l'appelle avec une variable venant de $_GET a mettre en session, c'est la variable $_POST qui va etre utilisée dans la session au lieu de $_GET (et comme $_POST est vide, tu va mettre NULL dans la session)

    De plus, tu peux le rendre bien plus concis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $var=NULL;
    $var=isset($_SESSION[$poster])?$_SESSION[$poster]:$var;
    $var=isset($_GET[$poster])?$_GET[$poster]:$var;
    $var=isset($_POST[$poster])?$_POST[$poster]:$var;
    if (($sess) && (isset($var)) {
      $SESSION[$poster] = $var;
    }
    return ((is_null($var)?"":$var);
    Enfin, c'est quand meme une mauvaise solution parce qu'elle ne permet pas un filtrage précis de la source de la donnée.
    Si tu t'attends a ce que ta donnée vienne de $_POST, pouvoir la récuperer en $_GET n'est il pas une erreur ? (ou une tentative d'intrusion ?)

    Un exemple bien pire... $_GET est prioritaire sur... $_SESSION ! Donc tu permet a n'importe qui d'écraser toutes tes variables de session en passant la meme variable par $_GET !

    Une solution, meme si elle est plus contraignante, consiste a ajouter un parametre a ta fonction. Soit $_GET/$_POST/$_SESSION, soit "G"/"P"/"S", soit une constante, bref, quelque chose qui permet de faire le distinguo.

  14. #14
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    voir le dossier de la personne à l'id = 3, je peux aussi regarder le dossier de la personne à l'id = 4. Comment donner l'accés à l'id = 3 et pas au reste des id...
    Il n'y a pas 36 solutions, tu dois avoir un systèmes de gestion des droits. Ce qui implique également une gestion (même minimale) d'user.
    Ton utilisateur s'enregistre sur ton site, puis, quand il veut afficher une page avec un id particulier, il faut que tu ais un moyen de déterminer, vu "qui" il est, a quelle page il a droit. De sorte que s'il modifie le 3 en 4, il se fasse jeter. L'empecher de modifier le 3 en 4 est utopique (impossible ?) la bonne solution consiste a gerer le cas proprement. Pense également au fait qu'a la place de "4" il pourrait mettre un truc du genre :
    pour tenter de completer une instruction mysql. Bref, comme dit plus haut, vérifie TOUJOURS la coherence de tes variables, même celles qui te semblent difficile a modifier.
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  15. #15
    Membre régulier Avatar de arthak
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 91
    Points : 99
    Points
    99
    Par défaut
    Fladnag > Merci pour ton intéressant post, cependant comme tu le voit dans ma fonction l'écrasement de variables de $_SESSION est désactivé par défaut. Mais son utilisation est uniquement réservée aux formulaires et non pas aux tests génériques, pour la persistance de variables au sein d'une application.


    si tu l'appelle avec une variable venant de $_GET a mettre en session, c'est la variable $_POST qui va etre utilisée dans la session au lieu de $_GET (et comme $_POST est vide, tu va mettre NULL dans la session)
    Une erreur de frappe.

    Si tu t'attends a ce que ta donnée vienne de $_POST, pouvoir la récuperer en $_GET n'est il pas une erreur ? (ou une tentative d'intrusion ?)
    Partant du principe que l'on peux aussi bien tenter une intrusion en POST que en GET, et que les données doivent dans tout les cas êtres vérifiés au sein du script avant d'être ingurgitées par une base de donnée (ou autres), je me suis permit cette facilitée.
    "On ne voit bien qu'avec le cœur, l'essentiel est invisible pour les yeux"
    Antoine de St Exupéry.

  16. #16
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    Pour éviter des $_SESSION["var"] à NULL lors d'une soumission de formulaire, je peux éventuellement faire ceci :

    formulaire.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form name="formu" method="post" action="register_id.php">
    <input type="hidden" name="id_user" value="<?=$id?>">
    </form>
    register_id.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <? session_start() ;
    $_SESSION["id"] = $_POST["id_user"] ;
    ?>
    <script>window.location.href = "menu.php" ;</script>

    En fait, le fichier register.php va servir d'intermediaire pour enregister la variable de session ID pour mes traitements ensuite dans menu.php

    Qu'est ce que vous en pensez ?
    Le savoir est utile que s'il est partagé par tous.
    /(bb|[^b]{2})/
    !sleep() ? array((string))

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    grosso modo c'est l'idée. Sauf que là, si je soumets ton formulaire avec l'id1, je vais obtenir l'identité de Mr 1.
    Quand on pense que bien souvent la première ligne c'est celle de l'admin ; )

    Dans register.php, fais tes verifs avec ta base de données, lorsque que tu as tous controlé, que l'utilisateur est identifié correctement, là tu stockes en session, surtout pas avant.

    bye

  18. #18
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par syl2095 Voir le message
    mouais mais dans le cas d'un id numeric par exemple

    voir le dossier de la personne à l'id = 3, je peux aussi regarder le dossier de la personne à l'id = 4. Comment donner l'accés à l'id = 3 et pas au reste des id...

    Je dois peut être passer par des variables de session...

    Merci de votre participation en tout cas
    Si ce n'est que ça, tu peux passer un hash MD5 de ta variable. Ce sera déjà un peu moins lisible.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  19. #19
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Si je prends ta logique, tu souhaites permettre à un utilisateur de visionner que les "fiches" auquel il a accès. Alors la logique est d'utiliser un système de droit.

    D'abord, il faut que tu gère les droits de tes usagers et conserve en lieu le plus sûr possible l'information quant au niveau de droit de ton usager et à son identifiant.

    Ainsi si les droits sont ceux-ci :

    1 - User
    2 - Admin
    3 - Super Admin

    ... et que pour chaque fiche on a aussi l'information quant à l'identifiant du propriétaire et le niveau requis pour accéder à cette fiche, il est possible de faire des validations d'usage avant de charger la fiche. Utilisons ici les variables de session.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(($_SESSION["niveau"] == 3)||($fiche["niv_acces"] <= $_SESSION["niveau"])||($fiche["usager"] == $_SESSION["usager"])) {
      //Affichage de la fiche
    }
    else {
      //Accès restreint!
    }
    Maintenant, peu importe que ton usager aie trafiqué les variables GET ou POST, il n'ira pas fouiller où il n'a pas le droit. Bien entendu, comme il a été souligné plus haut, il est aussi possible de trafiquer des variables de session mais c'est toutefois plus difficile que de modifier une valeur en GET. Tout dépend du niveau de sécurité nécessaire à ton application, on peut pousser la sécurité jusqu'au HTTPS et les certificats de sécurité.
    Pensez à la balise

  20. #20
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    salut

    ouais c'est vrai que l'on peut établir un système de droit pour la consultation.

    Merci pour ces conseils !
    Le savoir est utile que s'il est partagé par tous.
    /(bb|[^b]{2})/
    !sleep() ? array((string))

Discussions similaires

  1. problème pour récupérer les variables GEt d'un formulaire
    Par ouldfella dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/01/2010, 10h22
  2. Réponses: 4
    Dernier message: 02/03/2007, 22h33
  3. Récupérer les variables GET
    Par Aurazed dans le forum ASP.NET
    Réponses: 3
    Dernier message: 15/02/2007, 10h22
  4. [Sécurité] Peut on créer une variable $_SERVER
    Par Cr@zyDeep dans le forum Langage
    Réponses: 6
    Dernier message: 12/05/2006, 09h27
  5. [Sécurité] Ne pas afficher les variables de l'URL
    Par Wormus dans le forum Langage
    Réponses: 17
    Dernier message: 23/10/2005, 14h13

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