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 :

Combiner sessions et .htaccess


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Par défaut Combiner sessions et .htaccess
    Bonjour,
    J'utilise un système de session pour m'authentifier.
    Lorsque je me suis authentifié, j'accède à travers la commande php suivante
    : header("Location: Prive/index.php)

    au fichier index.php se trouvant dans le répertoire "Prive".
    Ce répertoire, je l'ai protégé par le système .htaccess en y mettant "Deny
    from all".

    Seulement l'accès m'est interdit par .htaccess !!!

    Donc comment je peux faire pour protéger ce répertoire pour les accès
    directs, mais en autorisant l'accès à travers les session.
    (si la session existe et la valeur égale à tel ou tel valeur donc j'accède à tel ou tel dossier protégé)
    (j'espère que je suis clair) ?

    Précision, ce répertoire Prive, contient beaucoup d'autres fichiers (images
    et autres) dont je veux en protéger l'accès.

    Merci d'avance pour vos réponses

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Ça ne peut fonctionner : les deux n'ont strictement aucun rapport ou relation d'aucune sorte.

    Il faut utiliser entièrement soit l'un soit l'autre : une authentification HTTP gérée par Apache pour l'accès au répertoire et ses fichiers ou une session PHP, ce qui signifie que dans ce dernier cas il faut un script intermédiaire (se chargeant alors, via les données de la session, à en interdire l'accès sinon servir le document identifié demandé).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Par défaut
    Citation Envoyé par julp Voir le message
    Ça ne peut fonctionner : les deux n'ont strictement aucun rapport ou relation d'aucune sorte.

    Il faut utiliser entièrement soit l'un soit l'autre : une authentification HTTP gérée par Apache pour l'accès au répertoire et ses fichiers ou une session PHP, ce qui signifie que dans ce dernier cas il faut un script intermédiaire (se chargeant alors, via les données de la session, à en interdire l'accès sinon servir le document identifié demandé).
    Merci, j'ai remarqué que même facebook ne protège pas mes photos, si je prend le lien en dure de l'une de mes images sur facebook, ensuite même en détruisant ma session j'arrive quand même à l'afficher. est ce pour ça qu'il mettent des liens pas facile à retenir ? (trop long avec plein de chiffre ).

    Je sais que c'est un peut bête mais est ce possible de faire un set des variable
    $_SERVER['PHP_AUTH_USER']
    $_SERVER['PHP_AUTH_PW']


    Merci

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Pour facebook, aucune idée n'en étant pas utilisateur.

    Citation Envoyé par death_style Voir le message
    Je sais que c'est un peut bête mais est ce possible de faire un set des variable
    $_SERVER['PHP_AUTH_USER']
    $_SERVER['PHP_AUTH_PW']
    Une authentification HTTP gérée par PHP ne serait que locale (propre à un script) contrairement à une gérée par Apache qui s'applique (par défaut du moins) sur l'arborescence. Une authentification HTTP gérée par PHP n'est pas portable (dépendant du serveur/SAPI) et une session PHP pure est en principe plus souple et transparente.

    Les définir ? Avec une authentification HTTP gérée par Apache, ce ne serait pas nécessaire puisque le client réémet les identifiants. Si, en revanche, c'est géré ne serait-ce qu'en partie par PHP, c'est directement impossible notamment pour la simple et bonne raison qu'aucune variable ne persiste après la fin du script (celles en session pouvant être une exception). Il faudrait alors pour cela que PHP se comporte également comme un client HTTP intermédiaire (proxy) - avec un moyen de "reconnaître" le client. Une session PHP seule me semble donc plus simple à mettre en œuvre.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Par défaut
    Merci pour tes réponses,

    C'est un peu dommage car si j'utilise uniquement des session, alors seul les page php avec le bout de code de vérification seront protégées. si j'ai une image dans le même dossier privé, son URL suffit pour y accéder.

    Je cherche pas forcement à le faire avec session+htaccess, mais une manière peu import laquelle

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par death_style Voir le message
    C'est un peu dommage car si j'utilise uniquement des session, alors seul les page php avec le bout de code de vérification seront protégées. si j'ai une image dans le même dossier privé, son URL suffit pour y accéder.
    Non, pas nécessairement, il faudrait mettre ces fichiers plus haut que la racine web pour ne pas qu'ils puissent être accessibles ou à défaut mettre un fichier .htaccess interdisant l'accès à tout client. Vous créez ensuite une partie identification qui va créer/initialiser la session PHP et une autre pour accéder aux fichiers. Cette dernière renverra sur la partie d'identification en absence de session sinon elle servira le fichier demandé dont le nom ou un identifiant sera fourni en paramètre (GET notamment - utiliser éventuellement une réécriture pour "embellir").

    Un exemple incomplet pour la seconde partie, sans 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
    <?php
    session_start();
    if (!isset($_SESSION['util_id'])) {
        // identification (redirection si c'est un script à part)
    } else {
        if (isset($_GET['nom'])) {
            define('REPOSITORY', '/home/toto/data/'); // Doit se terminer par un /
            if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
                ini_set('open_basedir', REPOSITORY);
            }
            $path = realpath(REPOSITORY . $_GET['nom']);
            if (!$path || !is_file($path)) {
                die("Fichier inexistant");
            } else {
                if (strpos($path, REPOSITORY) !== 0) {
                    die("Où vas-tu ?"); // un petit malin cherche à remonter l'arborescence
                } else {
                    // émettre les entêtes HTTP qui conviennent (Content-type notamment)
                    readfile($path);
                }
            }
        } else {
            die("Fichier désiré non spécifié");
        }
    }
    Il y a d'autres implémentations possibles mais certaines ne seront pas adaptées si le contenu de ces fichiers n'est pas totalement maitrisé ou peuvent être bypassées. _Mac_, ici, propose une solution dont la requête est détournée par réécriture sur un tel script intermédiaire.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par death_style Voir le message
    Bonjour,
    Je suis désolée, mais tout ceci me parait bien bien compliqué !
    J'essais de me faire mon petit plan de sécuritée a moi

    si par je ne sais quelle méthode, tu as une valeur
    $_session['cbon']="ok" ...

    les pages interdites sont dans la racine du site et commencent par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?PHP
    session_start();
    if (!isset($_SESSION['cbon'])) {$_SESSION['cbon']="";$cbon="";}
         else {$cbon=$_SESSION['cbon'];}
    if ($cbon!="ok") 
     {
     header('Location: http://www.tonsite.com/index.php');
     exit;
     } 
    ?>
    et les objets, OUI ils sont dans un répertoire protégé par un index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
     header('Location: http://www.tonsite.com/index.php');
     exit;
    ?>
    les objets (PAS DE PHP ICI) sont protégés par htaccess
    ils pourront donc étre lus par les php du site.
    Mais le répertoire reste bloqué a un dir ou autre ....

  8. #8
    Membre émérite Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Par défaut
    Citation Envoyé par mauriser Voir le message
    <?php
    header('Location: http://www.tonsite.com/index.php');
    exit;
    ?>
    [/code]

    les objets (PAS DE PHP ICI) sont protégés par htaccess
    ils pourront donc étre lus par les php du site.
    Mais le répertoire reste bloqué a un dir ou autre ....
    Ah oui mauriser,

    Trés interresante remarque, et surtout bien vu.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par mauriser Voir le message
    Je suis désolée, mais tout ceci me parait bien bien compliqué !
    Non et vous suivez visiblement le même chemin.

    Citation Envoyé par mauriser Voir le message
    les pages interdites sont dans la racine du site et commencent par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?PHP
    session_start();
    if (!isset($_SESSION['cbon'])) {$_SESSION['cbon']="";$cbon="";}
         else {$cbon=$_SESSION['cbon'];}
    if ($cbon!="ok") 
     {
     header('Location: http://www.tonsite.com/index.php');
     exit;
     } 
    ?>
    Ok, mais si ce n'est pas des scripts PHP qu'on doit protéger ? A moins de forcer PHP à voir ces fichiers comme des scripts et utiliser la directive auto_prepend_file pour inclure automatiquement ce code de protection. Solution requérant un minimum de liberté par rapport à la configuration du serveur :

    .htaccess dans le dossier à protéger (requiert PHP en module Apache) :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Définir le script de protection à inclure automatiquement
    php_value auto_prepend_file "C:/AMP/www/intermediaire.php"
    
    # Forcer tout fichier à être vu comme un script PHP
    ForceType application/x-httpd-php

    intermediaire.php :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?php
    session_start();
     
    if (!isset($_SESSION['id'])) {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $dbh = new PDO('mysql:host=localhost;dbname=developpez', 'developpez', 'developpez', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
            $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $login = $dbh->prepare('SELECT id FROM utilisateurs WHERE login = :login AND mot_de_passe = SHA(:mdp)');
            $login->bindValue('login', $_POST['login'], PDO::PARAM_STR);
            $login->bindValue('mdp', $_POST['mdp'], PDO::PARAM_STR);
            $login->execute();
            if ($login->rowCount() === 1) {
                $util = $login->fetch(PDO::FETCH_ASSOC);
                $_SESSION['id'] = $util['id'];
            } else {
                afficher_formulaire("Aucune correspondance");
                exit;
            }
        } else {
            afficher_formulaire();
            exit;
        }
    } else {
        $requested = $_SERVER['DOCUMENT_ROOT'] . $_SERVER['REQUEST_URI'];
        if (is_file($requested)) {
            $mime = mime_content_type($requested); // à remplacer par fileinfo si possible
            #if (/* si c'est bien un script PHP ... */) {
            #    ... en interdire l'accès ; ne rien faire (corps vide), conduira à son interprétation
            #    header('HTTP/1.0 403 Forbidden', TRUE, 403);
            #    echo 'Forbidden';
            #    exit;
            #} else {*/
                header('Content-type: ' . $mime);
                readfile($requested);
                /**
                 * On met fin au script pour éviter toute erreur de syntaxe (fichier binaire) ou exécution de script
                 * malveillant. Si ça doit aussi concerner des scripts PHP à interpréter, il faudra dissocier ce cas
                 * et le traiter autrement
                 **/
                exit;
            #}
        } else {
            header('HTTP/1.0 404 Not Found', TRUE, 404);
            echo 'Not Found';
            exit;
        }
    }
     
    function afficher_formulaire($message = '') {
    ?>
     
    <html> 
    <form action="" method="post">
        Login : <input type="text" name="login" />
        <br />
        Mot de passe : <input type="text" name="mdp" />
        <br />
        <input type="submit" value="Login" />
    </form>
    <?php if ($message) { echo '<p>', $message, '</p>'; } ?>
     
    <?php
    }
    C'est plus simple mais je ne suis pas fan d'une telle mise en œuvre.

    Citation Envoyé par mauriser Voir le message
    les objets (PAS DE PHP ICI) sont protégés par htaccess
    ils pourront donc étre lus par les php du site.
    Mais le répertoire reste bloqué a un dir ou autre ....
    Sauf que nous n'en avons pas d'implémentation

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par julp Voir le message
    Sauf que nous n'en avons pas d'implémentation
    Je comprends ce que tu explique, mais ne trouve pas ta vision des choses contradictoire avec ce que je proposes.
    Par contre , dans ma façon de démarrer chaque PHP protégé, j'introduit bien en tête la programmation d'une mini fonction particulière, bien spécifiée.
    définition de l'implémentation je penses.

  11. #11
    Membre émérite Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Par défaut
    Evidemment, et en plus :
    Citation Envoyé par death_style Voir le message
    Supposons la structure suivante/
    • log.php

    • dossier_privé 1/
      • index.php

      • images/
        • mage1.jpg.
    Suffit aussi de rajouter un fichier index.php ou html dans le répertoire images pour protéger l'ouverture de ce répertoire en ligne.
    De toute façon, c'est clair, celui qui s'identifie pourra connaître le nom de l'image ouverte...et aprés ?
    Mais impossible pour le/les noms des autres contenus de ce répertoire sauf pour ceux qui seraient devins

    Maintenant, je ne connais pas l'objectif de ton applic, mais si tu veux, par exemple, associer une image à un utilisateur unique, rien ne t'empêche de mettre cette variable [image] en session au moment de l'identification.
    En association avec l'id ou le nom de l'utilisateur bien sûr.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alain31tl Voir le message
    Evidemment, et en plus :
    ++ pour toi l' Ami

Discussions similaires

  1. Comment prévoir une durée de session avec htaccess ?
    Par PierreR75 dans le forum Sécurité
    Réponses: 2
    Dernier message: 23/12/2009, 09h14
  2. sessions et .htaccess
    Par lebonvieuxnovice dans le forum Sécurité
    Réponses: 0
    Dernier message: 08/09/2009, 05h28
  3. Sessions et htaccess
    Par tibom dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2008, 16h13
  4. perte de session avec htaccess
    Par wehtam dans le forum Langage
    Réponses: 1
    Dernier message: 29/08/2008, 22h52
  5. Sessions Apache, htaccess et PHP.
    Par Invité dans le forum Apache
    Réponses: 2
    Dernier message: 31/05/2007, 10h27

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