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 :

Lecture video dans root impossible


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut Lecture video dans root impossible
    Bonjour à toutes et à tous,

    Le code que je vais montrer fait suite à ce post la :
    https://www.developpez.net/forums/d2.../#post12070841

    Le code fonctionne bien dans des répertoires classiques non protégés.
    Afin de limiter l'accès à ces vidéos, j'ai fait un test en plaçant une video à la racine dans un dossier.

    A ce moment, le code n'est plus capable de lire la vidéo.
    J'ai réalisé des tests avec des fichiers php basique : fichier contenant du texte, placé dans root, et que je viens inclure, cela fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo "he je viens du répertoire racine";?>
    Du coup ce n'est pas un problème de chemin.
    Je penche plus sur le fait que le code est parcouru, mais comme on est dans un dossier protégé par nature, il n'arrive pas à lire la vidéo.
    Des idées sur comment faire ?

    CODE DE LA PAGE OU LA VIDEO SERA AFFICHEE
    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();
    /*
    Ici pour l'exemple je défini la variable de session
    Normalement on ne devrait vérifier que son existence puisqu'elle est définie dans le formulaire d'authentification
    */
    $_SESSION['user'] = 1;
    ?>
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Document sans nom</title>
    </head>
     
    <body>
    <div>
    Test lecture du fichier "ma-video.mp4" situé dans le dossier VIDEO
    </div>
    <video controls width="320">
      <source src="lecture_video.php?file=VIDEO/ma-video.mp4" type="video/mp4" />
    </video>
    </body>
    </html>
    CODE DE LA PAGE QUI LIRA LA VIDEO :
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    <?php
    session_start();
    // Si la session n'est pas définie on sort
    if(!isset($_SESSION['user'])) exit();
     
    // Récupère la variable get file (chemin vers l'image)
    $file = isset($_GET['file'])? $_GET['file'] : null;
     
    // Récupère l'extension
    $extension = isset($file) ? pathinfo($file,PATHINFO_EXTENSION) : null;
     
    if(is_file($file) && $extension == 'mp4') {
    	/*
    	https://gist.github.com/kicktv/4239c499101494538d384ce7995bb1af
    	// php stream video to browser 
    	// this script supports Video of forward and backward movement
    	// It does not support remote link For video
    	*/
     
    	$file = $file;
    	$fp = @fopen($file, 'rb');
     
    	$size = filesize($file); // File size
    	$length = $size;           // Content length
    	$start = 0;               // Start byte
    	$end = $size - 1;       // End byte
     
    	header('Content-type: video/mp4');
    	//header("Accept-Ranges: 0-$length");
    	header("Accept-Ranges: bytes");
    	if (isset($_SERVER['HTTP_RANGE'])) {
    		$c_start = $start;
    		$c_end = $end;
     
    		list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
    		if (strpos($range, ',') !== false) {
    			header('HTTP/1.1 416 Requested Range Not Satisfiable');
    			header("Content-Range: bytes $start-$end/$size");
    			exit;
    		}
    		if ($range == '-') {
    			$c_start = $size - substr($range, 1);
    		} else {
    			$range = explode('-', $range);
    			$c_start = $range[0];
    			$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
    		}
    		$c_end = ($c_end > $end) ? $end : $c_end;
    		if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) {
    			header('HTTP/1.1 416 Requested Range Not Satisfiable');
    			header("Content-Range: bytes $start-$end/$size");
    			exit;
    		}
    		$start = $c_start;
    		$end = $c_end;
    		$length = $end - $start + 1;
    		fseek($fp, $start);
    		header('HTTP/1.1 206 Partial Content');
    	}
    	header("Content-Range: bytes $start-$end/$size");
    	header("Content-Length: " . $length);
     
    	$buffer = 1024 * 8;
    	while (!feof($fp) && ($p = ftell($fp)) <= $end) {
     
    		if ($p + $buffer > $end) {
    			$buffer = $end - $p + 1;
    		}
    		set_time_limit(0);
    		echo fread($fp, $buffer);
    		flush();
    	}
     
    	fclose($fp);
    	exit();
    }
    ?>
    EDIT : Je viens de faire un test en forçant le téléchargement de la vidéo qui se situe dan un répertoire racine.
    . Deux choses se passent :
    1 - Message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Not Found
     
    The requested URL was not found on this server.
    2 - Quand je regarde l'URL, on dirait qu'une redirection est réalisée par ma solution d'herbergement puisque je donne une URL de téléchargement de type :
    .root
    .. www
    .. dossier_ou_se_situe_video <- Mon lien pointe dans ce répertoire

    Et quand je regarde l'URL en erreur, le chemin indiqué est le suivant
    .rootge
    .. www <- je regarde à ce niveau s'il y a un dossier video (www/dossier_ou_se_situe_video)
    .. dossier_ou_se_situe_video

    A mon avis c'est pour cela que la lecture de la video plante, si une redirection est faite en automatique par ma solution d'hébergement pour les scripts qui lisent/ télécharge des fichiers... alors la direction de lecture n'est plus la bonne...

    Solution : Placer les videos dans un sous dossier de www mais protéger ce dossier avec .htaccess ?
    Problème : je ne sais pas encore comment utiliser ceci et si je le fais, puisque le dossier sera protégé, j'aurai le même problème pour le lire non ?

    D'avance merci pour vos retours à ce sujet

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 681
    Par défaut
    déjà retirez les "@" du code cela peut cacher un message d'erreur.

    ensuite essayez de construire le chemin absolu vers le fichier vidéo en utilisant la constante __DIR__, peut-être que le script php ne trouve pas le fichier à cause de ça.

    Citation Envoyé par BOU59000 Voir le message
    Je penche plus sur le fait que le code est parcouru, mais comme on est dans un dossier protégé par nature, il n'arrive pas à lire la vidéo.
    si j'ai bien compris l'autre discussion, c'est l'accès par le serveur http qui est bloqué donc ça ne change rien au code php qui a accès aux fichiers de l'hébergement directement.

    d'ailleurs si vous passez un chemin d'accès au fichier par un paramètre de la page, il est peut-être possible d'utiliser cela pour lire tous les fichiers de l'hébergement même avec le test de l'extension. donc une fois que tout fonctionne comme vous le souhaitez, n'oubliez pas d'étudier ce point pour être sur qu'il n'y ait pas de faille d'accès.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    Bonjour mathieu

    J'ai édité mon message pendant que tu répondais.

    Effectivement la faille d'accès me fait peur car en parcourant la documentation, il est précisé qu'un utilisateur malin peut se servir de ce genre de code pour accéder à d'autres éléments.
    La soucis, c'est que je ne sais pas trop comment faire pour boucher des failles (à partir du moment où je galère déjà pour mettre mon système en place ).

    si j'ai bien compris l'autre discussion, c'est l'accès par le serveur http qui est bloqué
    Pour te dire, rien que cette partie la je n'ai pas tout compris

    Donc si je comprends bien, si je place les vidéos dans un répertoire à la racine (et que mon code fonctionne, c'est pas encore gagné...), un utilisateur pourra accéder lui aussi au répertoire racine en se servant de l'autorisation donnée à PHP ?
    Mon code serait une sorte de cheval de Troie ?

    Si je place les vidéos dans un fichier situé dans www, j'imagine que les dossiers au dessus de www, mais le principe reste le même, si mon code PHP lis ce qui est dans www, tout ce qui est dans www est potentiellement exposé, est ce cela ?

    Du coup, où placer ces éléments pour donner le moins d'accès possible en cas de faille ?

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 681
    Par défaut
    je dirais que dans votre cas le mieux est de mettre les fichiers vidéos dans un répertoire hors www comme cela vous n'aurez rien d'autre à faire pour empêcher le serveur http (apache) de les mettre à disposition avec un lien direct.

    au sujet du problème de sécurité, je viens de revoir l'autre discussion et vous disiez que les informations des fichier sont dans une base de données. vous avez donc pour chaque fichier vidéo un identifiant unique que vous pouvez utiliser en paramètre de la page.
    à partir de ce paramètre vous allez d'abord vérifier que l'identifiant correspond bien à une ligne dans la table. ensuite vous vérifiez que l'utilisateur connecté a bien le droit d'accéder à ce fichier. et à partir de là, vous lisez le nom du fichier dans la table, il s'agit d'une valeur que vous avez saisie vous-même donc vous pouvez faire confiance dans cette données pour lire le fichier avec le code php et l'envoyer au navigateur.

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Par défaut
    Je vous remercie pour votre réponse.
    Je décortique le tout en bloc car ce qui est naturel pour vous est encore bien compliqué pour moi.

    A - DIR

    Je ne connaissais pas __DIR__, j'ai regardé sur internet et j'ai cru comprendre qu'il prend la position d'un fichier pour s'en servir si on veut en inclure un autre.
    Exemple
    .www
    ..index.php
    ..repertoire1
    .... fichier1
    .... fichier 2

    Si j'appelle fichier 1 depuis index (via include) et que fichier 1 inclu fichier 2, je peux me servir de __DIR__ pour inclure fichier 2.

    Dans la théorie, on va dire que je comprends le principe.
    Dans la pratique, j'ai essayé d'utiliser __DIR__ et cela ne fonctionne pas.
    Soit je n'ai pas compris
    Soit ma manière de l'écrire est mauvaise.

    Imaginons que j'ai ceci
    .root

    ..www
    ...index.php

    ..dossier_video
    ...video1.php
    ...video1.mp4

    J'ouvre index.php, index.php fait appel à video.php qui lui va me donner video.mp4.
    Du coup je retrouve dans index.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include ("../dossier_video/video1.php");
    Puisque video1.php est dans le même dossier que video1.mp4, c'est à ce moment la que j'utilise __DIR__, est ce bien cela ?

    Si c'est cela, j'imagine que __DIR__ doit se placer au niveau de cette ligne la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Récupère la variable get file (chemin vers l'image)
    $file = isset($_GET['file'])? $_GET['file'] : null;
    Mais je ne vois pas trop ou le placer vu que je suis dans un $_GET ici pour l'emplacement du fichier.

    B - répertoire racine
    je dirais que dans votre cas le mieux est de mettre les fichiers vidéos dans un répertoire hors www comme cela vous n'aurez rien d'autre à faire pour empêcher le serveur http (apache) de les mettre à disposition avec un lien direct.
    Si je reprends mon petit schéma

    .root

    ..www
    ...index.php

    ..dossier_video => Puisque dossier_video est un répertoire a cote de www (en dehors), il est donc naturellement protégé, c'est bien cela ?
    ...video1.php
    ...video1.mp4

    C - J'ai placé effectivement des variables qui permettent d'accepter ou non la lecture d'un fichier.
    En fait ce qui me préoccupe c'est que tant que le répertoire lui même n'est pas protégé, il est toujours possible de by-passer les choses.
    Par exemple, si j'inclus dans index.php le code video.php qui lui doit me donner accès ou non à la vidéo.
    Le premier utilisateur sera obligé d'avoir un lien de la aprt de mon site, en revanche, si le répertoire n'est pas protégé, il pourra accéder au lien en direct.
    L'utilisateur 1 aura en effet une URL de ce type index.php?video=mavideo
    Si l'utilisateur 1 ouvre la video dans un autre onglet, il aura l'arborescence index.php/dossier_video/video=mavideo.
    Si le lien est partagé tel quel, le script contenu dans video1.php va stopper la lecture (si tu n'as pas les accés tu ne lis pas. )
    En revanche, si on supprime video = et que l'on remplace par le nom de la video, le lien peut etre partagé index.php/dossier_video/mavideo.
    C'est la raison pour laquelle le dossier lui même ne doit être lu que par php.
    Et c'est pour cela que je voulais placer mes videos dans un répertoire situé directement sous .root (hors www).
    Mais je n'arrive pas à les lire avec le code de la vidéo placé ci-dessus (et maintenant j'ai peur que s'il fonctionne un utilisateur avec un super niveau peut trouver une faille dedans et avoir accès a tout )

    Merci

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 681
    Par défaut
    la constante DIR contient le chemin du répertoire du fichier php dans lequel elle est utilisée.
    donc dans /var/dossier_video/video1.php vous allez avoir quelque chose comme cela :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $nom_fichier = $ligne_video["nom_fichier"]; // contient "fichier.mp4" lu dans la base de données
     
    // __DIR__ vaut "/var/dossier_video"
    $chemin_fichier = __DIR__ . "/$nom_fichier"; // $chemin_fichier vaut "/var/dossier_video/fichier.mp4"

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

Discussions similaires

  1. [Débutant] Lecture vidéo dans une fenêtre Windows 10
    Par BasicZX81 dans le forum VB.NET
    Réponses: 2
    Dernier message: 13/08/2015, 17h17
  2. lecture vidéo dans PP sur un autre PC
    Par Fener dans le forum Powerpoint
    Réponses: 4
    Dernier message: 14/06/2010, 10h46
  3. lectures videos dans powerpoint
    Par marquis3 dans le forum Powerpoint
    Réponses: 2
    Dernier message: 18/07/2009, 14h35
  4. Problème de lecture vidéo dans PPS
    Par Claude_Azoulai dans le forum Powerpoint
    Réponses: 1
    Dernier message: 15/07/2009, 18h19
  5. Fluidifier la lecture Vidéo dans un TMediaPlayer
    Par kurul1 dans le forum C++Builder
    Réponses: 15
    Dernier message: 22/05/2007, 13h57

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