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

Serveurs (Apache, IIS,...) Discussion :

Sécuriser l'accès au fichier bdd du site web dynamique


Sujet :

Serveurs (Apache, IIS,...)

  1. #1
    Membre confirmé Avatar de nl.smart
    Homme Profil pro
    ouvrier
    Inscrit en
    Avril 2019
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 155
    Points : 534
    Points
    534
    Par défaut Sécuriser l'accès au fichier bdd du site web dynamique
    Bonjour,

    Mon site web dynamique nécessite une base de données, la base de données est accessible au site web via un fichier php contenant le mot de passe pour que le site accède à la base de données.
    Comment protéger le mot de passe contenu dans le fichier de sorte qu'une personne aspirant le site web avec ce fichier php ne dispose pas de mot de passe ?
    Pourquoi pas (si cela est possible) protéger toutes les variables déclarées ici en clair...

    ci-dessous le fichier php qui permet au site de se connecter à la bdd :

    Code php : 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
    <?php
    $servername = "localhost";
    $dbname = "glossaire";
    $username = "root";
    $password = "le_mot_de_passe";
     
    date_default_timezone_set("Europe/Paris"); 
     
    if (session_status() == PHP_SESSION_NONE)
    {
        session_start();
    }
    try
    {
        $bdd = new PDO("mysql:host=$servername; dbname=$dbname; charset=utf8", $username, $password);
        $bdd-> setATTRIBUTE(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $bdd-> setATTRIBUTE(PDO::ERRMODE_SILENT, PDO::ERRMODE_WARNING);
        $bdd-> setATTRIBUTE(PDO::ATTR_EMULATE_PREPARES,false);
    }
    catch(PDOexception $e)
    {
        echo'echec de la connexion: '.$e->getMessage();
        exit;
    }
    ?>

    Vous remerciant pour vos lumières.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Robotique
    Inscrit en
    Août 2007
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Robotique

    Informations forums :
    Inscription : Août 2007
    Messages : 624
    Points : 1 275
    Points
    1 275
    Par défaut
    Citation Envoyé par nl.smart Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $username = "root";
    $password = "le_mot_de_passe";
    Vous remerciant pour vos lumières.
    Si c'est vraiment root et son mot de passe, c'est déjà la cata.
    Non seulement il aurait accès à la base de données mais aussi à toute la machine !!
    Il faut créer un user spécifique pour le site et lui autoriser les droits sur la base de données concernée.

    le fichier de conf je le mettrais dans un sous-répertoire qui serait interdit d'accès via le fichier robots.txt
    Après je conseillerais de tester sur votre site un aspirateur web et voir ce qui se passe et ce que vous récupérez finalement.

    hth,

  3. #3
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    +1 pour la recommandation de ne pas utiliser root

    Coté PHP, l'affichage du message de l'exception de ton bloc catch peut également afficher des informations sensibles.
    Il serait mieux de ne pas avoir de try/catch pour ce code afin de laisser PHP afficher et/ou loguer le message si une exception se déclenche (plus d'exlication sur cet article : https://www.julp.fr/blog/posts/43-my...e-un-try-catch).

  4. #4
    Membre confirmé Avatar de nl.smart
    Homme Profil pro
    ouvrier
    Inscrit en
    Avril 2019
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 155
    Points : 534
    Points
    534
    Par défaut
    Merci pour vos explications et recommandations.

  5. #5
    Membre confirmé Avatar de nl.smart
    Homme Profil pro
    ouvrier
    Inscrit en
    Avril 2019
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 155
    Points : 534
    Points
    534
    Par défaut
    J'ai effectué des modifications au fichier bdd.php

    Dans un premier temps j'essaye de passer par des variables d’environnement pour me connecter à la base de données,
    ainsi j'ai accès au site qui nécessite une base de données

    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
    <?php
    $servername = getenv('DB_HOST');
    $dbname = getenv('DB_NAME');
    $username = getenv('DB_USER');
    $password = getenv('DB_PASSWORD');
    
    date_default_timezone_set("Europe/Paris");
    
    if (session_status() == PHP_SESSION_NONE)
    {
        session_start();
    }
    try {
        $bdd = new PDO("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=$dbname;charset=utf8", $username, $password);
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connexion réussie à la base de données";
    } catch(PDOException $e) {
        echo "La connexion a échoué : " . $e->getMessage()
    le fichier environment contient les données suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #
    # This file is parsed by pam_env module
    #
    # Syntax: simple "KEY=VAL" pairs on separate lines
    #
    export DB_HOST=localhost
    export DB_NAME=glossaire
    export DB_USER=nls
    export DB_PASSWORD=mdp
    sur le site il y a possibilité de s’identifier pour accéder à un crud (un back office simplifié) mais avec le fichier bdd.php fourni plus haut je ne parviens pas à m'identifier, j'ai le message d'erreur suivant dans le navigateur lors de la connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    La connexion a échoué : SQLSTATE[HY000] [1698] Access denied for user ''@'localhost'
    user'' devrait être défini il me semble

    le code du fichier qui effectue le traitement est le suivant :

    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
    
    <?php
        include('bdd.php');
    
        if(
            (isset($_POST['ident']) && ($_POST['ident']!= NULL)) &&
            (isset($_POST['mdp']) && ($_POST['mdp']!= NULL))
    
            )
            {   $ident = htmlspecialchars($_POST['ident']);
                $mdp = $_POST['mdp'];
    
                $query = "SELECT * FROM users WHERE ident = :ident ";
    
                $requete = $bdd->prepare($query);
                $requete->bindValue(':ident', $ident, PDO::PARAM_STR);
                $requete->execute();
    
                $data = $requete->fetch();
    
                if (!empty ($data)) {
                    if (password_verify($mdp, $data['mdp'])) {
                        $_SESSION['ident']=$ident;
                        header('Location: ../index.php?page=1'); // car le login et le mot de passe sont corrects
                    }
                    else {
                        $_SESSION['message'] = ' Le mot de passe n\'est pas correct. '; // car le mot de passe n'est pas correct
                        header('Location: ../index.php?page=3');
                    }
                }
                else {
                    $_SESSION['message'] = ' L\'identifiant et le mot de passe ne sont pas corrects. '; // car le login et le mot de passe ne sont pas corrects
                    header('Location: ../index.php?page=3');
                }
    
            }
    ?>
    note : je viens de lister les utilisateurs ayant droits d’accès à la base de données

    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
    [nls@h2 ~]$ sudo mysql -u root -p
    [sudo] password for nls: 
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 23
    Server version: 10.11.2-MariaDB Arch Linux
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> SELECT User FROM mysql.user;
    +-------------+
    | User        |
    +-------------+
    | PUBLIC      |
    | mariadb.sys |
    | mysql       |
    | nls         |
    | root        |
    +-------------+
    5 rows in set (0,005 sec)
    
    MariaDB [(none)]>
    effectivement, il doit y avoir un manquement, en effet le message d'erreur mentionne l'absence d'un utilisateur qui est absent entre les cotes
    => Access denied for user ''@'localhost'
    Le but est bien entendu de rendre le site accessible à un visiteur anonyme qui se rend sur le site, ce qui est normal. le message d'erreur s'affiche une fraction de seconde en haut de l’écran lorsque je passe d'une page à l'autre du site web.

    après tests le site web est accessible depuis le net, hors de mon réseau local, l'erreur persiste et est la même.
    pas de soucis pour accéder à phpmyadmin en local

    merci pour vos lumières.

  6. #6
    Membre confirmé Avatar de nl.smart
    Homme Profil pro
    ouvrier
    Inscrit en
    Avril 2019
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 155
    Points : 534
    Points
    534
    Par défaut
    J'ai effectué des modifications au fichier bdd.php en tenant compte de vos remarques

    Un utilisateur spécifique a été créé pour accéder au site
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $username = getenv('DB_USER');
    $password = getenv('DB_PASSWORD');
    Je viens de résoudre le problème par l'utilisation d'un fichier .htaccess, est-ce là une bonne pratique ?
    il est situé à la racine de mon site web

    fichier .htaccess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SetEnv DB_HOST localhost
    SetEnv DB_NAME glossaire
    SetEnv DB_USER nls
    SetEnv DB_PASSWORD mdp
    fichier VirtualHost
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <VirtualHost *:80>
        ServerAdmin mon.site@free.fr
        DocumentRoot "/srv/http/www"
        ServerName mon.site.free.fr
        <Directory /srv/http/www>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
            <Files .htaccess>
                Require all denied
            </Files>
        </Directory>
    </VirtualHost>
    fichier de connexion à la bdd
    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
    <?php
    $servername = getenv('DB_HOST');
    $dbname = getenv('DB_NAME');
    $username = getenv('DB_USER');
    $password = getenv('DB_PASSWORD');
    
    date_default_timezone_set("Europe/Paris");
    
    if (session_status() == PHP_SESSION_NONE)
    {
        session_start();
    }
    try {
        $bdd = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password);
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // echo "Connexion réussie à la base de données"; // ligne commentée pour ne pas la voir apparaitre sur le site
    } catch(PDOException $e) {
        echo "La connexion a échoué : " . $e->getMessage();
    }
    ?>
    2023.05.04
    le try catch se voit modifier, l'error log sera consigné dans le journal d'erreur et non plus à l'écran de l'utilisateur, plus pratique car il y aura un retour chez l'admin du site.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
        $bdd = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password);
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // echo "Connexion réussie à* la base de données"; 
    } catch(PDOException $e) {
        error_log("La connexion a échoué à* la bdd : " . $e->getMessage()); 
        echo "Une erreur est survenue lors de la connexion à* la base de données. Veuillez réessayer plus tard.";
    merci pour vos retours. je passerai ce poste en résolu lorsque vous me confirmerez ou pas le bon usage de ces solutions.

  7. #7
    Membre confirmé Avatar de nl.smart
    Homme Profil pro
    ouvrier
    Inscrit en
    Avril 2019
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 155
    Points : 534
    Points
    534
    Par défaut
    je viens de tenir compte du dernier point que je n'avais pas encore mis en œuvre suite à vos recommandations, à savoir aspirer le site web, avec httrack.

    les fichiers contenus dans le répertoire php n'ont pas été aspiré, par contre les dossiers asset, css, js, bootstrap... l'ont été

    Les fichiers php ont été aspirés, mais le sont au format html, du moins ce que le serveur renvoie pour être affiché dans le navigateur en html.

    à noter qu'un fichier caché à la racine du site n'est pas présent lors de l'aspiration.

    Pour ce qui est du fichier robot.txt, j'y travaille :-)

Discussions similaires

  1. sécuriser l'accès à mes fichiers sous IIS
    Par rastatoon dans le forum IIS
    Réponses: 3
    Dernier message: 07/04/2008, 09h28
  2. Recherche d'un outil analyser les dépendances entres les fichiers d'un site web PHP
    Par nkdb dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 06/01/2007, 20h38
  3. sécuriser l'accès à un fichier flash (par php)
    Par melonmaudic dans le forum Flash
    Réponses: 1
    Dernier message: 29/11/2006, 13h51
  4. [VB.NET]Onvrir un fichier depuis un site web
    Par PM_calou dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/10/2006, 18h13
  5. Fichiers .nsf sur site web, c'est quoi ?
    Par vanmouniren dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2005, 10h04

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