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 :

Liens "temporaires"


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut Liens "temporaires"
    Bonsoir,

    Je cherche une methode(Génération de liens temporaires par exemple) pour protéger mes fichiers contre un téléchargement sans visiter mon siteweb. En fait, j'ai trouvé des scripts mais ils concernent la protection contre la non-identification (Le user doit s'enregistrer pour télécharger) et c'est pas ce que je cherche.

    merci d'avance.

  2. #2
    Expert confirmé
    Avatar de 12monkeys
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4 093
    Par défaut
    Hello,

    Tu peut mettre en place une page sur laquelle se trouvent des liens qui vont forcer le téléchargement de tes fichiers mais en vérifiant avant que la personne vient de ton site par 'HTTP_REFERER' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (!empty($_SERVER['HTTP_REFERER'])) {
        $pge_preced = $_SERVER['HTTP_REFERER'];
    }
     
    if (strpos($pge_preced, 'ta_page_de_telechargement.php') === FALSE) {
        header('Location: interdit.php');
    }
    Sauf que 'HTTP_REFERER' n'est pas une valeur de confiance : http://fr3.php.net/manual/fr/reserved.variables.php

    Autrement tu peut ajouter une valeur aléatoire sur ton chemin ou fichier que tu sauvegarde dans la BDD et que tu récupère quand quelqu'un visite ta page de téléchargement...

  3. #3
    Membre averti
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Merci pour ta réponse.
    En fait ce qui m'a pousser à demander une telle question c'est ce que je vois dans les sites de streaming qui propose de télécharger les videos avec des liens qui ne marche qu'une seul fois.
    Exemple: http://divx-105.vo.llnwd.net/stage6vid/1937017.divx?e=1204070173&h=1f2b539669bfa34c7bf1d69525c6c342/.divx

    Quelqu'un à une idée comment ca été créé?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Par défaut
    Bonsoir,
    créez une table `autorisations` et sur la page qui est censée contenir le lien, générez une autorisation pour le fichier (celui doit être dans un répertoire inaccessible via le protocole HTTP direct), puis via la lien contenant uniquement l'autorisation, confirmez ou affirmez la validité en vous référant à la table `autorisations` et aux options que vous voulez.

    Petit exemple schématique (3 reprises du téléchargement max + validité de 24h) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
      // j'ai sauté volontairement toutes les fonctions
     
      $fichier = 'MesVacances.avi';
     
      $autorisation = md5(mt_rand(0,999999999));
     
      $create = "INSERT INTO `autorisations` VALUES ('$autorisation', '$fichier', NOW())";
     
      echo '<a href="download.php?a=$autorisation">téléchargez la vidéo!!!</a>';
     
    ?>
    Code download.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
    <?php
     
      // j'ai sauté volontairement toutes les fonctions
     
      $a = $_GET['a'];
     
      $check = "SELECT `fichier`, `moment`, `total` FROM `autorisations` WHERE `autorisation_code` = '$a'";
     
      if (mysql_num_rows($res) === 1)
      {
     
        // options 3 relances max (total < 3) et validité de 24h (moment+86400 > time()) 
        if ($total < 3 && (moment+86400) > time())
        {
          //on lance le téléchargement
          $mod = "UPDATE `autorisations` SET total = total+1 WHERE autorisation_code = '$a'";
        }
        else exit('votre autorisation n\'est plus valide, veuillez en créer une nouvelle');
     
      }
      exit('cette autorisation n\'existe pas');
     
    ?>

    Cordialement,
    DaRiaN.

    Edit: c'est schématique, il ne fonctionne pas ce code, mais si vous voulez que je vous montre un exemple fonctionnel, dites le moi.

  5. #5
    Membre averti
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Citation Envoyé par DaRiaN Voir le message
    Edit: c'est schématique, il ne fonctionne pas ce code, mais si vous voulez que je vous montre un exemple fonctionnel, dites le moi.
    Oui ca sera mieux pour un newbie en php comme moi et pour les autres newbies qui vont passer sur le forum.

    Merci beaucoup.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Par défaut
    Le code a été simplifié au maximum :

    Code MySQL : 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
    CREATE TABLE `fichiers` 
    (
    `fichier_id` SMALLINT(3) UNSIGNED AUTO_INCREMENT NOT NULL, 
    `fichier_nom` VARCHAR(25) NOT NULL, 
    PRIMARY KEY (`fichier_id`)
    )
    ;
     
    INSERT INTO `fichiers` (`fichier_nom`)
     VALUES ('mes-vacances-japon.avi'), ('l-autoroute.avi'), ('je-t-aime-caro.avi');
     
    CREATE TABLE `autorisations` 
    (
    `autorisation_id` CHAR(32) NOT NULL, 
    `autorisation_moment` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `autorisation_relance` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, 
    `fichier_id` SMALLINT(3) UNSIGNED NOT NULL, 
    PRIMARY KEY (`autorisation_id`), 
    INDEX (`fichier_id`)
    )
    ;

    Code list.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
    <?php
     
      if
      (
        !mysql_connect('localhost', 'darian', 'mdp') ||  
        !mysql_select_db('base')                     ||
        !$res = mysql_query('SELECT fichier_id, fichier_nom FROM fichiers ORDER BY fichier_nom')
      )
      die(mysql_error());
     
      if (mysql_num_rows($res) > 0)    
       while (list($id, $nom) = mysql_fetch_row($res))
        echo "<a href=\"file.php?id=$id\">$nom</a><br \>\n";
      else echo 'Il n`y a aucun fichier!';	
     
    ?>

    Code file.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
    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
    <?php
     
      function autorisation($max = 8, $autorisation = '')
      {  
        $char = 'abcdefghijklmnopqrstuvwxyz';
        $char .= strtoupper($char);
        $char .= '0123456789';
        $char = str_shuffle($char);
     
        $x = strlen($char)-1;
     
        for ($i = 0; $i < $max; $i++) $autorisation .= $char[mt_rand(0, $x)];
     
        return md5($autorisation);   
      }
     
      if (isset($_GET['id'])) $id = intval($_GET['id']);
      else die('Aucun fichier n\'a été sélectionné.');
     
      if
      (
        !mysql_connect('localhost', 'darian', 'mdp') ||  
        !mysql_select_db('base')                     ||
        !$res = mysql_query("SELECT fichier_nom FROM fichiers WHERE fichier_id = $id")
      )
      die(mysql_error());
     
      if (mysql_num_rows($res) != 1) die('Ce fichier n\'existe pas/plus sur le serveur!');
      else $filename = mysql_result($res, 0);
     
      $x = 0;
     
      do
      {  
     
        $x++;
        if ($x === 4) die(mysql_error());  
     
        $autorisation = autorisation();
     
        $req = "INSERT INTO autorisations"
    	  ." (autorisation_id, fichier_id)"
    	  ." VALUES ('$autorisation', $id)";	
     
      }
      while (!mysql_query($req));
     
      echo "<a href=\"download.php?id=$autorisation\">Cliquez ici pour télécharger '$filename'</a>";
     
    ?>

    Code download.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
    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
    <?php
     
      if (isset($_GET['id']) && preg_match('`^[a-z0-9]{32}$`', $_GET['id'])) $id = $_GET['id'];
      else die('L\identifiant du fichier est incorrect!');
     
      $req = 'SELECT fichier_nom, UNIX_TIMESTAMP(autorisation_moment), autorisation_relance'
            .' FROM autorisations t1'
            .'  LEFT JOIN fichiers t2 ON t2.fichier_id = t1.fichier_id '
            ." WHERE t1.autorisation_id = '$id'";
     
      if
      (
        !mysql_connect('localhost', 'darian', 'mdp') ||  
        !mysql_select_db('base')                     ||
        !$res = mysql_query($req)
      )
      die(mysql_error());
     
      if (mysql_num_rows($res) != 1) die('L\identifiant du fichier est incorrect!');
      else
      {  
        list($fichier, $moment, $relance) = mysql_fetch_row($res);
     
        if ($fichier === NULL || ($moment+86400) < time() || $relance == 3)
        {        
          if ($fichier === NULL) $erreur = 'Ce fichier n\'existe pas/plus sur le serveur!';
          else if ($moment+86400 < time()) $erreur = 'Votre autorisation est périmée!';
          else if ($relance == 3) $erreur = 'Vous avez dépassé le nombre de relance autorisée!';
     
          $req = "DELETE FROM autorisations WHERE autorisation_id = '$id'";
     
          mysql_query($req) or die(mysql_error());
     
          die($erreur);
        }
        else
        {
     
          // remplacez l'echo suivant par le script pour forcer le téléchargement
          echo "Lancement du téléchargement pour \"$fichier\".";
     
          $req = 'UPDATE autorisations'
                .' SET autorisation_relance = autorisation_relance+1'
                ." WHERE autorisation_id = '$id'";
     
          mysql_query($req) or die(mysql_error());	  
     
        }		
     
      }
     
    ?>

    Je pense que vous arriverez à tout comprendre et à adapter ces scripts à votre site. Attention, je n'ai pas codé la partie "téléchargement" et je n'irais pas plus loin. Je ne suis pas ici pour travailler à votre place, par contre, je reste à votre disposition pour vous expliquer le code.

    Bonne courage

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

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