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 :

Filtrer les variables


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Par défaut Filtrer les variables
    Bonjour, je voulais savoir, jusqu’où on doit filtrer des variables.

    Je souhaite me servir de la variable $_SERVER['REQUEST_URI'].

    C'est une variable serveur, mais tout le monde peut y taper dedans n'importe quoi.

    Avant de traiter cette variable si j'ai bien compris je dois la filtrer.

    Mais des filtres y en a un paquet.... filtre de validation, filtre de nettoyage... filter_var(), filter_input()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    filter_input( INPUT_SERVER , $url )
    filter_var( $url , FILTER_VALIDATE_URL )
    trim( $url )
    stripslashes( $url )
    htmlspecialchars( $url )
    Filtrer pour filtrer cela ne sert a rien, donc je voulais voir avec vous comme se poser les bonnes questions pour appliquer le ou les bons filtres

    Je vais avoir un modèle du style : /blabla/macategorie/monarticle/page2/edit

    Je dois faire un explode( '/' , $url );
    Dois-je filtrer avant ou après explode(), l'ensemble ou chaque $path[] un après l'autre de facon différente

    $monarticle sera utilisé pour une include mais reformaté style include ('mon adresse' . $monarticle);
    Je n'attend pas en réponse un script clé en main, mais plutôt des conseils pour me poser les bonnes questions et trouver les bonnes réponses

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    la réponse est simple : à un moment dans le déroulé de tes scripts, tu dois être absolument certain de ce qui est manipulé.
    S'il est attendu un entier à un moment, tu dois t'assurer que c'est un entier que tu vas présenter, si c'est une valeur parmi une liste, même raisonnement, etc.
    Tu peux filtrer, nettoyer ou même caster pour s'assurer que ce qui est reçu est conforme à ce qui est attendu.

    Et en la matière : tout ce qui provient de l'extérieur doit faire OBLIGATOIREMENT l'objet d'un contrôle de valeur et/ou de type.

    Le pendant est : tout ce qui doit être envoyé au navigateur doit être rendu inoffensif par un échappement via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // échappement des caractères dangereux
    $hsc = function($p): string { return htmlspecialchars((string)$p, ENT_QUOTES, 'utf-8'); };

  3. #3
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Par défaut
    Avec l'URL : /aa a<script>

    J'ai echo $_SERVER['REQUEST_URI'] -> aa%20a%3Cscript%3E

    Et en passant $_SERVER['REQUEST_URI'] par htmlspecialchars(), j'ai $url = htmlspecialchars( ( string ) $url , ENT_QUOTES , 'utf-8' ); -> aa%20a%3Cscript%3E

    Cela ne change rien $_SERVER['REQUEST_URI'] est-elle déjà filtrée ???
    Du coup cela ne sert à rien de la filtrer ???

  4. #4
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Plus de précisions sur les différentes fonctions :
    La fonction filter_input va aller chercher directement dans $_SERVER la valeur par rapport à l'index et gérer le cas où l'index n'existe pas, alors que filter_var travaille directement sur la variable et que c'est à toi de vérifier que tu lui envoies bien quelque chose.
    Donc basiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $res = filter_input(INPUT_SERVER, 'REQUEST_URI', $filtres);
    // équivalent à 
    $res = null;
    if (isset($_SERVER['REQUEST_URI'])) {
        $res = filter_var($_SERVER['REQUEST_URI']), $filtres);
    }
    Dans ton cas, tu peux utiliser filter_input avec le filtre FILTER_SANITIZE_URL par exemple.
    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]

  5. #5
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Par défaut
    Merciiii, bon je vais utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filter_input( INPUT_SERVER , 'REQUEST_URI' , FILTER_SANITIZE_URL )
    Si j'ai bien compris, il gère si $_SERVER['REQUEST_URI'] n'existe pas

    1°) Je suppose qu'il retourne NULL si $_SERVER['REQUEST_URI'] n'existe pas plutôt que de générer une erreur ?

    2°) Comment $_SERVER['REQUEST_URI'] peut ne pas exister ?

    3°) J'ai bien compris que FILTER_SANITIZE_URL filtre, mais je ne comprend pas quoi !!!
    Si dans mon URL, je tape n’importe quoi histoire de tester le filtre...

    http://monsite.com/a+ +aa@a<:!/

    avec echo $_SERVER['REQUEST_URI']; -> cela affiche /a+%20+aa@a%3C:!/et si je filtre... et bien... cela affiche toujours la même chose...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo filter_input( INPUT_SERVER , 'REQUEST_URI' , FILTER_SANITIZE_URL )
    ->
    /a+%20+aa@a%3C:!/
    Donc cela filtre... cela transforme < en %3C

    Mais $_SERVER['REQUEST_URI'] le fait déjà tout seul, c'est ça que je ne comprends pas

  6. #6
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Par défaut
    Message de Savageman

    à noter que $_SERVER['PHP_SELF'] est vulnérable à la faille XSS !
    Pour l'afficher, on utilisera donc htmlspecialchars().
    $_SERVER['REQUEST_URI'] n'est pas affecté par cette faille, on peut l'afficher directement.
    Mais comme il ne faut pas croire ce qui vient de l'extérieur lol je préfère filtrer heuuu vous demander votre avis

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    rawsrc t'a dit quoi faire.

    Après.... Il faut arrêter la parano...
    Si tu codes "proprement" (= rigoureusement) et que tes requêtes SQL sont correctement préparées, ça sera un bon début.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    tout ce qui provient de l'extérieur doit faire OBLIGATOIREMENT l'objet d'un contrôle de valeur et/ou de type.
    C'est pourtant clair, non ?

    C'est ta conception du mot "filtrer" qui est biaisée.

    • On ne filtre pas seulement parce qu'il y a un "risque".
    • On s'assure aussi que la donnée a bien la forme (syntaxe,...) et le type voulu.

    Donc, PAS BESOIN de se demander quel est le DEGRÉ de risque (faible ? élevé ? proche de zéro ? ...).
    Non.
    On fait fait.

    Et on dort sur ses deux oreilles.


    Pour enfoncer le clou... :
    $_SERVER['REQUEST_URI'] est censé renvoyer une URI (qui respecte la syntaxe d'une URL).
    Donc, on s'assure que c'est bien le cas.
    Point barre.

    Pour fracasser le clou... :
    Quand tu mets tes chaussures le matin, tu ne te demandes pas si tu vas devoir marcher sur de la moquette toute douce, ou sur du gravier ou du verre coupant.
    Tu les mets.
    Point barre.
    Dernière modification par Invité ; 15/11/2019 à 12h36.

  9. #9
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Par défaut
    SI $_SERVER['REQUEST_URI'] = a+ +aa@a<:!/
    echo $_SERVER['REQUEST_URI']
    Donne : /a+%20+aa@a%3C:!/
    Sans filtre $_SERVER['REQUEST_URI'] à déjà remplacé < par %3C (sans filtre tout seul comme un grand)

    Bon partons du principe qu'on filtre, y aurait-il un exemple concret au je pourrais voir en pratique l'utilité du filtre

    Voila un exemple me permettrait de comprendre, car pour le moment les seuls exemples que je teste, je trouve pas de différence

  10. #10
    Invité
    Invité(e)
    Par défaut
    OK.

    Remplace le mot "FILTRER" par le mot "VÉRIFIER".
    Ça changera peut-être ta vision des choses.

    Sinon... Fais comme tu veux...

    Citation Envoyé par scamphp Voir le message
    ...Si je vais faire un jogging, aller à la mer, à la montagne au foot ou au resto je ne mets pas les mêmes chaussures.
    Là, on est d'accord !
    Mais pas pour la même raison : "on ne met pas les mêmes" en fonction de CE QU'ON VEUT/DOIT EN FAIRE.
    Par conséquent, on VÉRIFIE qu'on a les BONNES chaussures / données.

  11. #11
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Par défaut
    Oui voila tu as raison

    Par conséquent, on VÉRIFIE qu'on a les BONNES chaussures / données.
    "VÉRIFIER" c'est mieux que filtrer.

    Sur GG la tendance est quand même a dire que $_SERVER['REQUEST_URI'] est sûr.

    Mais comme personne n'est d'accord, j'en déduis que personne ne sait en réalité.

    Principe de précaution comme on ne sait pas comment est générée $_SERVER['REQUEST_URI'], car on n'est pas développeur de la team PHP, alors on filtre dans le doute.

    Mais du coup il faudrait aussi VÉRIFIER dirname( __DIR__ ) ???

    Et si je mets des chaussures $chaussure faudrait aussi vérifier que $chaussure sont bien des chaussures même si c'est moi qui vient de les mettre ??? et vérifier ses propres variables...

    La pour le coup, je vais être parano...

  12. #12
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Par défaut
    Pour fracasser le clou... :
    Quand tu mets tes chaussures le matin, tu ne te demandes pas si tu vas devoir marcher sur de la moquette toute douce, ou sur du gravier ou du verre coupant.
    Tu les mets.
    Point barre.
    Et bien SI justement, c'est ça mon problème lol

    Si je vais faire un jogging, aller à la mer, à la montagne au foot ou au resto je ne mets pas les mêmes chaussures.

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/10/2019, 17h08
  2. [Google Maps] Filtrer les marqueurs suivant une variable codeclient
    Par salamaabdelhakim dans le forum APIs Google
    Réponses: 17
    Dernier message: 25/03/2018, 14h27
  3. Filtrer les variables
    Par Zachatim dans le forum Langage
    Réponses: 13
    Dernier message: 05/01/2016, 16h46
  4. Réponses: 3
    Dernier message: 06/05/2006, 23h07
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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