Partage
  • Partager sur Facebook
  • Partager sur Twitter

[POO/PHP] connection via des class

Sujet résolu
3 juin 2020 à 5:08:21

bonjour, dites moi si c'est possible de faire ça , et si ça a un intérêt, ça rajoute un peu de sécurité ? 

<?php
/** 
* Class Connect
*Permet de se connecter à la base de données
*/
class Connect{
	/**
	*@var connexion via pdo enregistré dans variable après instanciation de la class PDO
	*/
	protected $pdo;
	/**
	*@var identifiant de connexion caché host
	*/
	protected $host_name = 'XXXXXXXX';
	/**
	*@var identifiant de connexion caché dbname nom de la base
	*/
    protected $database = 'XXXXXXXX';
	/**
	*@var identifiant de connexion caché user_name
	*/
    protected $user_name = 'XXXXXXXX';
	/**
	*@var identifiant de connexion caché mot de passe
	*/
    protected $password = 'XXXXXXXX';
	/**
	*
	*/
    protected $dbh = null;
	/**
	 * connexion à la base enregistré dans la variable pdo
	 * @return [[objet]] [[class pdo qui permet de se connecter à la base]]
	 */
	protected static function pdo(){
        

        try {
            return $this->pdo = new PDO("mysql:host=$this->host_name; dbname=$this->database;", $this->user_name, $this->password);
        } catch (PDOException $e) {
            echo "Erreur!: " . $e->getMessage() . "<br/>";
            die();
        }
    }
}



l'idée étant de faire une class de connexion à la database, puis de faire des enfants (Signin, Signup, ...) qui hériteraient du pdo 

  • Partager sur Facebook
  • Partager sur Twitter
3 juin 2020 à 7:42:23

Bonjour,

Mon avis serait plutôt négatif sur le principe ... je ne regarde pas le code;

- je ne vois pas trop la notion de sécurité en plus : sur quel plan ?

- ce que je vois c'est que si tu veux changer un paramètre par exemple le mdp de l'utilisateur de temps en temps - cela fait partie de la sécurité - tu dois relivrer la classe.

A+

-
Edité par monkey3d 3 juin 2020 à 7:56:57

  • Partager sur Facebook
  • Partager sur Twitter
3 juin 2020 à 7:52:29

Bonjour,

Déjà enlève le try catch si tu ne fais pas une vrai gestion des erreurs. Ils est préférable de laisser php gérer l'exception qui en local sera afficher et en prod non mais sera loggé dans un fichier ou autre.

Ensuite mélanger du static et du non static même si ça semble possible, ce n'est pas très bon niveau conception.

(Et les points données par mon VDD aussi :) )

Voici comment je verais une classe pour la connexion à la bdd (attention je travail avec php 7.4) :

<?php

/**
 * Class Connection
 */
class Connection extends PDO
{
    /**
     * @param string $dsn
     * @param string $user
     * @param string $password
     */
    public function __construct(string $dsn, string $user, string $password)
    {
        parent::__construct($dsn, $user, $password);
        parent::setAttribute(parent::ATTR_DEFAULT_FETCH_MODE, parent::FETCH_ASSOC);
        parent::setAttribute(parent::ATTR_ERRMODE, parent::ERRMODE_EXCEPTION);
        parent::setAttribute(parent::ATTR_EMULATE_PREPARES, true);
    }

    /**
     * @param string $statement
     * @param array $params
     * @return PDOStatement
     */
    public function request(string $statement, array $params = []): PDOStatement
    {
        $request = parent::prepare($statement);

        foreach ($params as $key => $value) {
            $paramType = parent::PARAM_STR;

            if (is_numeric($value)) {
                $paramType = parent::PARAM_INT;
            }

            $request->bindValue($key, $value, $paramType);
        }

        return $request;
    }
}

J'ai simplifié mais si tu veux voir l'original de cette classe demande le moi par MP.

-
Edité par quenti77 3 juin 2020 à 7:53:31

  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2020 à 2:48:00

l'idée étant de mettre dans des variables non accessible les paramètres de connexion, sans aucune connaissance sur le sujet, il serait possible pour des hackers d'afficher le code php, donc même si ce n'est pas infaillible, sinon on l'aurait déjà crié sur tous les toits. 

puis deuxièmement, il est conseillé de modifier le mot de passe de l'utilisateur avant de l'enregistrer dans la base de données, donc le faire dans une méthode privée

comme je l'ai dit plus haut créer une class Signin avec toutes les méthodes de vérifications ( tentative, mot de passe, identifiant, param_str, ...)

idem pour la class Signup qui hériterait de la class Signin( vérification des données fournis lors de la soumission, etc...) 

J'ai répondu aux question de monkey3D quant aux motivations de ce choix

tu me dis mélangé du static et du non static, je n'ai pas l'impression de le faire puisque je crée une class de connexion à la base de donnée

puis une class signin qui hérite et donc la méthode qui retourne si les identifiants sont correct  ressemblerait à ça:

public function connect(){
$pdo= self::pdo();
//requete de connexion
if (ok){
return $res;}
else{
$this->save_ip();}
}

J'ai encore tout faux?



  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2020 à 6:11:21

Sans vouloir épiloguer, je ne vois pas en quoi la manière de faire que tu proposes est plus discrète ou sécurisée que les formes classiques habituelles où par exemple les paramètres de base de données sont enregistrés dans un simple fichier qui est lu par les applicatifs. 

Si un hacker arrive à rentrer dans ton système je ne pense pas que ta méthode sera plus épargnée que les méthodes classiques.

En l'occurrence la classe Connect que tu nous montres n'est pas pour un utilisateur lambda mais pour la connexion à la base de données ... où alors je n'ai pas bien compris.

Je ne vois pas trop pourquoi alors tu parles de changement de mdp de l'utilisateur avant enregistrement en base de données ???

J'avais aussi compris que tu demandais si ta méthode avait (je cite ton premier post) un intérêt. Ma réponse est de mon point de vue : non. Je te laisse avec Quenti77 sur l'aspect écriture du code.

Bye

-
Edité par monkey3d 4 juin 2020 à 6:12:06

  • Partager sur Facebook
  • Partager sur Twitter