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 :

MVC controller OK et maintenant ?


Sujet :

Langage PHP

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

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut MVC controller OK et maintenant ?
    Salut je suis de retour sur le forum avec mes petites questions...

    Je me suis enfermé plusieurs jours pour vraiment me mettre dans les tutos.

    J'ai monté ma première structure MVC wahou maintenant je sais et comprend le principe.

    Avant pour moi la sécurité c'était un peu abstrait avec mon HTML et WP.

    Mais la je suis en plein dedans et je commence à comprendre le concept de ce qu'on doit protéger...

    Sur mon index, je récupère les paramètres de l'url puis aller chercher les controller qui vont bien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $controller = ucfirst($page[0]) . 'Controller';
    $controller = new $controller();
    $controller->$action();
    categoryContoller pas de prob ça existe l'autoloader charge la class et pointe vers le controller....

    Mais si je tape n'importe quoi dans mon url.... pas moi et quelqu'un sans neurone, je ne dirais pas qui.... mais imaginons quelqu'un ou quelqu'une pour légalité disons DENDRITE au hasard...

    et bien PAF ERREUR impossible de charger l'objet (normal il n'existe pas).

    J'ai bien tenté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!class_exists($controlle, false)) {die('fait n\'importe quoi de toute façon tu fais toujours n\'importe quoi') ; }
    dans mon index... mais avant ça sert $controller = new $controller() et après pas plus...

    Alors je l'ai mis dans l'autoloader en désespoir c'est mieux, mais après c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $controller->$action();
    dans l'index qui plante...

    Plutôt que de tenter des trucs au hasard.... j'aimerais bien comprendre la logique, les procédures de sécurité sur cet exemple qui me parle puisque j'y suis en plein dedans...

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par scamphp Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $controller = ucfirst($page[0]) . 'Controller';
    $controller = new $controller();
    $controller->$action();
    categoryContoller pas de prob ça existe l'autoloader charge la class et pointe vers le controller....

    Mais si je tape n'importe quoi dans mon url.... pas moi et quelqu'un sans neurone, je ne dirais pas qui.... mais imaginons quelqu'un ou quelqu'une pour légalité disons DENDRITE au hasard...

    et bien PAF ERREUR impossible de charger l'objet (normal il n'existe pas).
    L'autoloader ne doit pas vérifier si l'action existe, ce n'est pas du tout son taf. Faut rester minimaliste et surtout logique.
    Dans ton cas de figure, je présume que tu rediriges toutes les requêtes vers index.php et que c'est l'unique point d'entrée de ton site. La logique voudrait que tu détermines (quels que soient les paramètres reçus) le nom théorique de la classe controller qui devrait théoriquement prendre en charge le traitement de la requête et que tu essaies de l'instancier.
    Comme c'est une demande bidon et que la classe n'existe pas, l'autoloader devrait déclencher une Exception en bonne et due forme. Donc il suffit d'intercepter cette exception en se positionnant au dessus du mécanisme d'autoloading.
    Ce qui donnerait dans ton cas de figure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $controller = ucfirst($page[0]) . 'Controller';
    try {
        $controller = new $controller();    // ici tu passes la main au mécanisme d'autoloading
    } catch (Exception $e) {
        echo 'fait n\'importe quoi de toute façon tu fais toujours n\'importe quoi';
        exit;
    }
    $controller->$action();

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

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    Merci pour la réponse

    Moi qui pensais découvrir mes 1ere notions de sécurité... en réalité il faut gérer les erreurs...

    Mais c'est bien sur... c'est normal d'avoir une erreur.... moi je cherchais à l'éviter alors qu'en réalité il faut la gérer.


    j'en profite pour savoir sur ce fichier d'entrée, les questions que je dois me poser ? les bonnes questions que je dois me poser...
    (pour une fois que c'est pas moi qui pose une question lol)


    Sur le fichier index :

    1) je récupère les paramètres dans l'url

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(isset($_GET['p'])){
        $page = $_GET['p'];
    }else{
        $page = 'home';
    }
    Je récupère un $_GET['p']
    Que dois-je faire... c'est une donnée externe->donc danger->je dois peut être la filtrer... vérifier si c'est un texte ou un nombre... en réalité ça ne me change rien que ce soit un nombre ou un texte...
    si les valeurs n'existent pas-> ça donnera une erreur-> ok on gèrera l'erreur-> cela peut être quoi d'autre ??? un script-> faudrait peut être limiter la longueur (j'aurais jamais plus de 255 caractère dans mes param)-> si c'est trop long je coupe c'est que c'est un script-> je filtre des caractères...

    voila rien que sur ce petit bout... c'est quoi la stratégie (pas théorique du style je ne fais pas confiance aux données externes... blablabla... non c'est quoi la stratégie pratique par l'exemple).

  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 : 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
    Citation Envoyé par scamphp Voir le message
    Je récupère un $_GET['p']
    Que dois-je faire... c'est une donnée externe->donc danger->je dois peut être la filtrer... vérifier si c'est un texte ou un nombre... en réalité ça ne me change rien que ce soit un nombre ou un texte...
    si les valeurs n'existent pas-> ça donnera une erreur-> ok on gèrera l'erreur-> cela peut être quoi d'autre ??? un script-> faudrait peut être limiter la longueur (j'aurais jamais plus de 255 caractère dans mes param)-> si c'est trop long je coupe c'est que c'est un script-> je filtre des caractères...

    voila rien que sur ce petit bout... c'est quoi la stratégie (pas théorique du style je ne fais pas confiance aux données externes... blablabla... non c'est quoi la stratégie pratique par l'exemple).
    Il y a deux stratégies possibles : filtrer ce que tu ne veux pas pas laisser entrer, ou n'accepter que ce que tu veux laisser entrer. C'est le même chose qu'un videur à l'entrée d'une soirée : soit il ne laisse pas passer les gars en tongs, soit il ne laisse passer que les gens avec une invitation.

    Donc dans ton cas :
    soit tu as la liste exhaustive des pages autorisées. et si $_GET['p'] ne correspond pas, tu retournes une erreur "Désolé, c'est une soirée privée"
    soit tu filtres $_GET['p'] pour ne laisser passer que les chaines correctement formées (ou nettoyer les données avant de les utiliser). Pour ça, tu peux utiliser des choses comme filter_​input avec des filtres comme FILTER_SANITIZE_STRING.
    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 régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    MON INDEX

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    APP::load();
     
    // je récupéré les params Bon ou Pas Bons avec $page = $_GET['p']
    // je compose mon controller dynamiquement $controller_name
     
    try {
        $controller = new $controller_name();    // ici tu passes la main au mécanisme d'autoloading
    } catch(Exception $e) {
        echo 'fait n\'importe quoi de toute façon tu fais toujours n\'importe quoi';
        exit;
    }
    et bien cela ne change rien j'ai toujours mon AUTOLOADER qui génère une erreur puisque il ne peut pas faire le require qui va bien...
    et je n'arrive pas a changer le message d'erreur.

    Warning: require(Controller/Controller....
    Fatal error: require(): Failed opening required 'Controller/Controller....
    Si dans mon Autoloader je teste l’existence du fichier pour nr pas faire le require...
    J'ai quand même une erreur fatale puisque la classe ne peut pas se charger...

    Fatal error: Uncaught Error: Class 'Controller
    Mais je n'arrive pas à intercepter l’exception pour afficher mon message

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (Exception $e) {
        echo 'Exception reçue : '.  $e->getMessage(). "\n";
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    non cela change rien

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

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    Ok super j'ai mis un Throw New et cela marche super

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

Discussions similaires

  1. [Security] Spring Security 3 + Spring 3 MVC Controller Annotation
    Par Axelou dans le forum Spring
    Réponses: 2
    Dernier message: 19/03/2011, 17h40
  2. [Spring MVC] @Controller et la response
    Par Ylias dans le forum Spring Web
    Réponses: 1
    Dernier message: 13/06/2008, 11h15
  3. Réponses: 3
    Dernier message: 03/09/2007, 19h02
  4. [MVC/Organisation] Séparer le Modèle/Métier de la Vue/Controller
    Par Wookai dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 25/06/2007, 11h03
  5. Réponses: 1
    Dernier message: 12/02/2007, 12h43

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