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 :

un "if" pour générer une 404 si url modifiée


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut un "if" pour générer une 404 si url modifiée
    Bonjour à tous,

    J'avance considérablement sur certains points du dév mais je cale sur d'autres.
    Voilà, je souhaite vérifier sur chacune de mes pages, avant tout bout de code, si l'url appelée est bien celle que j'ai mise en place. J'entends, sans variable supplémentaire ni de contenu de variables existantes qui ne seraient pas les contenus d'origine.

    > En allant sur www.monsite.com/groupes/test.php
    Qu'on ne puisse pas ajouter "?id=43"

    > En allant sur www.monsite.com/groupes/equipe.php?id=1
    Qu'on ne puisse pas ajouter "&mdp=23"

    Pour ce faire, je compte mettre avant toute autre ligne de code, ces quelques lignes php pour vérifier et valider ou invalider selon le cas :

    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
    <?php
    
    $reponse = comment appeler l'url (entière, variables "ajoutées par un visiteur" comprises) tapée pour cette page ? EDIT : en utilisant : $_SERVER['QUERY_STRING'] ? ;
    
    
    if ($reponse==comment indiquer l'url valide, de base, de cette page ?) {
        
    
    }
    else {
      header("Status: 404 Not Found");
    
    exit;
      
    }
    
    ?>
    C'est carrément barbare et bizarre, j'en conviens parfaitement, mais cela répondrait totalement à mes besoins.

    Si quelqu'un peut m'aiguiller, j'en serai éternellement reconnaissant

    Merci d'avance.

  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
    Tu pourrais mettre en session les liens que tu proposes sur chaque page.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Thx pour la réponse.
    Par contre, la session n'est-elle pas utile si je souhaite garder une "information" au long d'une navigation ? Car pour le coup, j'ai une information unique par page, donc pas besoin de "sauvegarder" une information en-dehors de sa page référente.

    Du coup,

    Pour le cas n°1 ) Je pense que le mieux serait d'utiliser la variable de serveur : $_SERVER['QUERY_STRING'] en la comparant à la bonne url.
    Mais je n'arrive pas à "echo" cette variable, je dois avoir un problème.
    J'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $test = $_SERVER['QUERY_STRING'] ;
     
    echo $test;
     
     
    ?>
    Mais rien ne s'affiche.


    Pour le cas n°2 ), je pense qu'il faudrait utiliser cette variable de serveur, l'écrire, et ensuite faire un filtre pour indiquer que je n'autorise qu'une variable, "id", et que son contenu doit être numérique.

    Je sens que tout cela est bien mal pensé en PHP, désolé...

    Merci pour ton aide.

  4. #4
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Points : 409
    Points
    409
    Billets dans le blog
    1
    Par défaut
    Je t'avoue ne pas voir l'intérêt d'une telle sécurité, mais tu dois avoir tes raisons.

    Concernant sa résolution, tu as bien deux solutions :
    - passer par $_SERVER
    - passer par $_GET pour vérifier qu'il n'y a rien de plus dedans que les paramètres donnés et qu'ils sont au bon format ?

    Quand à la façon de tester ça, définir un tableau qui listerait pour chaque page les paramètres attendus avec leur règle de construction ( 'id' => [0-9]{3} par exemple) serait une solution correcte oui.
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est carrément barbare et bizarre, j'en conviens parfaitement, mais cela répondrait totalement à mes besoins.
    Parfaitement, c'est n'importe quoi...

    C'est quoi exactement le besoin ?

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Thx

    En fait, ce n'est pas une "sécurité" à proprement parler, c'est une sécurité pour le référencement. Du coup, si on fait des liens sur des urls qui n'existent pas mais qui fournissent quand même des pages (car ajout d'une variable sur la page A, la page A s'affichera quand même), il y aura du duplicat. Or si je vérifie chaque url avec cette sécurité, une variable en plus ou au résultat non attendu renverra une 404. Chaque page (et donc contenu) ne pourra être appelée que grâce à une URL, une seule, précise et vérifée.

    Mais je t'avoue que c'est carrément biscornue, mais au final, cela marche parfaitement.

    J'ai donc réussi à résoudre mon premier point avec 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
    <?php
    $test = $_SERVER["REQUEST_URI"]  ;
     
    if ($test=="/mapage.php") {
     
     
    }
    else {
        header("Status: 404 Not Found");
     
    exit;
    }				
     
     
    ?>
    Si on ajoute une variable à mapage.php, l'erreur 404 se déclenche, quoiqu'on ajoute à l'url.

    Pour mon deuxième problème, vu qu'il s'agit d'une page contenant une variable, j'ai fait 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
    <?php
    $test = $_SERVER["REQUEST_URI"]  ;
     
    if ($test=="/une-autre-page.php?id=/"'.$_GET['id'].'/")" {
     
     
    }
    else {
        header("Status: 404 Not Found");
     
    exit;
    }				
     
     
    ?>
    Du coup, je souhaite ici savoir deux choses :
    - Si l'url possède bien "?id=" > en utilisant GET
    - Si "id" est bien un nombre : Je rajouterai à mon if, un truc comme : AND $_GET['id']="[0-9]{3}"

    Pour le premier tiret, Get ne semble pas être lu...





    Après, je traite (avec succès) le nombre précisément pour savoir s'il correspond à un ID existant, donc, sur cette partie-là, pas de besoin.

    C'est carrément du triturage d'esprit bizzare et sûrement inutile pour un mec qui touche à PHP, je sais

    Mais je vous assure que ça répond parfaitement à ma demande et optimise grandement mon site d'un point de vue "référencement". D'un point de vue "sécurité", je pense "un peu", mais à vrai dire, ce n'est pas l'objet de ma démarche avec ce triturage d'esprit.

    En tout cas, merci pour vos interventions

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Parfaitement, c'est n'importe quoi...

    C'est quoi exactement le besoin ?
    Bonjour,

    Eviter le Duplicat Content si quelqu'un fait un lien vers "mapage.php?id=2&test=3" alors que la variable test n'existe pas mais que la page s'affiche quand même en prenant en compte id="2".

    Le mieux serait de passer par htaccess pour définir des "types de chemin" ?

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Chaque page (et donc contenu) ne pourra être appelée que grâce à une URL, une seule, précise et vérifée.
    Le R de URL tu sais ce que c'est ??

    Eviter le Duplicat Content si quelqu'un fait un lien vers "mapage.php?id=2&test=3" alors que la variable test n'existe pas mais que la page s'affiche quand même en prenant en compte id="2".
    En général, pour ce qui est de la SEO, on utilise des URL propres pour répondre à cette problématique et non à un triturage bizarre de la query string.

    Si les paramètres GET servent à identifier des ressources, alors il est tout à fait normal de renvoyer un statut correspondant à l'état de la ressource (404 par exemple si elle est absente).

    Exemple:
    GET http://domaine/article/1 >> 200 Ok
    GET http://domaine/article/foobar >> 404 Not Found
    PUT http://domaine/article/2 >> 403 Forbidden
    etc.

    Maintenant, je doute franchement que les robots d'indexation vont crawler ton site en ajoutant des paramètres au hasard balthazar... Donc je ne comprends toujours pas où est cette fameuse "optimisation" du référencement...

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message

    Maintenant, je doute franchement que les robots d'indexation vont crawler ton site en ajoutant des paramètres au hasard balthazar... Donc je ne comprends toujours pas où est cette fameuse "optimisation" du référencement...
    Ah mais là, il s'agit simplement d'éviter toute tentative de négative SEO.
    Et Balthazar en fait parfois, je t'assure. Ce n'est pas le seul pan du NSEO, mais c'est une porte qui existe.

    Pour ce qui est des URL propres, j'avoue, c'est un truc que je ne maîtrise pas et qu'il faut évidemment faire.
    Le htaccess répond à ce point ?

    Exemple:
    GET http://domaine/article/1 >> 200 Ok
    GET http://domaine/article/foobar >> 404 Not Found
    PUT http://domaine/article/2 >> 403 Forbidden
    etc.
    C'est htacess qui permet de répondre à cela ? Si oui, je ne peux pas faire une nouvelle ligne à chaque création de page ? (je fais tout mon site à la main de A à Z).
    Car quand mon "get" est faux (genre un "id" qui n'existe pas), j'ai quand même la gabarit de la page qui s'affiche, et non une 404.


    Merci en tout cas pour ta réponse.
    Et mon amateurisme comprend également des lacunes et des pistes de réflexions bizarres, ce qui doit être énervant, je l'avoue

  10. #10
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ah mais là, il s'agit simplement d'éviter toute tentative de négative SEO.
    Et Balthazar en fait parfois, je t'assure.
    Ah je comprends, tu veux éviter qu'intentionnellement quelqu'un disperse la pondération des pages en générant une floppé d'URL bidons... Dans ce cas pourquoi ne pas tout simplement valider les paramètres attendus et renvoyer un 400 Bad Request si il y a des paramètres innatendus ?

    Ex:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
     
    // Paramètre GET autorisés 
    // (et leur type)
    $expected[INPUT_GET] = array(
        'id'   => FILTER_VALIDATE_INTEGER,
        'date' => FILTER_SANITIZE_STRING
    );
     
    // S'il y a des paramètres
    // GET "en trop"
    if (count(array_diff_key($_GET, $expected[INPUT_GET]))) {
        header("{$_SERVER['SERVER_PROTOCOL']} 400 Bad Request");
        exit;
    }
     
    // Obtention des paramètres
    foreach ($expected as $type => $filter)
        $obtained[$type] = filter_input_array($type, $filter);
     
    // Exemple de validation
    if ($id = $obtained[INPUT_GET]['id']) {
        try {
            $article = new Article($id);
        }
        catch (Exception $e) {
            header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found");
            exit;
        }
    }
    elseif ($date = $obtained[INPUT_GET]['date']) {
        $article = Article::getByDate($date)->first();
        if (!$article) {
            header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found");
            exit;
        }
    }
    else {
        // il n'y a ni id ni date
        header("{$_SERVER['SERVER_PROTOCOL']} 400 Bad Request");
        exit;
    }
     
    // ...

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    C'est PARFAITEMENT mon besoin

    Je vais tester cela, merci à toi

  12. #12
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    J'ai fait une update du code au passage...

    Bon c'est juste un exemple. A toi de le comprendre et de l'adapter.

  13. #13
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Niquel

    Petite dernière question, htaccess qui génère des urls propres (monsite.com/ma-page/) rend-il inutile ce "filtrage" ?

    MERCI en tout cas, je clique sur "résolu" et désolé de ne pas avoir été très explicite au début.

  14. #14
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Non, le filtrage (et surtout la validation) est toujours nécéssaire car en réalité la réécriture consiste à transformer http://domaine/article/1 en http://domaine/article.php?id=1 (par exemple).

    Mais rien n'empêche quelqu'un de créer ce genre de lien http://domaine/article/1?foo=bar

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2012
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Tout est niquel chrome, je comprends mieux.

    Merci beaucoup !

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

Discussions similaires

  1. un "empty" pour générer une 404.
    Par PMulE dans le forum Langage
    Réponses: 7
    Dernier message: 20/01/2013, 17h24
  2. Réponses: 3
    Dernier message: 02/12/2005, 13h23
  3. Réponses: 1
    Dernier message: 14/10/2005, 09h55

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